From d9d289896ca06e71fc10f162fa5341cb0cd38df6 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Tue, 18 Aug 2020 08:04:43 +0200 Subject: [PATCH 001/123] ENH: Add GDALRPCTransformer, an adapter to GDAL RPC Transformer --- .../include/otbGDALRPCTransformer.h | 193 ++++++++++++++++++ .../Adapters/GdalAdapters/src/CMakeLists.txt | 1 + .../src/otbGDALRPCTransformer.cxx | 92 +++++++++ .../Adapters/GdalAdapters/test/CMakeLists.txt | 7 + .../test/otbGDALRPCTransformerTest.cxx | 115 +++++++++++ .../test/otbGdalAdaptersTestDriver.cxx | 1 + 6 files changed, 409 insertions(+) create mode 100644 Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h create mode 100644 Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx create mode 100644 Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx diff --git a/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h b/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h new file mode 100644 index 0000000000..70565915dc --- /dev/null +++ b/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h @@ -0,0 +1,193 @@ +/* + * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef otbGDALRPCTransformer_h +#define otbGDALRPCTransformer_h + +#include "OTBGdalAdaptersExport.h" + +#include +#include + +#include "gdal_alg.h" +#include "cpl_string.h" + +namespace otb +{ +/** + * \class GDALRPCTransformer + * \brief This class is a wrapper around GDALCreateRPCTransformer and GDALRPCTransform + * + * This class aims at manipulating RPC transformations within OTB, + * in a safe and easy way. + * + * To use this wrapper, one needs to call the constructor with the correct + * parameters. Then, one can set the options, and the threshold. Finally, + * one can call ForwardTransform or BackwardTransform, depending in the + * desired result. + * + * The parameters provided to the constructor are those found in the + * RPCParam structure defined in the otbGeometryMetadata.h file. They + * are quite similar to what can be found in GDALRPCInfo. + * + * \ingroup OTBGdalAdapters + */ + +class OTBGdalAdapters_EXPORT GDALRPCTransformer +{ +public: + /** + * Build a GDALRPCTransformer + * + * The parameters describe the RPC model. They can be found in the + * RPCParam structure defined in the otbGeometryMetadata.h file. They + * are quite similar to what can be found in GDALRPCInfo. See also + * http://geotiff.maptools.org/rpc_prop.html + * + */ + GDALRPCTransformer(double LineOffset, double SampleOffset, double LatOffset, double LonOffset, double HeightOffset, + double LineScale, double SampleScale, double LatScale, double LonScale, double HeightScale, + const double LineNum[20], const double LineDen[20], const double SampleNum[20], const double SampleDen[20]); + + /** + * Set additional options to the transformer + * + *
    + *
  • RPC_HEIGHT: a fixed height offset to be applied to all points passed + * in. In this situation the Z passed into the transformation function is + * assumed to be height above ground, and the RPC_HEIGHT is assumed to be + * an average height above sea level for ground in the target scene.
  • + * + *
  • RPC_HEIGHT_SCALE: a factor used to multiply heights above ground. + * Useful when elevation offsets of the DEM are not expressed in meters.
  • + * + *
  • RPC_DEM: the name of a GDAL dataset (a DEM file typically) used to + * extract elevation offsets from. In this situation the Z passed into the + * transformation function is assumed to be height above ground. This option + * should be used in replacement of RPC_HEIGHT to provide a way of defining + * a non uniform ground for the target scene
  • + * + *
  • RPC_DEMINTERPOLATION: the DEM interpolation ("near", "bilinear" or "cubic"). + * Default is "bilinear".
  • + * + *
  • RPC_DEM_MISSING_VALUE: value of DEM height that must be used in case + * the DEM has nodata value at the sampling point, or if its extent does not + * cover the requested coordinate. When not specified, missing values will cause + * a failed transform.
  • + * + *
  • RPC_DEM_SRS: (GDAL >= 3.2) WKT SRS, or any string recognized by + * OGRSpatialReference::SetFromUserInput(), to be used as an override for DEM SRS. + * Useful if DEM SRS does not have an explicit vertical component.
  • + * + *
  • RPC_DEM_APPLY_VDATUM_SHIFT: whether the vertical component of a compound + * SRS for the DEM should be used (when it is present). This is useful so as to + * be able to transform the "raw" values from the DEM expressed with respect to + * a geoid to the heights with respect to the WGS84 ellipsoid. When this is + * enabled, the GTIFF_REPORT_COMPD_CS configuration option will be also set + * temporarily so as to get the vertical information from GeoTIFF + * files. Defaults to TRUE. (GDAL >= 2.1.0)
  • + * + *
  • RPC_PIXEL_ERROR_THRESHOLD: overrides the dfPixErrThreshold parameter, ie + * the error (measured in pixels) allowed in the + * iterative solution of pixel/line to lat/long computations (the other way + * is always exact given the equations). (GDAL >= 2.1.0)
  • + * + *
  • RPC_MAX_ITERATIONS: maximum number of iterations allowed in the + * iterative solution of pixel/line to lat/long computations. Default value is + * 10 in the absence of a DEM, or 20 if there is a DEM. (GDAL >= 2.1.0)
  • + * + *
  • RPC_FOOTPRINT: WKT or GeoJSON polygon (in long / lat coordinate space) + * with a validity footprint for the RPC. Any coordinate transformation that + * goes from or arrive outside this footprint will be considered invalid. This + * is useful in situations where the RPC values become highly unstable outside + * of the area on which they have been computed for, potentially leading to + * undesirable "echoes" / false positives. This requires GDAL to be built against + * GEOS.
  • + *
+ * + * \param Name a string containing the name of the option + * \param Value a string containing the value of the option + * + */ + void SetOption(std::string Name, std::string Value); + + /** + * Set the error (measured in pixels) allowed in the + * iterative solution of pixel/line to lat/long computations (the other way + * is always exact given the equations). Starting with GDAL 2.1, this may also + * be set through the RPC_PIXEL_ERROR_THRESHOLD transformer option. + * If a negative or null value is provided, then this defaults to 0.1 pixel. + * + * \param PixErrThreshold the new value of the error + * + */ + void SetPixErrThreshold(double PixErrThreshold); + + /** + * Compute a forward transformation + * + * This method performs a transformation from column/row to long/lat/height space. + * It can work with an arbitrary number of points. + * + * \param x the X coordinate of the points to convert + * \param y the Y coordinate of the points to convert + * \param z the Z coordinate of the points to convert + * \param nPointCount the number of points to convert + * \return true if all points were correctly transformed + * + */ + bool ForwardTransform(double* x, double* y, double* z, int nPointCount=1); + + /** + * Compute a backward transformation + * + * This method performs a transformation from long/lat/height to column/row space. + * It can work with an arbitrary number of points. + * + * \param x the X coordinate of the points to convert + * \param y the Y coordinate of the points to convert + * \param z the Z coordinate of the points to convert + * \param nPointCount the number of points to convert + * \return true if all points were correctly transformed + * + */ + bool BackwardTransform(double* x, double* y, double* z, int nPointCount=1); + +protected: + /** + * Regenerate the transformer + * + * Called when performing a transformation and some options were modified. + */ + void Update(); + +private: + /** Used to know if Update is required after a change in the options */ + bool m_Modified = true; + /** The RPC model */ + GDALRPCInfo m_GDALRPCInfo; + /** The options */ + char ** m_Options = nullptr; + /** The error allowed in the iterative solution */ + double m_PixErrThreshold = 0.1; + /** The transformer arguments */ + void * m_TransformArg = nullptr; +}; +} +#endif diff --git a/Modules/Adapters/GdalAdapters/src/CMakeLists.txt b/Modules/Adapters/GdalAdapters/src/CMakeLists.txt index 01ef351268..2d6d9341f5 100644 --- a/Modules/Adapters/GdalAdapters/src/CMakeLists.txt +++ b/Modules/Adapters/GdalAdapters/src/CMakeLists.txt @@ -32,6 +32,7 @@ set(OTBGdalAdapters_SRC otbOGRExtendedFilenameToOptions.cxx otbSpatialReference.cxx otbCoordinateTransformation.cxx + otbGDALRPCTransformer.cxx ) add_library(OTBGdalAdapters ${OTBGdalAdapters_SRC}) diff --git a/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx b/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx new file mode 100644 index 0000000000..fc990bdc3a --- /dev/null +++ b/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "otbGDALRPCTransformer.h" + +namespace otb +{ +GDALRPCTransformer::GDALRPCTransformer(double LineOffset, double SampleOffset, double LatOffset, double LonOffset, double HeightOffset, + double LineScale, double SampleScale, double LatScale, double LonScale, double HeightScale, + const double LineNum[20], const double LineDen[20], const double SampleNum[20], const double SampleDen[20]) +{ + // Offsets + this->m_GDALRPCInfo.dfLINE_OFF = LineOffset; + this->m_GDALRPCInfo.dfSAMP_OFF = SampleOffset; + this->m_GDALRPCInfo.dfLAT_OFF = LatOffset; + this->m_GDALRPCInfo.dfLONG_OFF = LonOffset; + this->m_GDALRPCInfo.dfHEIGHT_OFF = HeightOffset; + // Scales + this->m_GDALRPCInfo.dfLINE_SCALE = LineScale; + this->m_GDALRPCInfo.dfSAMP_SCALE = SampleScale; + this->m_GDALRPCInfo.dfLAT_SCALE = LatScale; + this->m_GDALRPCInfo.dfLONG_SCALE = LonScale; + this->m_GDALRPCInfo.dfHEIGHT_SCALE = HeightScale; + // Coefficients + for (unsigned int i = 0 ; i < 20 ; ++i) + { + this->m_GDALRPCInfo.adfLINE_NUM_COEFF[i] = LineNum[i]; + this->m_GDALRPCInfo.adfLINE_DEN_COEFF[i] = LineDen[i]; + this->m_GDALRPCInfo.adfSAMP_NUM_COEFF[i] = SampleNum[i]; + this->m_GDALRPCInfo.adfSAMP_DEN_COEFF[i] = SampleDen[i]; + } +} + +void GDALRPCTransformer::SetOption(std::string Name, std::string Value) +{ + this->m_Options = CSLSetNameValue(this->m_Options, Name.c_str(), Value.c_str()); + this->m_Modified = true; +} + +void GDALRPCTransformer::SetPixErrThreshold(double PixErrThreshold) +{ + this->m_PixErrThreshold = PixErrThreshold; + this->m_Modified = true; +} + +void GDALRPCTransformer::Update() +{ + this->m_TransformArg = GDALCreateRPCTransformer(&this->m_GDALRPCInfo, false, this->m_PixErrThreshold, this->m_Options); + this->m_Modified = false; +} + +bool GDALRPCTransformer::ForwardTransform(double* x, double* y, double* z, int nPointCount) +{ + if (this->m_Modified) + this->Update(); + int success[nPointCount]; + GDALRPCTransform(this->m_TransformArg, false, nPointCount, x, y, z, success); + for(int* it{success} ; it < (success + nPointCount) ; ++it) + if (! *it) + return false; + return true; +} + +bool GDALRPCTransformer::BackwardTransform(double* x, double* y, double* z, int nPointCount) +{ + if (this->m_Modified) + this->Update(); + int success[nPointCount]; + GDALRPCTransform(this->m_TransformArg, true, nPointCount, x, y, z, success); + for(int* it{success} ; it < (success + nPointCount) ; ++it) + if (! *it) + return false; + return true; +} +} diff --git a/Modules/Adapters/GdalAdapters/test/CMakeLists.txt b/Modules/Adapters/GdalAdapters/test/CMakeLists.txt index 75a50079d1..362341908b 100644 --- a/Modules/Adapters/GdalAdapters/test/CMakeLists.txt +++ b/Modules/Adapters/GdalAdapters/test/CMakeLists.txt @@ -86,6 +86,7 @@ add_executable(otbGdalAdaptersTestDriver otbGdalAdaptersTestDriver.cxx otbSpatialReferenceTest.cxx otbCoordinateTransformationTest.cxx + otbGDALRPCTransformerTest.cxx ) target_link_libraries(otbGdalAdaptersTestDriver ${OTBGdalAdapters-Test_LIBRARIES}) @@ -97,3 +98,9 @@ otb_add_test(NAME TuSpatialReferenceTest otb_add_test(NAME TuOCoordinateTransformationTest COMMAND otbGdalAdaptersTestDriver otbCoordinateTransformationTest) + +otb_add_test(NAME TuGDALRPCTransformerTest + COMMAND otbGdalAdaptersTestDriver + otbGDALRPCTransformerTest + LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF} + ) diff --git a/Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx b/Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx new file mode 100644 index 0000000000..70b9c2cc61 --- /dev/null +++ b/Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "otbGDALRPCTransformer.h" +#include "otbMacro.h" +#include "otbImage.h" +#include "otbImageFileReader.h" +#include "otbImageMetadata.h" + +typedef otb::Image ImageType; +typedef otb::ImageFileReader ReaderType; + +int otbGDALRPCTransformerTest(int itkNotUsed(argc), char* argv[]) +{ + bool success = true; + + double LineOffset = 15834.0, SampleOffset = 13464.0, + LatOffset = -42.8607, LonOffset = 147.2588, HeightOffset = 300.0, + LineScale = 15834.0, SampleScale = 13464.0, + LatScale = 0.0715, LonScale = 0.0828, HeightScale = 970.0; + const double line_num_coeff[20] = { + -0.000539636886315094, 0.00262771165447159, -1.00287836503009, -0.0340303311076584, 0.00523658598538616, + 0.00210057328569037, 0.00311664695421511, 0.000406267962891555, -0.00550089873884607, 5.26202553862825e-05, + 2.5958707865627e-06, -2.23632198653199e-06, 2.02822452334703e-05, -5.24009408417096e-06, 2.16913023637956e-05, + -2.36002554032361e-05, 1.56703932477487e-06, -6.14095576183939e-06, 1.8422191786661e-05, 2.01615774485329e-07}; + const double line_den_coeff[20] = { + 1, -0.00520769693945429, 0.00549138470185778, -0.00472718007439368, -2.02057365543208e-05, + 8.39509604990839e-06, -3.43728317291176e-05, -1.94598141718645e-05, 2.35660616018416e-05, 3.71653924834455e-06, + 7.08406853351595e-08, -5.72002373463043e-09, 8.71363385561163e-09, -4.39082343385483e-09, 1.39161295297537e-08, + -1.24914964124471e-08, 4.6171143198849e-08, 1.70067569381897e-08, -2.37449991316111e-08, 9.05460084990073e-10}; + const double samp_num_coeff[20] = { + 0.00121386429106107, 1.0047652205584, 0.00363040578479236, -0.033702055558379, 0.00665808526532754, + -0.0036225246184886, -0.000251174639124558, -0.00523232964739848, 1.74629130199178e-05, 0.000131049715749837, + -2.8029900276216e-05, -1.95273546561053e-05, 2.91977037724833e-05, 2.78736117374265e-07, -2.64005759423042e-05, + 7.08277764663844e-08, 1.12211574945991e-06, 1.15330773275834e-06, 7.15463416011193e-07, -2.42741993962372e-08}; + const double samp_den_coeff[20] = { + 1, -0.00520769693945429, 0.00549138470185778, -0.00472718007439368, -2.02057365543208e-05, + 8.39509604990839e-06, -3.43728317291176e-05, -1.94598141718645e-05, 2.35660616018416e-05, 3.71653924834455e-06, + 7.08406853351595e-08, -5.72002373463043e-09, 8.71363385561163e-09, -4.39082343385483e-09, 1.39161295297537e-08, + -1.24914964124471e-08, 4.6171143198849e-08, 1.70067569381897e-08, -2.37449991316111e-08, 9.05460084990073e-10}; + + otb::GDALRPCTransformer transformer(LineOffset, SampleOffset, LatOffset, LonOffset, HeightOffset, + LineScale, SampleScale, LatScale, LonScale, HeightScale, + line_num_coeff, line_den_coeff, samp_num_coeff, samp_den_coeff); + + // Test ForwardTransform + double x = 20, y = 10, z = 0; + double exp_x = 147.1753248795781, exp_y = -42.78881952208293, exp_z = 0.0; + if(!transformer.ForwardTransform(&x, &y, &z)) + { + std::cout << "ForwardTransform failed, returned False." << '\n'; + success = false; + } + if (!itk::Math::FloatAlmostEqual(x, exp_x)) + { + std::cout << "Bad value for latitude. Expected " << exp_x << " but computed " << x << "\n"; + success = false; + } + if (!itk::Math::FloatAlmostEqual(y, exp_y)) + { + std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << y << "\n"; + success = false; + } + if (!itk::Math::FloatAlmostEqual(z, exp_z)) + { + std::cout << "Bad value for height. Expected " << exp_z << " but computed " << z << "\n"; + success = false; + } + + // Test BackwardTransform + x = 147.1753248795781; y = -42.78881952208293; z = 0; + exp_x = 20.01139515217801; exp_y = 9.984517889590279; exp_z = 0.0; + if(!transformer.BackwardTransform(&x, &y, &z)) + { + std::cout << "ForwardTransform failed, returned False." << '\n'; + success = false; + } + if (!itk::Math::FloatAlmostEqual(x, exp_x)) + { + std::cout << "Bad value for latitude. Expected " << exp_x << " but computed " << x << "\n"; + success = false; + } + if (!itk::Math::FloatAlmostEqual(y, exp_y)) + { + std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << y << "\n"; + success = false; + } + if (!itk::Math::FloatAlmostEqual(z, exp_z)) + { + std::cout << "Bad value for height. Expected " << exp_z << " but computed " << z << "\n"; + success = false; + } + + if (success) + return EXIT_SUCCESS; + else + return EXIT_FAILURE; +} diff --git a/Modules/Adapters/GdalAdapters/test/otbGdalAdaptersTestDriver.cxx b/Modules/Adapters/GdalAdapters/test/otbGdalAdaptersTestDriver.cxx index 7857c16636..634126fa03 100644 --- a/Modules/Adapters/GdalAdapters/test/otbGdalAdaptersTestDriver.cxx +++ b/Modules/Adapters/GdalAdapters/test/otbGdalAdaptersTestDriver.cxx @@ -24,4 +24,5 @@ void RegisterTests() { REGISTER_TEST(otbSpatialReferenceTest); REGISTER_TEST(otbCoordinateTransformationTest); + REGISTER_TEST(otbGDALRPCTransformerTest); } -- GitLab From e9f291296585e5ce2c2b8701a83ff140fdf22d95 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Fri, 21 Aug 2020 09:35:37 +0200 Subject: [PATCH 002/123] REFACT: Rename BackwardTransform to InverseTransform --- Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h | 4 ++-- Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx | 2 +- .../Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h b/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h index 70565915dc..cb516cfffa 100644 --- a/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h +++ b/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h @@ -155,7 +155,7 @@ public: bool ForwardTransform(double* x, double* y, double* z, int nPointCount=1); /** - * Compute a backward transformation + * Compute an inverse transformation * * This method performs a transformation from long/lat/height to column/row space. * It can work with an arbitrary number of points. @@ -167,7 +167,7 @@ public: * \return true if all points were correctly transformed * */ - bool BackwardTransform(double* x, double* y, double* z, int nPointCount=1); + bool InverseTransform(double* x, double* y, double* z, int nPointCount=1); protected: /** diff --git a/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx b/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx index fc990bdc3a..8caf6c6653 100644 --- a/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx +++ b/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx @@ -78,7 +78,7 @@ bool GDALRPCTransformer::ForwardTransform(double* x, double* y, double* z, int n return true; } -bool GDALRPCTransformer::BackwardTransform(double* x, double* y, double* z, int nPointCount) +bool GDALRPCTransformer::InverseTransform(double* x, double* y, double* z, int nPointCount) { if (this->m_Modified) this->Update(); diff --git a/Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx b/Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx index 70b9c2cc61..c08dd464df 100644 --- a/Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx +++ b/Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx @@ -84,10 +84,10 @@ int otbGDALRPCTransformerTest(int itkNotUsed(argc), char* argv[]) success = false; } - // Test BackwardTransform + // Test InverseTransform x = 147.1753248795781; y = -42.78881952208293; z = 0; exp_x = 20.01139515217801; exp_y = 9.984517889590279; exp_z = 0.0; - if(!transformer.BackwardTransform(&x, &y, &z)) + if(!transformer.InverseTransform(&x, &y, &z)) { std::cout << "ForwardTransform failed, returned False." << '\n'; success = false; -- GitLab From fe04791f1c67a92ee92c04f061b1dc25f1a56127 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Fri, 21 Aug 2020 17:30:56 +0200 Subject: [PATCH 003/123] WIP: Start implementation of new interface for sensor models --- .../include/otbCompositeTransform.hxx | 2 - .../Transform/include/otbForwardSensorModel.h | 91 ------------------ .../include/otbForwardSensorModel.hxx | 79 ---------------- .../Transform/include/otbGenericRSTransform.h | 1 + .../include/otbGenericRSTransform.hxx | 5 +- .../Transform/include/otbInverseSensorModel.h | 93 ------------------- .../include/otbInverseSensorModel.hxx | 81 ---------------- .../include/otbRPCForwardTransform.h | 79 ++++++++++++++++ .../include/otbRPCForwardTransform.hxx | 58 ++++++++++++ .../include/otbRPCInverseTransform.h | 79 ++++++++++++++++ .../include/otbRPCInverseTransform.hxx | 57 ++++++++++++ .../Transform/include/otbRPCTransformBase.h | 93 +++++++++++++++++++ .../Transform/include/otbRPCTransformBase.hxx | 78 ++++++++++++++++ .../Transform/include/otbSensorModelBase.h | 69 +++++--------- .../Transform/include/otbSensorModelBase.hxx | 69 -------------- Modules/Core/Transform/include/otbTransform.h | 2 - Modules/Core/Transform/test/CMakeLists.txt | 18 ++-- .../otbCreateInverseForwardSensorModel.cxx | 37 +++++--- .../test/otbCreateProjectionWithOTB.cxx | 2 - .../Transform/test/otbTransformTestDriver.cxx | 2 +- .../test/otbRegionProjectionResampler.cxx | 8 +- .../Projection/test/otbSensorModel.cxx | 8 +- .../test/otbDisparityMapToDEMFilter.cxx | 1 + .../include/otbMulti3DMapToDEMFilter.hxx | 1 - 24 files changed, 515 insertions(+), 498 deletions(-) delete mode 100644 Modules/Core/Transform/include/otbForwardSensorModel.h delete mode 100644 Modules/Core/Transform/include/otbForwardSensorModel.hxx delete mode 100644 Modules/Core/Transform/include/otbInverseSensorModel.h delete mode 100644 Modules/Core/Transform/include/otbInverseSensorModel.hxx create mode 100644 Modules/Core/Transform/include/otbRPCForwardTransform.h create mode 100644 Modules/Core/Transform/include/otbRPCForwardTransform.hxx create mode 100644 Modules/Core/Transform/include/otbRPCInverseTransform.h create mode 100644 Modules/Core/Transform/include/otbRPCInverseTransform.hxx create mode 100644 Modules/Core/Transform/include/otbRPCTransformBase.h create mode 100644 Modules/Core/Transform/include/otbRPCTransformBase.hxx delete mode 100644 Modules/Core/Transform/include/otbSensorModelBase.hxx diff --git a/Modules/Core/Transform/include/otbCompositeTransform.hxx b/Modules/Core/Transform/include/otbCompositeTransform.hxx index 2b3e3dd09c..ac6fa48320 100644 --- a/Modules/Core/Transform/include/otbCompositeTransform.hxx +++ b/Modules/Core/Transform/include/otbCompositeTransform.hxx @@ -24,8 +24,6 @@ #include "otbCompositeTransform.h" #include "otbGenericMapProjection.h" -#include "otbForwardSensorModel.h" -#include "otbInverseSensorModel.h" #include "itkIdentityTransform.h" namespace otb diff --git a/Modules/Core/Transform/include/otbForwardSensorModel.h b/Modules/Core/Transform/include/otbForwardSensorModel.h deleted file mode 100644 index 0165810e34..0000000000 --- a/Modules/Core/Transform/include/otbForwardSensorModel.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef otbForwardSensorModel_h -#define otbForwardSensorModel_h - -#include "otbSensorModelBase.h" -#include "itkMacro.h" -#include "itkObject.h" - -namespace otb -{ - -/** \class ForwardSensorModel - - * \brief Class for direct sensor models - * - * Based on ossimProjectionFactoryRegistry and ossimProjection methods. - * It takes as input an index and computes the world coordinates. - * (i, j, h) -> (lon, lat). - * Notice that the elevation h is optional. - * - * \ingroup Transform - * \ingroup Projection - * - * \ingroup OTBTransform - */ - -template -class ITK_EXPORT ForwardSensorModel : public SensorModelBase -{ - -public: - /** Standard class typedefs. */ - typedef ForwardSensorModel Self; - typedef SensorModelBase Superclass; - typedef itk::SmartPointer Pointer; - typedef itk::SmartPointer ConstPointer; - - typedef typename Superclass::InputPointType InputPointType; - typedef typename Superclass::OutputPointType OutputPointType; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Run-time type information (and related methods). */ - itkTypeMacro(ForwardSensorModel, SensorModelBase); - - itkStaticConstMacro(InputSpaceDimension, unsigned int, NInputDimensions); - itkStaticConstMacro(OutputSpaceDimension, unsigned int, NOutputDimensions); - - /** Compute the world coordinates. */ - OutputPointType TransformPoint(const InputPointType& point) const override; - -protected: - ForwardSensorModel(); - ~ForwardSensorModel() override; - - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - ForwardSensorModel(const Self&) = delete; - void operator=(const Self&) = delete; -}; - -} // namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbForwardSensorModel.hxx" -#endif - -#endif diff --git a/Modules/Core/Transform/include/otbForwardSensorModel.hxx b/Modules/Core/Transform/include/otbForwardSensorModel.hxx deleted file mode 100644 index b2417e68b5..0000000000 --- a/Modules/Core/Transform/include/otbForwardSensorModel.hxx +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbForwardSensorModel_hxx -#define otbForwardSensorModel_hxx - -#include "otbForwardSensorModel.h" -#include "otbMacro.h" - -namespace otb -{ - -template -ForwardSensorModel::ForwardSensorModel() -{ -} - -template -ForwardSensorModel::~ForwardSensorModel() -{ -} - -template -typename ForwardSensorModel::OutputPointType -ForwardSensorModel::TransformPoint(const InputPointType& point) const -{ - double x = point[0]; - double y = point[1]; - - double lon, lat, h; - - if (InputPointType::PointDimension == 3) - { - double z = point[2]; - - this->m_Model->ForwardTransformPoint(x, y, z, lon, lat, h); - } - else - { - this->m_Model->ForwardTransformPoint(x, y, lon, lat, h); - } - - OutputPointType outputPoint; - outputPoint[0] = lon; - outputPoint[1] = lat; - - if (OutputPointType::PointDimension == 3) - { - outputPoint[2] = h; - } - return outputPoint; -} - -template -void ForwardSensorModel::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} - -} // namespace otb - -#endif diff --git a/Modules/Core/Transform/include/otbGenericRSTransform.h b/Modules/Core/Transform/include/otbGenericRSTransform.h index 9ffa943b83..31c9334d13 100644 --- a/Modules/Core/Transform/include/otbGenericRSTransform.h +++ b/Modules/Core/Transform/include/otbGenericRSTransform.h @@ -22,6 +22,7 @@ #define otbGenericRSTransform_h #include "otbCompositeTransform.h" +#include "otbImageKeywordlist.h" #include namespace otb diff --git a/Modules/Core/Transform/include/otbGenericRSTransform.hxx b/Modules/Core/Transform/include/otbGenericRSTransform.hxx index b1794715ff..3c6f405aa4 100644 --- a/Modules/Core/Transform/include/otbGenericRSTransform.hxx +++ b/Modules/Core/Transform/include/otbGenericRSTransform.hxx @@ -25,6 +25,7 @@ #include "otbMacro.h" #include "otbMetaDataKey.h" #include "itkMetaDataObject.h" +#include "otbRPCForwardTransform.h" #include "otbSpatialReference.h" @@ -123,10 +124,10 @@ void GenericRSTransform::Insta // If not, try to make a sensor model if ((m_InputTransform.IsNull()) && (m_InputKeywordList.GetSize() > 0)) { - typedef otb::ForwardSensorModel ForwardSensorModelType; + typedef otb::RPCForwardTransform ForwardSensorModelType; typename ForwardSensorModelType::Pointer sensorModel = ForwardSensorModelType::New(); - sensorModel->SetImageGeometry(m_InputKeywordList); + sensorModel->SetMetadataModel(m_InputKeywordList); if (sensorModel->IsValidSensorModel()) { diff --git a/Modules/Core/Transform/include/otbInverseSensorModel.h b/Modules/Core/Transform/include/otbInverseSensorModel.h deleted file mode 100644 index fa2591f914..0000000000 --- a/Modules/Core/Transform/include/otbInverseSensorModel.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbInverseSensorModel_h -#define otbInverseSensorModel_h - -#include "otbSensorModelBase.h" - -#include "itkMacro.h" -#include "itkObject.h" - -namespace otb -{ - -/** \class InverseSensorModel - * - * \brief Class for inverse sensor models - * - * Based on ossimProjectionFactoryRegistry and ossimProjection methods. - * It takes as input a world point and computes the index position of the - * corresponding point in the input image. - * (lon, lat, h) -> (i, j). - * Notice that the elevation h is optional. - * - * \ingroup Transform - * \ingroup Projection - * - * \ingroup OTBTransform - */ -template -class ITK_EXPORT InverseSensorModel : public SensorModelBase -{ - -public: - /** Standard class typedefs. */ - typedef InverseSensorModel Self; - typedef SensorModelBase Superclass; - typedef itk::SmartPointer Pointer; - typedef itk::SmartPointer ConstPointer; - - typedef typename Superclass::InputPointType InputPointType; - typedef typename Superclass::OutputPointType OutputPointType; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Run-time type information (and related methods). */ - itkTypeMacro(InverseSensorModel, SensorModelBase); - - itkStaticConstMacro(InputSpaceDimension, unsigned int, NInputDimensions); - itkStaticConstMacro(OutputSpaceDimension, unsigned int, NOutputDimensions); - - // Transform of geographic point in image sensor index - OutputPointType TransformPoint(const InputPointType& point) const override; - // Transform of geographic point in image sensor index -- Backward Compatibility - // OutputPointType TransformPoint(const InputPointType &point, double height) const; - -protected: - InverseSensorModel(); - ~InverseSensorModel() override; - - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - InverseSensorModel(const Self&) = delete; - void operator=(const Self&) = delete; -}; - -} // namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbInverseSensorModel.hxx" -#endif - -#endif diff --git a/Modules/Core/Transform/include/otbInverseSensorModel.hxx b/Modules/Core/Transform/include/otbInverseSensorModel.hxx deleted file mode 100644 index dedfc59e6c..0000000000 --- a/Modules/Core/Transform/include/otbInverseSensorModel.hxx +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbInverseSensorModel_hxx -#define otbInverseSensorModel_hxx - -#include "otbInverseSensorModel.h" -#include "otbMacro.h" - -namespace otb -{ - -template -InverseSensorModel::InverseSensorModel() -{ -} - -template -InverseSensorModel::~InverseSensorModel() -{ -} - -template -typename InverseSensorModel::OutputPointType -InverseSensorModel::TransformPoint(const InputPointType& point) const -{ - double lon = point[0]; - double lat = point[1]; - double x, y, z; - - if (InputPointType::PointDimension == 3) - { - double h = point[2]; - - this->m_Model->InverseTransformPoint(lon, lat, h, x, y, z); - } - else - { - this->m_Model->InverseTransformPoint(lon, lat, x, y, z); - } - - OutputPointType outputPoint; - - outputPoint[0] = x; - outputPoint[1] = y; - - if (OutputPointType::PointDimension == 3) - { - outputPoint[2] = z; - } - - return outputPoint; -} - - -template -void InverseSensorModel::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} - -} // namespace otb - -#endif diff --git a/Modules/Core/Transform/include/otbRPCForwardTransform.h b/Modules/Core/Transform/include/otbRPCForwardTransform.h new file mode 100644 index 0000000000..5442603a4e --- /dev/null +++ b/Modules/Core/Transform/include/otbRPCForwardTransform.h @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef otbRPCForwardTransform_h +#define otbRPCForwardTransform_h + +#include "otbRPCTransformBase.h" + +namespace otb +{ +/** \class RPCForwardTransform + * \brief Projection class based on the RPC method. + * + * This is a projection class, based on a RPC sensor model. This + * class computes a forward transformation of a point in the sensor + * geometry (i, j) to a geographic point in (lat, long) + * + * \ingroup OTBTransform + */ +template +class ITK_EXPORT RPCForwardTransform : public RPCTransformBase +{ +public: + /** Standard class typedefs. */ + using Self = RPCForwardTransform; + using Superclass = RPCTransformBase; + using Pointer = itk::SmartPointer; + using ConstPointer = itk::SmartPointer ; + + using InputPointType = itk::Point; + using OutputPointType = itk::Point; + using PixelType =TScalarType; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Run-time type information (and related methods). */ + itkTypeMacro(Self, Superclass); + + itkStaticConstMacro(InputSpaceDimension, unsigned int, 2); + itkStaticConstMacro(OutputSpaceDimension, unsigned int, 3); + + /** Method to transform a point. */ + OutputPointType TransformPoint(const InputPointType& point) const override; + +protected: + RPCForwardTransform() = default; + ~RPCForwardTransform() = default; + void PrintSelf(std::ostream& os, itk::Indent indent) const override; + +private: + RPCForwardTransform(const Self&) = delete; + void operator=(const Self&) = delete; +}; + +} + +#ifndef OTB_MANUAL_INSTANTIATION +#include "otbRPCForwardTransform.hxx" +#endif + +#endif diff --git a/Modules/Core/Transform/include/otbRPCForwardTransform.hxx b/Modules/Core/Transform/include/otbRPCForwardTransform.hxx new file mode 100644 index 0000000000..beb3e8c859 --- /dev/null +++ b/Modules/Core/Transform/include/otbRPCForwardTransform.hxx @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef otbRPCForwardTransform_hxx +#define otbRPCForwardTransform_hxx + +#include "otbRPCForwardTransform.h" + +namespace otb +{ + +template +typename RPCForwardTransform::OutputPointType +RPCForwardTransform::TransformPoint(const InputPointType& point) const +{ + double x = static_cast(point[0]); + double y = static_cast(point[1]); + double z; + + this->m_Transformer->ForwardTransform(&x, &y, &z); + + OutputPointType pOut; + pOut[0] = static_cast(x); + pOut[1] = static_cast(y); + pOut[2] = static_cast(z); + return pOut; +} + +/** + * PrintSelf method + */ +template +void RPCForwardTransform::PrintSelf(std::ostream& os, itk::Indent indent) const +{ + Superclass::PrintSelf(os, indent); + os << indent << "Transformation direction: Forward" << std::endl; +} + +} + +#endif diff --git a/Modules/Core/Transform/include/otbRPCInverseTransform.h b/Modules/Core/Transform/include/otbRPCInverseTransform.h new file mode 100644 index 0000000000..712c1b41c0 --- /dev/null +++ b/Modules/Core/Transform/include/otbRPCInverseTransform.h @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef otbRPCInverseTransform_h +#define otbRPCInverseTransform_h + +#include "otbRPCTransformBase.h" + +namespace otb +{ +/** \class RPCInverseTransform + * \brief Projection class based on the RPC method. + * + * This is a projection class, based on a RPC sensor model. This + * class computes an inverse transformation of a a geographic + * point in (lat, long) to a point in the sensor geometry (i, j). + * + * \ingroup OTBTransform + */ +template +class ITK_EXPORT RPCInverseTransform : public RPCTransformBase +{ +public: + /** Standard class typedefs. */ + using Self = RPCInverseTransform; + using Superclass = RPCTransformBase; + using Pointer = itk::SmartPointer; + using ConstPointer = itk::SmartPointer ; + + using InputPointType = itk::Point; + using OutputPointType = itk::Point; + using PixelType =TScalarType; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Run-time type information (and related methods). */ + itkTypeMacro(Self, Superclass); + + itkStaticConstMacro(InputSpaceDimension, unsigned int, 3); + itkStaticConstMacro(OutputSpaceDimension, unsigned int, 2); + + /** Method to transform a point. */ + OutputPointType TransformPoint(const InputPointType& point) const override; + +protected: + RPCInverseTransform() = default; + ~RPCInverseTransform() = default; + void PrintSelf(std::ostream& os, itk::Indent indent) const override; + +private: + RPCInverseTransform(const Self&) = delete; + void operator=(const Self&) = delete; +}; + +} + +#ifndef OTB_MANUAL_INSTANTIATION +#include "otbRPCInverseTransform.hxx" +#endif + +#endif diff --git a/Modules/Core/Transform/include/otbRPCInverseTransform.hxx b/Modules/Core/Transform/include/otbRPCInverseTransform.hxx new file mode 100644 index 0000000000..d501fa643c --- /dev/null +++ b/Modules/Core/Transform/include/otbRPCInverseTransform.hxx @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef otbRPCInverseTransform_hxx +#define otbRPCInverseTransform_hxx + +#include "otbRPCInverseTransform.h" + +namespace otb +{ + +template +typename RPCInverseTransform::OutputPointType +RPCInverseTransform::TransformPoint(const RPCInverseTransform::InputPointType& point) const +{ + double x = static_cast(point[0]); + double y = static_cast(point[1]); + double z = static_cast(point[2]); + + this->m_Transformer->InverseTransform(&x, &y, &z); + + OutputPointType pOut; + pOut[0] = static_cast(x); + pOut[1] = static_cast(y); + return pOut; +} + +/** + * PrintSelf method + */ +template +void RPCInverseTransform::PrintSelf(std::ostream& os, itk::Indent indent) const +{ + Superclass::PrintSelf(os, indent); + os << indent << "Transformation direction: Inverse" << std::endl; +} + +} + +#endif diff --git a/Modules/Core/Transform/include/otbRPCTransformBase.h b/Modules/Core/Transform/include/otbRPCTransformBase.h new file mode 100644 index 0000000000..65fd886142 --- /dev/null +++ b/Modules/Core/Transform/include/otbRPCTransformBase.h @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef otbRPCTransformBase_h +#define otbRPCTransformBase_h + +#include "otbSensorModelBase.h" +#include "otbGeometryMetadata.h" +#include "otbGDALRPCTransformer.h" + +namespace otb +{ +/** \class RPCTransformBase + * \brief Base projection class based on the RPC method. + * + * This is a projection class, based on a RPC sensor model. This + * class allows: + * + * - Forward Transformation of a point in the sensor geometry (i, j) + * to a geographic point in (lat, long) + * + * - Inverse Transformation of a a geographic point in (lat, long) to + * a point in the sensor geometry (i, j). + * + * \ingroup OTBTransform + */ +template +class ITK_EXPORT RPCTransformBase : public SensorModelBase +{ +public: + /** Standard class typedefs. */ + using Self = RPCTransformBase; + using Superclass = SensorModelBase; + using Pointer = itk::SmartPointer; + using ConstPointer = itk::SmartPointer ; + + using InputPointType = itk::Point; + using OutputPointType = itk::Point; + using PixelType =TScalarType; + + /** Run-time type information (and related methods). */ + itkTypeMacro(Self, Superclass); + + itkStaticConstMacro(InputSpaceDimension, unsigned int, NInputDimensions); + itkStaticConstMacro(OutputSpaceDimension, unsigned int, NOutputDimensions); + + /* + * Set the model as it is defined in the ImageMetadata. + * Used by the factory to find the correct class. + * Return false if model not valid. + */ + bool SetMetadataModel(boost::any imdModel) override; + + /** Check model validity */ + bool IsValidSensorModel() override; + +protected: + RPCTransformBase() = default; + ~RPCTransformBase() override; + void PrintSelf(std::ostream& os, itk::Indent indent) const override; + + Projection::RPCParam* m_RPCParam = nullptr; + GDALRPCTransformer* m_Transformer = nullptr; + +private: + RPCTransformBase(const Self&) = delete; + void operator=(const Self&) = delete; +}; + +} + +#ifndef OTB_MANUAL_INSTANTIATION +#include "otbRPCTransformBase.hxx" +#endif + +#endif diff --git a/Modules/Core/Transform/include/otbRPCTransformBase.hxx b/Modules/Core/Transform/include/otbRPCTransformBase.hxx new file mode 100644 index 0000000000..ae94da36a7 --- /dev/null +++ b/Modules/Core/Transform/include/otbRPCTransformBase.hxx @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef otbRPCTransformBase_hxx +#define otbRPCTransformBase_hxx + +#include "otbRPCTransformBase.h" + +namespace otb +{ + +template +RPCTransformBase::~RPCTransformBase() +{ + this->m_RPCParam = nullptr; + this->m_Transformer = nullptr; // Memory leek ? +} + +template +bool RPCTransformBase::SetMetadataModel(boost::any imdModel) +{ + delete this->m_RPCParam; + delete this->m_Transformer; + try + { + Projection::RPCParam rpcParam = boost::any_cast(imdModel); + this->m_RPCParam = &rpcParam; + } + catch (boost::bad_any_cast) + { + return false; + } + GDALRPCTransformer trans = GDALRPCTransformer( + m_RPCParam->LineOffset, m_RPCParam->SampleOffset, m_RPCParam->LatOffset, m_RPCParam->LonOffset, m_RPCParam->HeightOffset, + m_RPCParam->LineScale, m_RPCParam->SampleScale, m_RPCParam->LatScale, m_RPCParam->LonScale, m_RPCParam->HeightScale, + m_RPCParam->LineNum, m_RPCParam->LineDen, m_RPCParam->SampleNum, m_RPCParam->SampleDen); + this->m_Transformer = &trans; + return true; +} + +template +bool RPCTransformBase::IsValidSensorModel() +{ + if (this->m_Transformer == nullptr) + return false; + return true; +} + +/** + * PrintSelf method + */ +template +void RPCTransformBase::PrintSelf(std::ostream& os, itk::Indent indent) const +{ + Superclass::PrintSelf(os, indent); + os << indent << "RPC Model: " << this->m_RPCParam << std::endl; +} + +} + +#endif diff --git a/Modules/Core/Transform/include/otbSensorModelBase.h b/Modules/Core/Transform/include/otbSensorModelBase.h index 3c223f8520..3edd89d0d3 100644 --- a/Modules/Core/Transform/include/otbSensorModelBase.h +++ b/Modules/Core/Transform/include/otbSensorModelBase.h @@ -21,10 +21,8 @@ #ifndef otbSensorModelBase_h #define otbSensorModelBase_h - #include "otbMacro.h" -#include "otbImageKeywordlist.h" -#include "otbSensorModelAdapter.h" +#include "otbImageMetadata.h" #include "otbTransform.h" #include "itkSmartPointer.h" @@ -34,65 +32,52 @@ namespace otb /** \class SensorModelBase * \brief Base class for the sensor model projection classes. * - * This class allows transforming a geographic point in (lat, long) to a point - * in the sensor geometry. (lat, lon) -> (i, j) or (lat, lon, h) -> (i, j) + * This is the base class for sensor model projection classes. Those + * classes allow: * - * \ingroup Projection + * - Forward Transformation of a point in the sensor geometry (i, j) + * to a geographic point in (lat, long) * + * - Inverse Transformation of a a geographic point in (lat, long) to + * a point in the sensor geometry (i, j). * + * \ingroup Projection * \ingroup OTBTransform */ -template +template class ITK_EXPORT SensorModelBase : public Transform { public: /** Standard class typedefs. */ - typedef SensorModelBase Self; - typedef Transform Superclass; - typedef itk::SmartPointer Pointer; - typedef itk::SmartPointer ConstPointer; - - typedef itk::Point InputPointType; - typedef itk::Point OutputPointType; - - typedef TScalarType PixelType; + using Self = SensorModelBase; + using Superclass = Transform; + using Pointer = itk::SmartPointer; + using ConstPointer = itk::SmartPointer ; - /** Method for creation through the object factory. */ - itkNewMacro(Self); + using InputPointType = itk::Point; + using OutputPointType = itk::Point; + using PixelType =TScalarType; /** Run-time type information (and related methods). */ - itkTypeMacro(SensorModelBase, Transform); + itkTypeMacro(Self, Superclass); itkStaticConstMacro(InputSpaceDimension, unsigned int, NInputDimensions); itkStaticConstMacro(OutputSpaceDimension, unsigned int, NOutputDimensions); - /* Get the ImageKeywordlist */ - ImageKeywordlist GetImageGeometryKeywordlist(void) const; - /* - * Set the Imagekeywordlist and affect the ossim projection ( m_Model) - * Return false if not model found. + * Set the model as it is defined in the ImageMetadata. + * Used by the factory to find the correct class. + * Return false if model not valid. */ - virtual void SetImageGeometry(const ImageKeywordlist& image_kwl); + virtual bool SetMetadataModel(boost::any imdModel) = 0; - /** Is sensor model valid method. return false if the sensor model is null */ - bool IsValidSensorModel() - { - return m_Model->IsValidSensorModel(); - } + /** Check model validity */ + virtual bool IsValidSensorModel() = 0; protected: - SensorModelBase(); - ~SensorModelBase() override; - - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - - /** ImageKeywordlist */ - ImageKeywordlist m_ImageKeywordlist; - /** Pointer on an ossim projection (created with the keywordlist) */ - SensorModelAdapter::Pointer m_Model; + SensorModelBase() = default; + ~SensorModelBase() = default; private: SensorModelBase(const Self&) = delete; @@ -101,8 +86,4 @@ private: } // namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbSensorModelBase.hxx" -#endif - #endif diff --git a/Modules/Core/Transform/include/otbSensorModelBase.hxx b/Modules/Core/Transform/include/otbSensorModelBase.hxx deleted file mode 100644 index 3056fe57c0..0000000000 --- a/Modules/Core/Transform/include/otbSensorModelBase.hxx +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbSensorModelBase_hxx -#define otbSensorModelBase_hxx - -#include "otbSensorModelBase.h" - - -namespace otb -{ - -template -SensorModelBase::SensorModelBase() : Superclass(0) -{ - m_Model = SensorModelAdapter::New(); -} - -template -SensorModelBase::~SensorModelBase() -{ -} - -/// Get the Geometry Keyword list -template -ImageKeywordlist SensorModelBase::GetImageGeometryKeywordlist(void) const -{ - return m_ImageKeywordlist; -} - -/** Set the Imagekeywordlist and affect the ossim projection ( m_Model) */ -template -void SensorModelBase::SetImageGeometry(const ImageKeywordlist& image_kwl) -{ - m_ImageKeywordlist = image_kwl; - m_Model->CreateProjection(m_ImageKeywordlist); -} - -/** - * PrintSelf method - */ -template -void SensorModelBase::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); - os << indent << "Model: " << m_Model << std::endl; - os << indent << "Keywordlist: " << m_ImageKeywordlist << std::endl; -} - -} // namespace otb - -#endif diff --git a/Modules/Core/Transform/include/otbTransform.h b/Modules/Core/Transform/include/otbTransform.h index e4cd1745f7..3ce58fbb3f 100644 --- a/Modules/Core/Transform/include/otbTransform.h +++ b/Modules/Core/Transform/include/otbTransform.h @@ -30,8 +30,6 @@ namespace otb /** \class Transform * \brief Class to overload method passed to virtual pure in ITK V4. * - * - * * \ingroup OTBTransform */ template ImageType; typedef otb::ImageFileReader ReaderType; - typedef otb::InverseSensorModel InverseModelType; - typedef otb::ForwardSensorModel ForwardModelType; + typedef otb::RPCInverseTransform InverseRPCModelType; + typedef otb::RPCForwardTransform ForwardRPCModelType; // Allocate pointer - InverseModelType::Pointer inverse_model = InverseModelType::New(); - ForwardModelType::Pointer forward_model = ForwardModelType::New(); - ReaderType::Pointer reader = ReaderType::New(); + InverseRPCModelType::Pointer inverse_rpc_model = InverseRPCModelType::New(); + ForwardRPCModelType::Pointer forward_rpc_model = ForwardRPCModelType::New(); + ReaderType::Pointer reader = ReaderType::New(); // Set parameters ... reader->SetFileName(argv[1]); - // Read meta data (ossimKeywordlist) + // Read metadata reader->GenerateOutputInformation(); ImageType::Pointer inputImage = reader->GetOutput(); otbGenericMsgDebugMacro(<< "Inverse model creation..."); - inverse_model->SetImageGeometry(inputImage->GetImageKeywordlist()); - if (inverse_model->IsValidSensorModel() == false) + if (inverse_rpc_model->SetMetadataModel(inputImage->GetImageMetadata()[otb::MDGeom::RPC])) { - std::cout << "Invalid Model pointer m_Model == NULL!\n The ossim keywordlist is invalid!" << std::endl; + std::cout << "Error while reading model. This is not a RPC model!" << std::endl; + return EXIT_FAILURE; + } + if (inverse_rpc_model->IsValidSensorModel() == false) + { + std::cout << "Model not set!" << std::endl; return EXIT_FAILURE; } otbGenericMsgDebugMacro(<< "Forward model creation..."); - forward_model->SetImageGeometry(inputImage->GetImageKeywordlist()); - if (forward_model->IsValidSensorModel() == false) + if (forward_rpc_model->SetMetadataModel(inputImage->GetImageMetadata()[otb::MDGeom::RPC])) + { + std::cout << "Error while reading model. This is not a RPC model!" << std::endl; + return EXIT_FAILURE; + } + if (forward_rpc_model->IsValidSensorModel() == false) { - std::cout << "Invalid Model pointer m_Model == NULL!\n The ossim keywordlist is invalid!" << std::endl; + std::cout << "Model not set!" << std::endl; return EXIT_FAILURE; } diff --git a/Modules/Core/Transform/test/otbCreateProjectionWithOTB.cxx b/Modules/Core/Transform/test/otbCreateProjectionWithOTB.cxx index a8ef948f51..64c20948a8 100644 --- a/Modules/Core/Transform/test/otbCreateProjectionWithOTB.cxx +++ b/Modules/Core/Transform/test/otbCreateProjectionWithOTB.cxx @@ -43,8 +43,6 @@ #include "itkImageRegionIteratorWithIndex.h" #include "itkLinearInterpolateImageFunction.h" -#include "otbInverseSensorModel.h" - #if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" diff --git a/Modules/Core/Transform/test/otbTransformTestDriver.cxx b/Modules/Core/Transform/test/otbTransformTestDriver.cxx index db443ebf8d..38d3174246 100644 --- a/Modules/Core/Transform/test/otbTransformTestDriver.cxx +++ b/Modules/Core/Transform/test/otbTransformTestDriver.cxx @@ -24,7 +24,7 @@ void RegisterTests() { REGISTER_TEST(otbGenericRSTransformWithSRID); REGISTER_TEST(otbCreateInverseForwardSensorModel); - REGISTER_TEST(otbCreateProjectionWithOSSIM); +// REGISTER_TEST(otbCreateProjectionWithOSSIM); REGISTER_TEST(otbLogPolarTransformResample); REGISTER_TEST(otbLogPolarTransform); REGISTER_TEST(otbGeocentricTransform); diff --git a/Modules/Filtering/ImageManipulation/test/otbRegionProjectionResampler.cxx b/Modules/Filtering/ImageManipulation/test/otbRegionProjectionResampler.cxx index 8a82d15eb4..5b1e2a2b0f 100644 --- a/Modules/Filtering/ImageManipulation/test/otbRegionProjectionResampler.cxx +++ b/Modules/Filtering/ImageManipulation/test/otbRegionProjectionResampler.cxx @@ -43,7 +43,7 @@ #include "itkImageRegionIteratorWithIndex.h" #include "itkTranslationTransform.h" -#include "otbInverseSensorModel.h" +#include "otbRPCInverseTransform.h" #include "otbCompositeTransform.h" int otbRegionProjectionResampler(int argc, char* argv[]) @@ -59,9 +59,9 @@ int otbRegionProjectionResampler(int argc, char* argv[]) typedef otb::Image CharImageType; typedef otb::Image ImageType; - typedef otb::ImageFileReader ReaderType; - typedef otb::ImageFileWriter WriterType; - typedef otb::InverseSensorModel ModelType; + typedef otb::ImageFileReader ReaderType; + typedef otb::ImageFileWriter WriterType; + typedef otb::RPCInverseTransform ModelType; typedef itk::LinearInterpolateImageFunction InterpolatorType; typedef itk::RescaleIntensityImageFilter RescalerType; typedef otb::StreamingResampleImageFilter ResamplerType; diff --git a/Modules/Filtering/Projection/test/otbSensorModel.cxx b/Modules/Filtering/Projection/test/otbSensorModel.cxx index 208d573574..4edf7baf7d 100644 --- a/Modules/Filtering/Projection/test/otbSensorModel.cxx +++ b/Modules/Filtering/Projection/test/otbSensorModel.cxx @@ -27,8 +27,8 @@ #include "otbVectorImage.h" #include "otbImageFileReader.h" -#include "otbForwardSensorModel.h" -#include "otbInverseSensorModel.h" +#include "otbRPCForwardTransform.h" +#include "otbRPCInverseTransform.h" #include "otbDEMHandler.h" #include #include "itkEuclideanDistanceMetric.h" @@ -63,7 +63,7 @@ int produceGCP(char* outputgcpfilename, const otb::ImageKeywordlist& kwlist, boo itk::Point geoPoint; // otbForwardSensorModel - typedef otb::ForwardSensorModel ForwardSensorModelType; + typedef otb::RPCForwardTransform ForwardSensorModelType; ForwardSensorModelType::Pointer forwardSensorModel = ForwardSensorModelType::New(); forwardSensorModel->SetImageGeometry(kwlist); if (forwardSensorModel->IsValidSensorModel() == false) @@ -208,7 +208,7 @@ int otbSensorModel(int argc, char* argv[]) } // otbInverseSensorModel - typedef otb::InverseSensorModel InverseSensorModelType; + typedef otb::RPCInverseTransform InverseSensorModelType; InverseSensorModelType::Pointer inverseSensorModel = InverseSensorModelType::New(); if (!inverseSensorModel) { diff --git a/Modules/Registration/DisparityMap/test/otbDisparityMapToDEMFilter.cxx b/Modules/Registration/DisparityMap/test/otbDisparityMapToDEMFilter.cxx index 91c959f7be..81fa436ca4 100644 --- a/Modules/Registration/DisparityMap/test/otbDisparityMapToDEMFilter.cxx +++ b/Modules/Registration/DisparityMap/test/otbDisparityMapToDEMFilter.cxx @@ -25,6 +25,7 @@ #include "otbImageList.h" #include "otbVectorImageToImageListFilter.h" +#include "otbDEMHandler.h" const unsigned int Dimension = 2; diff --git a/Modules/Registration/Stereo/include/otbMulti3DMapToDEMFilter.hxx b/Modules/Registration/Stereo/include/otbMulti3DMapToDEMFilter.hxx index 74db81b656..a0638a3083 100644 --- a/Modules/Registration/Stereo/include/otbMulti3DMapToDEMFilter.hxx +++ b/Modules/Registration/Stereo/include/otbMulti3DMapToDEMFilter.hxx @@ -25,7 +25,6 @@ #include "itkImageRegionConstIteratorWithIndex.h" #include "itkImageRegionIterator.h" #include "otbStreamingStatisticsVectorImageFilter.h" -#include "otbInverseSensorModel.h" namespace otb { -- GitLab From 81247b752808edb23dd17ba5db1012e152a93972 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 2 Sep 2020 10:28:54 +0200 Subject: [PATCH 004/123] ENH: Set the imageMetadata encapsulated in the images to public --- Modules/Core/ImageBase/include/otbImageCommons.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Core/ImageBase/include/otbImageCommons.h b/Modules/Core/ImageBase/include/otbImageCommons.h index db863ea5bb..3b2a7b7dd0 100644 --- a/Modules/Core/ImageBase/include/otbImageCommons.h +++ b/Modules/Core/ImageBase/include/otbImageCommons.h @@ -66,7 +66,7 @@ public: /** Returns true if a sensor geometric model is present */ bool HasSensorGeometry() const; -private: + /** Image metadata */ ImageMetadata m_Imd; }; -- GitLab From 54d2985beac78500a8a0b304974254349ce59743 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 2 Sep 2020 12:14:57 +0200 Subject: [PATCH 005/123] ENH: Remove forbidden Variable Length Arrays --- .../include/otbGDALRPCTransformer.h | 50 ++++++++++++++----- .../src/otbGDALRPCTransformer.cxx | 50 +++++++++++++++---- 2 files changed, 77 insertions(+), 23 deletions(-) diff --git a/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h b/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h index cb516cfffa..101be529df 100644 --- a/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h +++ b/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h @@ -21,6 +21,7 @@ #define otbGDALRPCTransformer_h #include "OTBGdalAdaptersExport.h" +#include "itkPoint.h" #include #include @@ -52,6 +53,9 @@ namespace otb class OTBGdalAdapters_EXPORT GDALRPCTransformer { public: + + using PointType = itk::Point; + /** * Build a GDALRPCTransformer * @@ -121,11 +125,11 @@ public: * GEOS. * * - * \param Name a string containing the name of the option - * \param Value a string containing the value of the option + * \param[in] Name a string containing the name of the option + * \param[in] Value a string containing the value of the option * */ - void SetOption(std::string Name, std::string Value); + void SetOption(const std::string& Name, const std::string& Value); /** * Set the error (measured in pixels) allowed in the @@ -134,7 +138,7 @@ public: * be set through the RPC_PIXEL_ERROR_THRESHOLD transformer option. * If a negative or null value is provided, then this defaults to 0.1 pixel. * - * \param PixErrThreshold the new value of the error + * \param[in] PixErrThreshold the new value of the error * */ void SetPixErrThreshold(double PixErrThreshold); @@ -145,30 +149,52 @@ public: * This method performs a transformation from column/row to long/lat/height space. * It can work with an arbitrary number of points. * - * \param x the X coordinate of the points to convert - * \param y the Y coordinate of the points to convert - * \param z the Z coordinate of the points to convert - * \param nPointCount the number of points to convert + * \param[in,out] x array of the X coordinate of the points to convert + * \param[in,out] y array of the Y coordinate of the points to convert + * \param[in,out] z array of the Z coordinate of the points to convert + * \param[in] nPointCount the number of points to convert * \return true if all points were correctly transformed + * \pre `x, y, z != nullptr` * */ bool ForwardTransform(double* x, double* y, double* z, int nPointCount=1); + /** + * Compute an forward transformation + * + * This method performs a transformation from column/row to long/lat/height space. + * It works with only one point. + * + * \param[in] p coordinates of the point to convert + */ + PointType ForwardTransform(PointType p); + /** * Compute an inverse transformation * * This method performs a transformation from long/lat/height to column/row space. * It can work with an arbitrary number of points. * - * \param x the X coordinate of the points to convert - * \param y the Y coordinate of the points to convert - * \param z the Z coordinate of the points to convert - * \param nPointCount the number of points to convert + * \param[in,out] x array of the X coordinate of the points to convert + * \param[in,out] y array of the Y coordinate of the points to convert + * \param[in,out] z array of the Z coordinate of the points to convert + * \param[in] nPointCount the number of points to convert * \return true if all points were correctly transformed + * \pre `x, y, z != nullptr` * */ bool InverseTransform(double* x, double* y, double* z, int nPointCount=1); + /** + * Compute an inverse transformation + * + * This method performs a transformation from long/lat/height to column/row space. + * It works with only one point. + * + * \param[in] p coordinates of the point to convert + */ + PointType InverseTransform(PointType p); + protected: /** * Regenerate the transformer diff --git a/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx b/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx index 8caf6c6653..6da7737d58 100644 --- a/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx +++ b/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx @@ -19,6 +19,7 @@ */ #include "otbGDALRPCTransformer.h" +#include namespace otb { @@ -48,7 +49,7 @@ GDALRPCTransformer::GDALRPCTransformer(double LineOffset, double SampleOffset, d } } -void GDALRPCTransformer::SetOption(std::string Name, std::string Value) +void GDALRPCTransformer::SetOption(const std::string& Name, const std::string& Value) { this->m_Options = CSLSetNameValue(this->m_Options, Name.c_str(), Value.c_str()); this->m_Modified = true; @@ -68,25 +69,52 @@ void GDALRPCTransformer::Update() bool GDALRPCTransformer::ForwardTransform(double* x, double* y, double* z, int nPointCount) { + assert(x); + assert(y); + assert(z); if (this->m_Modified) this->Update(); - int success[nPointCount]; + int* success = new int[nPointCount]; GDALRPCTransform(this->m_TransformArg, false, nPointCount, x, y, z, success); - for(int* it{success} ; it < (success + nPointCount) ; ++it) - if (! *it) - return false; - return true; + bool finalSuccess = std::all_of(success, success+nPointCount, [](int i){return i;}); + delete[] success; + return finalSuccess; } +GDALRPCTransformer::PointType GDALRPCTransformer::ForwardTransform(GDALRPCTransformer::PointType p) +{ + if (m_Modified) + this->Update(); + int success; + GDALRPCTransform(this->m_TransformArg, false, 1, &p[0], &p[1], &p[2], &success); + if (!success) + throw std::runtime_error("GDALRPCTransform was not able to process the ForwardTransform."); + return p; +} + + bool GDALRPCTransformer::InverseTransform(double* x, double* y, double* z, int nPointCount) { + assert(x); + assert(y); + assert(z); if (this->m_Modified) this->Update(); - int success[nPointCount]; + int* success = new int[nPointCount]; GDALRPCTransform(this->m_TransformArg, true, nPointCount, x, y, z, success); - for(int* it{success} ; it < (success + nPointCount) ; ++it) - if (! *it) - return false; - return true; + bool finalSuccess = std::all_of(success, success+nPointCount, [](int i){return i;}); + delete[] success; + return finalSuccess; +} + +GDALRPCTransformer::PointType GDALRPCTransformer::InverseTransform(GDALRPCTransformer::PointType p) +{ + if (m_Modified) + this->Update(); + int success; + GDALRPCTransform(this->m_TransformArg, true, 1, &p[0], &p[1], &p[2], &success); + if (!success) + throw std::runtime_error("GDALRPCTransform was not able to process the InverseTransform."); + return p; } } -- GitLab From 05eab23eec4d3e2c736b13ebba9c9995c1b13d31 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 2 Sep 2020 12:16:38 +0200 Subject: [PATCH 006/123] ENH: Use smart pointers and change templates --- .../include/otbRPCForwardTransform.h | 18 +++++++------ .../include/otbRPCForwardTransform.hxx | 16 ++++++------ .../include/otbRPCInverseTransform.h | 18 +++++++------ .../include/otbRPCInverseTransform.hxx | 17 +++++++------ .../Transform/include/otbRPCTransformBase.h | 12 +++++---- .../Transform/include/otbRPCTransformBase.hxx | 25 ++++++------------- 6 files changed, 53 insertions(+), 53 deletions(-) diff --git a/Modules/Core/Transform/include/otbRPCForwardTransform.h b/Modules/Core/Transform/include/otbRPCForwardTransform.h index 5442603a4e..e78e04b5e1 100644 --- a/Modules/Core/Transform/include/otbRPCForwardTransform.h +++ b/Modules/Core/Transform/include/otbRPCForwardTransform.h @@ -34,19 +34,21 @@ namespace otb * * \ingroup OTBTransform */ -template -class ITK_EXPORT RPCForwardTransform : public RPCTransformBase +template +class ITK_EXPORT RPCForwardTransform : public RPCTransformBase { public: - /** Standard class typedefs. */ + /** @name Standard class type definitions */ + //@{ using Self = RPCForwardTransform; - using Superclass = RPCTransformBase; + using Superclass = RPCTransformBase; using Pointer = itk::SmartPointer; using ConstPointer = itk::SmartPointer ; - using InputPointType = itk::Point; - using OutputPointType = itk::Point; + using InputPointType = itk::Point; + using OutputPointType = itk::Point; using PixelType =TScalarType; + //@} /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -54,8 +56,8 @@ public: /** Run-time type information (and related methods). */ itkTypeMacro(Self, Superclass); - itkStaticConstMacro(InputSpaceDimension, unsigned int, 2); - itkStaticConstMacro(OutputSpaceDimension, unsigned int, 3); + itkStaticConstMacro(InputSpaceDimension, unsigned int, NInputDimensions); + itkStaticConstMacro(OutputSpaceDimension, unsigned int, NOutputDimensions); /** Method to transform a point. */ OutputPointType TransformPoint(const InputPointType& point) const override; diff --git a/Modules/Core/Transform/include/otbRPCForwardTransform.hxx b/Modules/Core/Transform/include/otbRPCForwardTransform.hxx index beb3e8c859..fd0ba22bfe 100644 --- a/Modules/Core/Transform/include/otbRPCForwardTransform.hxx +++ b/Modules/Core/Transform/include/otbRPCForwardTransform.hxx @@ -26,28 +26,30 @@ namespace otb { -template -typename RPCForwardTransform::OutputPointType -RPCForwardTransform::TransformPoint(const InputPointType& point) const +template +typename RPCForwardTransform::OutputPointType +RPCForwardTransform::TransformPoint(const RPCForwardTransform::InputPointType& point) const { double x = static_cast(point[0]); double y = static_cast(point[1]); double z; - this->m_Transformer->ForwardTransform(&x, &y, &z); + if(!this->m_Transformer->ForwardTransform(&x, &y, &z)) + throw std::runtime_error("An error occurred while processing the ForwardTransform."); OutputPointType pOut; pOut[0] = static_cast(x); pOut[1] = static_cast(y); - pOut[2] = static_cast(z); + if (NOutputDimensions > 2) + pOut[2] = static_cast(z); return pOut; } /** * PrintSelf method */ -template -void RPCForwardTransform::PrintSelf(std::ostream& os, itk::Indent indent) const +template +void RPCForwardTransform::PrintSelf(std::ostream& os, itk::Indent indent) const { Superclass::PrintSelf(os, indent); os << indent << "Transformation direction: Forward" << std::endl; diff --git a/Modules/Core/Transform/include/otbRPCInverseTransform.h b/Modules/Core/Transform/include/otbRPCInverseTransform.h index 712c1b41c0..5351deb80e 100644 --- a/Modules/Core/Transform/include/otbRPCInverseTransform.h +++ b/Modules/Core/Transform/include/otbRPCInverseTransform.h @@ -34,19 +34,21 @@ namespace otb * * \ingroup OTBTransform */ -template -class ITK_EXPORT RPCInverseTransform : public RPCTransformBase +template +class ITK_EXPORT RPCInverseTransform : public RPCTransformBase { public: - /** Standard class typedefs. */ + /** @name Standard class type definitions */ + //@{ using Self = RPCInverseTransform; - using Superclass = RPCTransformBase; + using Superclass = RPCTransformBase; using Pointer = itk::SmartPointer; using ConstPointer = itk::SmartPointer ; - using InputPointType = itk::Point; - using OutputPointType = itk::Point; + using InputPointType = itk::Point; + using OutputPointType = itk::Point; using PixelType =TScalarType; + //@} /** Method for creation through the object factory. */ itkNewMacro(Self); @@ -54,8 +56,8 @@ public: /** Run-time type information (and related methods). */ itkTypeMacro(Self, Superclass); - itkStaticConstMacro(InputSpaceDimension, unsigned int, 3); - itkStaticConstMacro(OutputSpaceDimension, unsigned int, 2); + itkStaticConstMacro(InputSpaceDimension, unsigned int, NInputDimensions); + itkStaticConstMacro(OutputSpaceDimension, unsigned int, NOutputDimensions); /** Method to transform a point. */ OutputPointType TransformPoint(const InputPointType& point) const override; diff --git a/Modules/Core/Transform/include/otbRPCInverseTransform.hxx b/Modules/Core/Transform/include/otbRPCInverseTransform.hxx index d501fa643c..6e539649a9 100644 --- a/Modules/Core/Transform/include/otbRPCInverseTransform.hxx +++ b/Modules/Core/Transform/include/otbRPCInverseTransform.hxx @@ -26,15 +26,18 @@ namespace otb { -template -typename RPCInverseTransform::OutputPointType -RPCInverseTransform::TransformPoint(const RPCInverseTransform::InputPointType& point) const +template +typename RPCInverseTransform::OutputPointType +RPCInverseTransform::TransformPoint(const RPCInverseTransform::InputPointType& point) const { double x = static_cast(point[0]); double y = static_cast(point[1]); - double z = static_cast(point[2]); + double z = 0; + if (NInputDimensions > 2) + z = static_cast(point[2]); - this->m_Transformer->InverseTransform(&x, &y, &z); + if(!this->m_Transformer->InverseTransform(&x, &y, &z)) + throw std::runtime_error("An error occurred while processing the InverseTransform."); OutputPointType pOut; pOut[0] = static_cast(x); @@ -45,8 +48,8 @@ RPCInverseTransform::TransformPoint(const RPCInverseTransform -void RPCInverseTransform::PrintSelf(std::ostream& os, itk::Indent indent) const +template +void RPCInverseTransform::PrintSelf(std::ostream& os, itk::Indent indent) const { Superclass::PrintSelf(os, indent); os << indent << "Transformation direction: Inverse" << std::endl; diff --git a/Modules/Core/Transform/include/otbRPCTransformBase.h b/Modules/Core/Transform/include/otbRPCTransformBase.h index 65fd886142..96ce321582 100644 --- a/Modules/Core/Transform/include/otbRPCTransformBase.h +++ b/Modules/Core/Transform/include/otbRPCTransformBase.h @@ -45,7 +45,8 @@ template { public: - /** Standard class typedefs. */ + /** @name Standard class type definitions */ + //@{ using Self = RPCTransformBase; using Superclass = SensorModelBase; using Pointer = itk::SmartPointer; @@ -54,6 +55,7 @@ public: using InputPointType = itk::Point; using OutputPointType = itk::Point; using PixelType =TScalarType; + //@} /** Run-time type information (and related methods). */ itkTypeMacro(Self, Superclass); @@ -69,15 +71,15 @@ public: bool SetMetadataModel(boost::any imdModel) override; /** Check model validity */ - bool IsValidSensorModel() override; + bool IsValidSensorModel() const override; protected: RPCTransformBase() = default; - ~RPCTransformBase() override; + ~RPCTransformBase() = default; void PrintSelf(std::ostream& os, itk::Indent indent) const override; - Projection::RPCParam* m_RPCParam = nullptr; - GDALRPCTransformer* m_Transformer = nullptr; + std::unique_ptr m_RPCParam; + std::unique_ptr m_Transformer; private: RPCTransformBase(const Self&) = delete; diff --git a/Modules/Core/Transform/include/otbRPCTransformBase.hxx b/Modules/Core/Transform/include/otbRPCTransformBase.hxx index ae94da36a7..a548653982 100644 --- a/Modules/Core/Transform/include/otbRPCTransformBase.hxx +++ b/Modules/Core/Transform/include/otbRPCTransformBase.hxx @@ -26,41 +26,30 @@ namespace otb { -template -RPCTransformBase::~RPCTransformBase() -{ - this->m_RPCParam = nullptr; - this->m_Transformer = nullptr; // Memory leek ? -} - template bool RPCTransformBase::SetMetadataModel(boost::any imdModel) { - delete this->m_RPCParam; - delete this->m_Transformer; try { - Projection::RPCParam rpcParam = boost::any_cast(imdModel); - this->m_RPCParam = &rpcParam; + Projection::RPCParam newParam = boost::any_cast(imdModel); + this->m_RPCParam.reset(&newParam); } catch (boost::bad_any_cast) { return false; } - GDALRPCTransformer trans = GDALRPCTransformer( + GDALRPCTransformer newTrans = GDALRPCTransformer( m_RPCParam->LineOffset, m_RPCParam->SampleOffset, m_RPCParam->LatOffset, m_RPCParam->LonOffset, m_RPCParam->HeightOffset, m_RPCParam->LineScale, m_RPCParam->SampleScale, m_RPCParam->LatScale, m_RPCParam->LonScale, m_RPCParam->HeightScale, m_RPCParam->LineNum, m_RPCParam->LineDen, m_RPCParam->SampleNum, m_RPCParam->SampleDen); - this->m_Transformer = &trans; + this->m_Transformer.reset(&newTrans); return true; } template -bool RPCTransformBase::IsValidSensorModel() +bool RPCTransformBase::IsValidSensorModel() const { - if (this->m_Transformer == nullptr) - return false; - return true; + return m_Transformer != nullptr; } /** @@ -70,7 +59,7 @@ template ::PrintSelf(std::ostream& os, itk::Indent indent) const { Superclass::PrintSelf(os, indent); - os << indent << "RPC Model: " << this->m_RPCParam << std::endl; + os << indent << "RPC Model: " << this->m_RPCParam.get() << std::endl; } } -- GitLab From e7980208ed1467e02eaec1caddb001087f11992d Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 2 Sep 2020 12:17:50 +0200 Subject: [PATCH 007/123] REFAC: Update otbGenericRSTransform so it uses ImageMetadata instead of KeywordLists --- .../Transform/include/otbGenericRSTransform.h | 41 ++++++-------- .../include/otbGenericRSTransform.hxx | 53 +++++++------------ .../Transform/include/otbSensorModelBase.h | 6 ++- 3 files changed, 41 insertions(+), 59 deletions(-) diff --git a/Modules/Core/Transform/include/otbGenericRSTransform.h b/Modules/Core/Transform/include/otbGenericRSTransform.h index 31c9334d13..5d32da1801 100644 --- a/Modules/Core/Transform/include/otbGenericRSTransform.h +++ b/Modules/Core/Transform/include/otbGenericRSTransform.h @@ -22,7 +22,7 @@ #define otbGenericRSTransform_h #include "otbCompositeTransform.h" -#include "otbImageKeywordlist.h" +#include "otbImageMetadata.h" #include namespace otb @@ -101,42 +101,38 @@ public: itkSetStringMacro(OutputProjectionRef); itkGetStringMacro(OutputProjectionRef); - /** Set/Get Dictionary*/ - const itk::MetaDataDictionary& GetInputDictionary() const + /** Set/Get ImageMetadata*/ + const ImageMetadata* GetInputImageMetadata() const { - return m_InputDictionary; + return m_InputImd; } - void SetInputDictionary(const itk::MetaDataDictionary& dictionary) + void SetInputImageMetadata(const ImageMetadata* imd) { - m_InputDictionary = dictionary; + m_InputImd = imd; this->Modified(); } - const itk::MetaDataDictionary& GetOutputDictionary() const + void SetInputImageMetadata(const ImageMetadata imd) { - return m_OutputDictionary; + m_InputImd = &imd; + this->Modified(); } - void SetOutputDictionary(const itk::MetaDataDictionary& dictionary) + const ImageMetadata* GetOutputImageMetadata() const { - m_OutputDictionary = dictionary; - this->Modified(); + return m_OutputImd; } - /** Set/Get Keywordlist*/ - - itkGetMacro(InputKeywordList, ImageKeywordlist); - void SetInputKeywordList(const ImageKeywordlist& kwl) + void SetOutputImageMetadata(const ImageMetadata* imd) { - this->m_InputKeywordList = kwl; + m_OutputImd = imd; this->Modified(); } - itkGetMacro(OutputKeywordList, ImageKeywordlist); - void SetOutputKeywordList(const ImageKeywordlist& kwl) + void SetOutputImageMetadata(const ImageMetadata imd) { - this->m_OutputKeywordList = kwl; + m_OutputImd = &imd; this->Modified(); } @@ -208,11 +204,8 @@ private: GenericRSTransform(const Self&) = delete; void operator=(const Self&) = delete; - ImageKeywordlist m_InputKeywordList; - ImageKeywordlist m_OutputKeywordList; - - itk::MetaDataDictionary m_InputDictionary; - itk::MetaDataDictionary m_OutputDictionary; + const ImageMetadata* m_InputImd; + const ImageMetadata* m_OutputImd; std::string m_InputProjectionRef; std::string m_OutputProjectionRef; diff --git a/Modules/Core/Transform/include/otbGenericRSTransform.hxx b/Modules/Core/Transform/include/otbGenericRSTransform.hxx index 3c6f405aa4..6a185520cc 100644 --- a/Modules/Core/Transform/include/otbGenericRSTransform.hxx +++ b/Modules/Core/Transform/include/otbGenericRSTransform.hxx @@ -24,8 +24,8 @@ #include "otbGenericRSTransform.h" #include "otbMacro.h" #include "otbMetaDataKey.h" -#include "itkMetaDataObject.h" #include "otbRPCForwardTransform.h" +#include "otbRPCInverseTransform.h" #include "otbSpatialReference.h" @@ -39,13 +39,13 @@ GenericRSTransform::GenericRST { m_InputProjectionRef.clear(); m_OutputProjectionRef.clear(); - m_InputKeywordList.Clear(); - m_OutputKeywordList.Clear(); m_InputSpacing.Fill(1); m_InputOrigin.Fill(0); m_OutputSpacing.Fill(1); m_OutputOrigin.Fill(0); + m_InputImd = nullptr; + m_OutputImd = nullptr; m_Transform = nullptr; m_InputTransform = nullptr; m_OutputTransform = nullptr; @@ -74,21 +74,12 @@ void GenericRSTransform::Insta { m_Transform = TransformType::New(); - if (m_InputKeywordList.GetSize() == 0) - { - itk::ExposeMetaData(m_InputDictionary, MetaDataKey::OSSIMKeywordlistKey, m_InputKeywordList); - } - if (m_InputProjectionRef.empty()) - { - itk::ExposeMetaData(m_InputDictionary, MetaDataKey::ProjectionRefKey, m_InputProjectionRef); - } - otbMsgDevMacro(<< "Information to instantiate transform: "); otbMsgDevMacro(<< " * Input Origin: " << m_InputOrigin); otbMsgDevMacro(<< " * Input Spacing: " << m_InputSpacing); - otbMsgDevMacro(<< " * Input keyword list: " << ((m_InputKeywordList.GetSize() == 0) ? "Empty" : "Full")); + otbMsgDevMacro(<< " * Input metadata: " << ((m_InputImd == nullptr) ? "Empty" : "Full")); otbMsgDevMacro(<< " * Input projection: " << m_InputProjectionRef); - otbMsgDevMacro(<< " * Output keyword list: " << ((m_OutputKeywordList.GetSize() == 0) ? "Empty" : "Full")); + otbMsgDevMacro(<< " * Output metadata: " << ((m_OutputImd == nullptr) ? "Empty" : "Full")); otbMsgDevMacro(<< " * Output projection: " << m_OutputProjectionRef); otbMsgDevMacro(<< " * Output Origin: " << m_OutputOrigin); otbMsgDevMacro(<< " * Output Spacing: " << m_OutputSpacing); @@ -121,17 +112,17 @@ void GenericRSTransform::Insta } } - // If not, try to make a sensor model - if ((m_InputTransform.IsNull()) && (m_InputKeywordList.GetSize() > 0)) + // If not, try to make a RPC sensor model + if ((m_InputTransform.IsNull()) && (m_InputImd->Has(MDGeom::RPC))) { - typedef otb::RPCForwardTransform ForwardSensorModelType; - typename ForwardSensorModelType::Pointer sensorModel = ForwardSensorModelType::New(); + typedef otb::RPCForwardTransform RPCForwardTransformType; + typename RPCForwardTransformType::Pointer sensorModel = RPCForwardTransformType::New(); - sensorModel->SetMetadataModel(m_InputKeywordList); + sensorModel->SetMetadataModel((*m_InputImd)[MDGeom::RPC]); if (sensorModel->IsValidSensorModel()) { - m_InputTransform = sensorModel.GetPointer(); + //TODO: m_InputTransform = sensorModel.GetPointer(); inputTransformIsSensor = true; otbMsgDevMacro(<< "Input projection set to sensor model."); } @@ -153,17 +144,17 @@ void GenericRSTransform::Insta } } - // If not, try to make a sensor model - if ((m_OutputTransform.IsNull()) && (m_OutputKeywordList.GetSize() > 0)) + // If not, try to make a RPC sensor model + if ((m_OutputTransform.IsNull()) && (m_OutputImd->Has(MDGeom::RPC))) { - typedef otb::InverseSensorModel InverseSensorModelType; - typename InverseSensorModelType::Pointer sensorModel = InverseSensorModelType::New(); + typedef otb::RPCInverseTransform RPCInverseTransformType; + typename RPCInverseTransformType::Pointer sensorModel = RPCInverseTransformType::New(); - sensorModel->SetImageGeometry(m_OutputKeywordList); + sensorModel->SetMetadataModel((*m_OutputImd)[MDGeom::RPC]); if (sensorModel->IsValidSensorModel()) { - m_OutputTransform = sensorModel.GetPointer(); + //TODO: m_OutputTransform = sensorModel.GetPointer(); outputTransformIsSensor = true; otbMsgDevMacro(<< "Output projection set to sensor model"); } @@ -258,13 +249,9 @@ bool GenericRSTransform::GetIn inverseTransform->SetInputProjectionRef(m_OutputProjectionRef); inverseTransform->SetOutputProjectionRef(m_InputProjectionRef); - // Switch keywordlists - inverseTransform->SetInputKeywordList(m_OutputKeywordList); - inverseTransform->SetOutputKeywordList(m_InputKeywordList); - - // Switch dictionnaries - inverseTransform->SetInputDictionary(m_OutputDictionary); - inverseTransform->SetOutputDictionary(m_InputDictionary); + // Switch ImageMetadatas + inverseTransform->SetInputImageMetadata(m_OutputImd); + inverseTransform->SetOutputImageMetadata(m_InputImd); // Switch spacings inverseTransform->SetInputSpacing(m_OutputSpacing); diff --git a/Modules/Core/Transform/include/otbSensorModelBase.h b/Modules/Core/Transform/include/otbSensorModelBase.h index 3edd89d0d3..526fcdb278 100644 --- a/Modules/Core/Transform/include/otbSensorModelBase.h +++ b/Modules/Core/Transform/include/otbSensorModelBase.h @@ -49,7 +49,8 @@ class ITK_EXPORT SensorModelBase : public Transform; using Pointer = itk::SmartPointer; @@ -58,6 +59,7 @@ public: using InputPointType = itk::Point; using OutputPointType = itk::Point; using PixelType =TScalarType; + //@} /** Run-time type information (and related methods). */ itkTypeMacro(Self, Superclass); @@ -73,7 +75,7 @@ public: virtual bool SetMetadataModel(boost::any imdModel) = 0; /** Check model validity */ - virtual bool IsValidSensorModel() = 0; + virtual bool IsValidSensorModel() const = 0; protected: SensorModelBase() = default; -- GitLab From 195eaf463c9944989a06b9e80855460bf9dd75fc Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 2 Sep 2020 12:18:49 +0200 Subject: [PATCH 008/123] REFAC: Update ImageToGenericRSOutputParameters so it uses ImageMetadata instead of KeywordLists --- .../otbImageToGenericRSOutputParameters.h | 22 +++++++++++++++---- .../otbImageToGenericRSOutputParameters.hxx | 3 +-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.h b/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.h index 9a8ea947b0..f22bf6c70a 100644 --- a/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.h +++ b/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.h @@ -23,6 +23,7 @@ #include "itkObject.h" #include "otbGenericRSTransform.h" +#include "otbImageKeywordlist.h" #include namespace otb @@ -148,16 +149,29 @@ public: return m_Transform->GetOutputProjectionRef(); } - /** Set/Get Input Keywordlist*/ + /** Set/Get Input Keywordlist + * \deprecated + * TODO: Remove before v8.0.0 + */ void SetInputKeywordList(const ImageKeywordlist& kwl) { - m_Transform->SetOutputKeywordList(kwl); - this->Modified(); } const ImageKeywordlist GetInputKeywordList() { - return m_Transform->GetOutputKeywordList(); + } + + /** Set/Get Input ImageMetadata + */ + void SetInputImageMetadata(ImageMetadata* imd) + { + m_Transform->SetOutputImageMetadata(imd); + this->Modified(); + } + + const ImageMetadata* GetInputImageMetadata() + { + return m_Transform->GetOutputImageMetadata(); } /** Method to trigger the output parameters */ diff --git a/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.hxx b/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.hxx index 896dab248d..e1d036521c 100644 --- a/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.hxx +++ b/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.hxx @@ -73,9 +73,8 @@ void ImageToGenericRSOutputParameters::Compute() template void ImageToGenericRSOutputParameters::UpdateTransform() { - m_Transform->SetOutputDictionary(this->GetInput()->GetMetaDataDictionary()); + m_Transform->SetOutputImageMetadata(this->GetInput()->GetImageMetadata()); m_Transform->SetOutputProjectionRef(this->GetInput()->GetProjectionRef()); - m_Transform->SetOutputKeywordList(this->GetInput()->GetImageKeywordlist()); m_Transform->InstantiateTransform(); } -- GitLab From 090e88eac64b3d508d5b6b40d81af62c955b5b76 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 2 Sep 2020 12:19:27 +0200 Subject: [PATCH 009/123] REFACT: Update filters so they use ImageMetadata instead of KeywordLists --- .../DEM/include/otbDEMToImageGenerator.h | 37 +++++++--- .../DEM/include/otbDEMToImageGenerator.hxx | 14 +--- .../test/otbRegionProjectionResampler.cxx | 4 +- .../otbGCPsToRPCSensorModelImageFilter.hxx | 2 +- .../include/otbGenericRSResampleImageFilter.h | 40 ++++++++--- .../otbGenericRSResampleImageFilter.hxx | 23 +++--- .../include/otbGeometriesProjectionFilter.h | 36 ++++++---- .../include/otbGeometriesProjectionFilter.hxx | 19 +++-- .../include/otbGroundSpacingImageFunction.hxx | 3 +- .../otbImageToEnvelopeVectorDataFilter.hxx | 2 +- ...otbPhysicalToRPCSensorModelImageFilter.hxx | 2 +- .../include/otbVectorDataProjectionFilter.hxx | 24 ++----- .../src/otbGeometriesProjectionFilter.cxx | 4 +- .../Projection/test/otbCompositeTransform.cxx | 7 +- ...RPCSensorModelImageFilterCheckRpcModel.cxx | 3 +- .../test/otbGenericRSTransformFromImage.cxx | 12 ++-- .../test/otbGenericRSTransformGenericTest.cxx | 5 +- ...metriesProjectionFilterFromMapToSensor.cxx | 2 +- .../Projection/test/otbSensorModel.cxx | 72 ++++++++++--------- .../otbTileImageFilterRSTransformTest.cxx | 5 +- .../include/otbVectorDataExtractROI.hxx | 4 +- 21 files changed, 180 insertions(+), 140 deletions(-) diff --git a/Modules/Filtering/DEM/include/otbDEMToImageGenerator.h b/Modules/Filtering/DEM/include/otbDEMToImageGenerator.h index bf77133120..2b63ff508f 100644 --- a/Modules/Filtering/DEM/include/otbDEMToImageGenerator.h +++ b/Modules/Filtering/DEM/include/otbDEMToImageGenerator.h @@ -137,27 +137,48 @@ public: return m_Transform->GetInputProjectionRef(); } - /** Set/Get Input Keywordlist*/ + /** Set/Get Input Keywordlist + * \deprecated + */ void SetInputKeywordList(const ImageKeywordlist& kwl) { - m_Transform->SetOutputKeywordList(kwl); - this->Modified(); } const ImageKeywordlist GetInputKeywordList() { - return m_Transform->GetOutputKeywordList(); } - /** Set/Get output Keywordlist*/ + /** Set/Get output Keywordlist + * \deprecated + */ void SetOutputKeywordList(const ImageKeywordlist& kwl) { - m_Transform->SetInputKeywordList(kwl); - this->Modified(); } const ImageKeywordlist GetOutputKeywordList() { - return m_Transform->GetInputKeywordList(); + } + + /** Set/Get ImageMetadata*/ + const ImageMetadata* GetInputImageMetadata() const + { + return m_Transform->GetInputImageMetadata(); + } + + void SetInputImageMetadata(ImageMetadata* imd) + { + m_Transform->SetInputImageMetadata(imd); + this->Modified(); + } + + const ImageMetadata* GetOutputImageMetadata() const + { + return m_Transform->GetOutputImageMetadata(); + } + + void SetOutputImageMetadata(ImageMetadata* imd) + { + m_Transform->SetOutputImageMetadata(imd); + this->Modified(); } /** Useful to set the output parameters from an existing image*/ diff --git a/Modules/Filtering/DEM/include/otbDEMToImageGenerator.hxx b/Modules/Filtering/DEM/include/otbDEMToImageGenerator.hxx index bd9c303488..4fab810d4a 100644 --- a/Modules/Filtering/DEM/include/otbDEMToImageGenerator.hxx +++ b/Modules/Filtering/DEM/include/otbDEMToImageGenerator.hxx @@ -64,17 +64,9 @@ void DEMToImageGenerator::GenerateOutputInformation() output->SetSignedSpacing(m_OutputSpacing); output->SetOrigin(m_OutputOrigin); - - // Get the Output MetaData Dictionary - itk::MetaDataDictionary& dict = output->GetMetaDataDictionary(); - - // Encapsulate the metadata set by the user - itk::EncapsulateMetaData(dict, MetaDataKey::ProjectionRefKey, m_Transform->GetInputProjectionRef()); - - if (this->GetOutputKeywordList().GetSize() > 0) - { - itk::EncapsulateMetaData(dict, MetaDataKey::OSSIMKeywordlistKey, m_Transform->GetInputKeywordList()); - } + // Add the metadata set by the user to the output + output->m_Imd.Add(MDGeom::ProjectionProj, m_Transform->GetInputProjectionRef()); + output->m_Imd.Merge(*m_Transform->GetInputImageMetadata()); } // InstantiateTransform method diff --git a/Modules/Filtering/ImageManipulation/test/otbRegionProjectionResampler.cxx b/Modules/Filtering/ImageManipulation/test/otbRegionProjectionResampler.cxx index 5b1e2a2b0f..f4f46d47c8 100644 --- a/Modules/Filtering/ImageManipulation/test/otbRegionProjectionResampler.cxx +++ b/Modules/Filtering/ImageManipulation/test/otbRegionProjectionResampler.cxx @@ -61,7 +61,7 @@ int otbRegionProjectionResampler(int argc, char* argv[]) typedef otb::Image ImageType; typedef otb::ImageFileReader ReaderType; typedef otb::ImageFileWriter WriterType; - typedef otb::RPCInverseTransform ModelType; + typedef otb::RPCInverseTransform ModelType; typedef itk::LinearInterpolateImageFunction InterpolatorType; typedef itk::RescaleIntensityImageFilter RescalerType; typedef otb::StreamingResampleImageFilter ResamplerType; @@ -90,7 +90,7 @@ int otbRegionProjectionResampler(int argc, char* argv[]) reader->GenerateOutputInformation(); ImageType::ConstPointer inputImage = reader->GetOutput(); - model->SetImageGeometry(reader->GetOutput()->GetImageKeywordlist()); + model->SetMetadataModel(reader->GetOutput()->GetImageMetadata()[otb::MDGeom::RPC]); if (model->IsValidSensorModel() == false) { diff --git a/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.hxx b/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.hxx index c13ebc85e5..5f033b6188 100644 --- a/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.hxx +++ b/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.hxx @@ -223,7 +223,7 @@ void GCPsToRPCSensorModelImageFilter::ComputeErrors() typedef GenericRSTransform RSTransformType; RSTransformType::Pointer rsTransform = RSTransformType::New(); - rsTransform->SetInputKeywordList(m_Keywordlist); + rsTransform->SetInputImageMetadata(this->GetOutput()->GetImageMetadata()); rsTransform->InstantiateTransform(); ContinuousIndexType idFix, idOut; diff --git a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.h b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.h index 0fd11cdabe..f6be28090a 100644 --- a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.h +++ b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.h @@ -167,27 +167,51 @@ public: return m_Transform->GetInputProjectionRef(); } - /** Set/Get Input Keywordlist*/ + /** Set/Get Input Keywordlist + * \depricated + */ void SetInputKeywordList(const ImageKeywordlist& kwl) { - m_Transform->SetOutputKeywordList(kwl); - this->Modified(); } const ImageKeywordlist GetInputKeywordList() { - return m_Transform->GetOutputKeywordList(); } - /** Set/Get output Keywordlist*/ + /** Set/Get output Keywordlist + * \depricated + */ void SetOutputKeywordList(const ImageKeywordlist& kwl) { - m_Transform->SetInputKeywordList(kwl); - this->Modified(); } const ImageKeywordlist GetOutputKeywordList() { - return m_Transform->GetInputKeywordList(); + } + + /** Set/Get Input ImageMetadata + */ + void SetInputImageMetadata(ImageMetadata* imd) + { + m_Transform->SetOutputImageMetadata(imd); + this->Modified(); + } + + const ImageMetadata* GetInputImageMetadata() + { + return m_Transform->GetOutputImageMetadata(); + } + + /** Set/Get Output ImageMetadata + */ + void SetOutputImageMetadata(ImageMetadata* imd) + { + m_Transform->SetInputImageMetadata(imd); + this->Modified(); + } + + const ImageMetadata* GetOutputImageMetadata() + { + return m_Transform->GetInputImageMetadata(); } /** Useful to set the output parameters from an existing image*/ diff --git a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx index 6f971ebc42..365c674f42 100644 --- a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx +++ b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx @@ -125,20 +125,16 @@ void GenericRSResampleImageFilter::EstimateOutputRpcM tempPtr->SetRegions(region); // Encapsulate the output metadata in the temp image - itk::MetaDataDictionary& tempDict = tempPtr->GetMetaDataDictionary(); - itk::EncapsulateMetaData(tempDict, MetaDataKey::ProjectionRefKey, this->GetOutputProjectionRef()); - itk::EncapsulateMetaData(tempDict, MetaDataKey::OSSIMKeywordlistKey, this->GetOutputKeywordList()); + tempPtr->m_Imd.Add(MDGeom::ProjectionProj, this->GetOutputProjectionRef()); + ImageMetadata* imd = const_cast(this->GetOutputImageMetadata()); + tempPtr->m_Imd.Merge(*imd); // Estimate the rpc model from the temp image m_OutputRpcEstimator->SetInput(tempPtr); m_OutputRpcEstimator->UpdateOutputInformation(); - // Encapsulate the estimated rpc model in the output - if (m_OutputRpcEstimator->GetOutput()->GetImageKeywordlist().GetSize() > 0) - { - // Fill the transform with the right kwl - m_Transform->SetInputKeywordList(m_OutputRpcEstimator->GetOutput()->GetImageKeywordlist()); - } + // Fill the transform with the right metadata + m_Transform->SetInputImageMetadata(m_OutputRpcEstimator->GetOutput()->GetImageMetadata()); } /** @@ -150,9 +146,8 @@ void GenericRSResampleImageFilter::UpdateTransform() { if (!m_EstimateInputRpcModel) { - m_Transform->SetOutputDictionary(this->GetInput()->GetMetaDataDictionary()); + m_Transform->SetOutputImageMetadata(this->GetInput()->GetImageMetadata()); m_Transform->SetOutputProjectionRef(this->GetInput()->GetProjectionRef()); - m_Transform->SetOutputKeywordList(this->GetInput()->GetImageKeywordlist()); } m_Transform->InstantiateTransform(); } @@ -187,10 +182,8 @@ void GenericRSResampleImageFilter::EstimateInputRpcMo m_InputRpcEstimator->SetInput(tempPtr); m_InputRpcEstimator->UpdateOutputInformation(); - // No need to override the input kwl, just setup the - // transform with the kwl estimated - if (m_InputRpcEstimator->GetInput()->GetImageKeywordlist().GetSize() > 0) - m_Transform->SetOutputKeywordList(m_InputRpcEstimator->GetOutput()->GetImageKeywordlist()); + // setup the transform with the estimated RPC model + m_Transform->SetOutputImageMetadata(m_InputRpcEstimator->GetOutput()->GetImageMetadata()); // Update the flag for input rpcEstimation in order to not compute // the rpc model for each stream diff --git a/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.h b/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.h index 6ee68daec0..d612e9bf92 100644 --- a/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.h +++ b/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.h @@ -26,6 +26,8 @@ #include "otbImageReference.h" #include "itkTransform.h" #include "otbGenericRSTransform.h" +#include "otbImageMetadata.h" +#include "otbImageKeywordlist.h" #include "OTBProjectionExport.h" #include @@ -143,21 +145,20 @@ private: * \since OTB v 3.14.0 * * \param[in] InputGeometriesSet - * \param[in] InputKeywordList if the \em InputGeometriesSet doesn't have a + * \param[in] InputImageMetadata if the \em InputGeometriesSet doesn't have a * projection reference (i.e. a \c OGRSpatialReference), this filter will use - * the \em InputKeywordList to describe the positionning of the geometries set. + * the \em InputImageMetadata to describe the positionning of the geometries set. * * \param[in,out] OutputGeometriesSet This set of geometries needs to be given to * the filter (in order to set the exact output file/OGR driver). However the * filter is in charge of filling the geometries set. * \param[in] OutputProjectionRef wkt description of the \c OGRSpatialReference * to project the \em InputGeometriesSet into. - * \param[in] OutputKeywordList if no \em OutputProjectionRef is set, the - * projection will be done according to the \em OutputKeywordList. + * \param[in] OutputImageMetadata if no \em OutputProjectionRef is set, the + * projection will be done according to the \em OutputImageMetadata. * * \note Unlike \c VectorDataProjectionFilter, we have to explicitly set which - * to use between projection reference or keyword list. There is no \em - * MetaDataDictionary property. + * to use between projection reference or ImageMetadata. * * \note This filter does not support \em in-place transformation as the spatial * references of the new layer are expected to change. @@ -252,13 +253,22 @@ public: void SetInputOrigin(ImageReference::OriginType const& origin); void SetOutputOrigin(ImageReference::OriginType const& origin); //@} - /**\name Keywords lists accessors and mutators */ + + /**\name Keywords lists accessors and mutators + * \deprecated + */ + ImageKeywordlist& GetInputKeywordList(){}; + void SetInputKeywordList(const ImageKeywordlist& kwl){}; + + /**\name ImageMetadata accessors and mutators */ //@{ - itkGetMacro(InputKeywordList, ImageKeywordlist); - void SetInputKeywordList(const ImageKeywordlist& kwl); + itkGetMacro(InputImageMetadata, ImageMetadata*); + void SetInputImageMetadata(ImageMetadata* imd); + void SetInputImageMetadata(ImageMetadata imd); - itkGetMacro(OutputKeywordList, ImageKeywordlist); - void SetOutputKeywordList(const ImageKeywordlist& kwl); + itkGetMacro(OutputImageMetadata, ImageMetadata*); + void SetOutputImageMetadata(ImageMetadata* imd); + void SetOutputImageMetadata(ImageMetadata imd); //@} /**\name Projection references accessors and mutators @@ -296,8 +306,8 @@ private: //@} std::string m_OutputProjectionRef; // in WKT format! - ImageKeywordlist m_InputKeywordList; - ImageKeywordlist m_OutputKeywordList; + ImageMetadata* m_InputImageMetadata = nullptr; + ImageMetadata* m_OutputImageMetadata = nullptr; }; } // end namespace otb diff --git a/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.hxx b/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.hxx index b62b6978f9..6c4757f1fd 100644 --- a/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.hxx +++ b/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.hxx @@ -79,16 +79,27 @@ inline void otb::GeometriesProjectionFilter::SetOutputOrigin(ImageReference::Ori m_OutputImageReference.SetOrigin(origin); } +inline void otb::GeometriesProjectionFilter::SetInputImageMetadata(ImageMetadata* imd) +{ + this->m_InputImageMetadata = imd; + this->Modified(); +} + +inline void otb::GeometriesProjectionFilter::SetInputImageMetadata(ImageMetadata imd) +{ + this->m_InputImageMetadata = &imd; + this->Modified(); +} -inline void otb::GeometriesProjectionFilter::SetInputKeywordList(const ImageKeywordlist& kwl) +inline void otb::GeometriesProjectionFilter::SetOutputImageMetadata(ImageMetadata* imd) { - this->m_InputKeywordList = kwl; + this->m_OutputImageMetadata = imd; this->Modified(); } -inline void otb::GeometriesProjectionFilter::SetOutputKeywordList(const ImageKeywordlist& kwl) +inline void otb::GeometriesProjectionFilter::SetOutputImageMetadata(ImageMetadata imd) { - this->m_OutputKeywordList = kwl; + this->m_OutputImageMetadata = &imd; this->Modified(); } diff --git a/Modules/Filtering/Projection/include/otbGroundSpacingImageFunction.hxx b/Modules/Filtering/Projection/include/otbGroundSpacingImageFunction.hxx index c327b5758e..f0f4483821 100644 --- a/Modules/Filtering/Projection/include/otbGroundSpacingImageFunction.hxx +++ b/Modules/Filtering/Projection/include/otbGroundSpacingImageFunction.hxx @@ -116,8 +116,7 @@ GroundSpacingImageFunction::GetPixelLocation(const Index } TransformType::Pointer transform = TransformType::New(); - const itk::MetaDataDictionary& inputDict = this->GetInputImage()->GetMetaDataDictionary(); - transform->SetInputDictionary(inputDict); + transform->SetOutputImageMetadata(this->GetInputImage()->GetImageMetadata()); transform->SetInputOrigin(this->GetInputImage()->GetOrigin()); transform->SetInputSpacing(this->GetInputImage()->GetSignedSpacing()); diff --git a/Modules/Filtering/Projection/include/otbImageToEnvelopeVectorDataFilter.hxx b/Modules/Filtering/Projection/include/otbImageToEnvelopeVectorDataFilter.hxx index 29322b3254..6267a11906 100644 --- a/Modules/Filtering/Projection/include/otbImageToEnvelopeVectorDataFilter.hxx +++ b/Modules/Filtering/Projection/include/otbImageToEnvelopeVectorDataFilter.hxx @@ -101,7 +101,7 @@ void ImageToEnvelopeVectorDataFilter::Instantiat m_Transform = InternalTransformType::New(); m_Transform->SetOutputProjectionRef(m_OutputProjectionRef); m_Transform->SetInputProjectionRef(inputPtr->GetProjectionRef()); - m_Transform->SetInputKeywordList(inputPtr->GetImageKeywordlist()); + m_Transform->SetInputImageMetadata(inputPtr->GetImageMetadata()); m_Transform->InstantiateTransform(); } diff --git a/Modules/Filtering/Projection/include/otbPhysicalToRPCSensorModelImageFilter.hxx b/Modules/Filtering/Projection/include/otbPhysicalToRPCSensorModelImageFilter.hxx index 1e2cbc68a0..6ef55ef81d 100644 --- a/Modules/Filtering/Projection/include/otbPhysicalToRPCSensorModelImageFilter.hxx +++ b/Modules/Filtering/Projection/include/otbPhysicalToRPCSensorModelImageFilter.hxx @@ -65,7 +65,7 @@ void PhysicalToRPCSensorModelImageFilter::GenerateOutputInformation() // Build the grid // Generate GCPs from physical sensor model RSTransformPointerType rsTransform = RSTransformType::New(); - rsTransform->SetInputKeywordList(input->GetImageKeywordlist()); + rsTransform->SetInputImageMetadata(input->GetImageMetadata()); rsTransform->InstantiateTransform(); // Compute the size of the grid diff --git a/Modules/Filtering/Projection/include/otbVectorDataProjectionFilter.hxx b/Modules/Filtering/Projection/include/otbVectorDataProjectionFilter.hxx index 286e061e64..7297fcfad2 100644 --- a/Modules/Filtering/Projection/include/otbVectorDataProjectionFilter.hxx +++ b/Modules/Filtering/Projection/include/otbVectorDataProjectionFilter.hxx @@ -241,35 +241,19 @@ VectorDataProjectionFilter::ProcessPolygonL template void VectorDataProjectionFilter::InstantiateTransform(void) { - - // otbMsgDevMacro(<< "Information to instantiate transform (VectorDataProjectionFilter): "); - // otbMsgDevMacro(<< " * Input Origin: " << m_InputOrigin); - // otbMsgDevMacro(<< " * Input Spacing: " << m_InputSpacing); - // otbMsgDevMacro(<< " * Input keyword list: " - // << ((m_InputKeywordList.GetSize() == 0)?"Empty":"Full")); - // otbMsgDevMacro(<< " * Input projection: " << m_InputProjectionRef); - // otbMsgDevMacro(<< " * Output keyword list: " - // << ((m_OutputKeywordList.GetSize() == 0)?"Empty":"Full")); - // otbMsgDevMacro(<< " * Output projection: " << m_OutputProjectionRef); - // otbMsgDevMacro(<< " * Output Origin: " << m_OutputOrigin); - // otbMsgDevMacro(<< " * Output Spacing: " << m_OutputSpacing); - m_Transform = InternalTransformType::New(); - InputVectorDataPointer input = this->GetInput(); - const itk::MetaDataDictionary& inputDict = input->GetMetaDataDictionary(); + InputVectorDataPointer input = this->GetInput(); + // TODO: ImageMetadata& inputImageMetadata = input->GetImageMetadata(); OutputVectorDataPointer output = this->GetOutput(); itk::MetaDataDictionary& outputDict = output->GetMetaDataDictionary(); - // m_Transform->SetInputDictionary(input->GetMetaDataDictionary()); - m_Transform->SetInputDictionary(inputDict); - m_Transform->SetOutputDictionary(output->GetMetaDataDictionary()); + // TODO: m_Transform->SetInputImageMetadata(&inputImageMetadata); + // TODO: m_Transform->SetOutputImageMetadata(&(output->GetImageMetadata())); m_Transform->SetInputProjectionRef(m_InputProjectionRef); m_Transform->SetOutputProjectionRef(m_OutputProjectionRef); - m_Transform->SetInputKeywordList(m_InputKeywordList); - m_Transform->SetOutputKeywordList(m_OutputKeywordList); m_Transform->SetInputSpacing(m_InputSpacing); m_Transform->SetInputOrigin(m_InputOrigin); m_Transform->SetOutputSpacing(m_OutputSpacing); diff --git a/Modules/Filtering/Projection/src/otbGeometriesProjectionFilter.cxx b/Modules/Filtering/Projection/src/otbGeometriesProjectionFilter.cxx index 53d9503ee5..cf243035fc 100644 --- a/Modules/Filtering/Projection/src/otbGeometriesProjectionFilter.cxx +++ b/Modules/Filtering/Projection/src/otbGeometriesProjectionFilter.cxx @@ -178,8 +178,8 @@ void otb::GeometriesProjectionFilter::DoFinalizeInitialization() // process is known // m_Transform->SetInputProjectionRef(m_InputProjectionRef); m_Transform->SetOutputProjectionRef(m_OutputProjectionRef); - m_Transform->SetInputKeywordList(m_InputKeywordList); - m_Transform->SetOutputKeywordList(m_OutputKeywordList); + m_Transform->SetInputImageMetadata(m_InputImageMetadata); + m_Transform->SetOutputImageMetadata(m_OutputImageMetadata); m_Transform->SetInputSpacing(m_InputImageReference.GetSpacing()); m_Transform->SetInputOrigin(m_InputImageReference.GetOrigin()); diff --git a/Modules/Filtering/Projection/test/otbCompositeTransform.cxx b/Modules/Filtering/Projection/test/otbCompositeTransform.cxx index 0f69fe3c32..67cd2596da 100644 --- a/Modules/Filtering/Projection/test/otbCompositeTransform.cxx +++ b/Modules/Filtering/Projection/test/otbCompositeTransform.cxx @@ -27,7 +27,8 @@ #include "otbGenericMapProjection.h" #include "otbSpatialReference.h" #include "otbCompositeTransform.h" -#include "otbInverseSensorModel.h" +#include "otbRPCInverseTransform.h" +#include "otbMetaDataKey.h" int otbCompositeTransform(int argc, char* argv[]) { @@ -54,9 +55,9 @@ int otbCompositeTransform(int argc, char* argv[]) // UTM31N mapProjection->SetWkt(otb::SpatialReference::FromEPSG(32631).ToWkt()); - typedef otb::InverseSensorModel SensorModelType; + typedef otb::RPCInverseTransform SensorModelType; SensorModelType::Pointer sensorModel = SensorModelType::New(); - sensorModel->SetImageGeometry(reader->GetOutput()->GetImageKeywordlist()); + sensorModel->SetMetadataModel(reader->GetOutput()->GetImageMetadata()[otb::MDGeom::RPC]); if (sensorModel->IsValidSensorModel() == false) { diff --git a/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx index f9eec4089a..498f5a02d8 100644 --- a/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx +++ b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx @@ -90,7 +90,8 @@ int otbGCPsToRPCSensorModelImageFilterCheckRpcModel(int argc, char* argv[]) // geographical coordinates. GenericRSTransformType::Pointer grsTrasnform = GenericRSTransformType::New(); - grsTrasnform->SetInputKeywordList(rpcEstimator->GetKeywordlist()); + //TODO OSSIM:Update GCPsToRPCSensorModelImageFilter so it uses ImageMetdata instead of KeywordList + //grsTrasnform->SetInputKeywordList(rpcEstimator->GetKeywordlist()); otbLogMacro(Debug, << rpcEstimator->GetKeywordlist()); grsTrasnform->SetOutputProjectionRef("EPSG:4326"); diff --git a/Modules/Filtering/Projection/test/otbGenericRSTransformFromImage.cxx b/Modules/Filtering/Projection/test/otbGenericRSTransformFromImage.cxx index 4a8af39b5b..4c16a70f24 100644 --- a/Modules/Filtering/Projection/test/otbGenericRSTransformFromImage.cxx +++ b/Modules/Filtering/Projection/test/otbGenericRSTransformFromImage.cxx @@ -65,13 +65,13 @@ int otbGenericRSTransformFromImage(int itkNotUsed(argc), char* argv[]) TransformType::Pointer wgs2img = TransformType::New(); wgs2img->SetInputProjectionRef(wgsRef); wgs2img->SetOutputProjectionRef(reader->GetOutput()->GetProjectionRef()); - wgs2img->SetOutputKeywordList(reader->GetOutput()->GetImageKeywordlist()); + wgs2img->SetOutputImageMetadata(reader->GetOutput()->GetImageMetadata()); wgs2img->InstantiateTransform(); // Instantiate Image->WGS transform TransformType::Pointer img2wgs = TransformType::New(); img2wgs->SetInputProjectionRef(reader->GetOutput()->GetProjectionRef()); - img2wgs->SetInputKeywordList(reader->GetOutput()->GetImageKeywordlist()); + img2wgs->SetInputImageMetadata(reader->GetOutput()->GetImageMetadata()); img2wgs->SetOutputProjectionRef(wgsRef); img2wgs->InstantiateTransform(); @@ -126,13 +126,13 @@ int otbGenericRSTransformImageAndMNTToWGS84ConversionChecking(int itkNotUsed(arg TransformType::Pointer wgs2img = TransformType::New(); wgs2img->SetInputProjectionRef(wgsRef); wgs2img->SetOutputProjectionRef(reader->GetOutput()->GetProjectionRef()); - wgs2img->SetOutputKeywordList(reader->GetOutput()->GetImageKeywordlist()); + wgs2img->SetOutputImageMetadata(reader->GetOutput()->GetImageMetadata()); wgs2img->InstantiateTransform(); // Instantiate Image->WGS transform TransformType::Pointer img2wgs = TransformType::New(); img2wgs->SetInputProjectionRef(reader->GetOutput()->GetProjectionRef()); - img2wgs->SetInputKeywordList(reader->GetOutput()->GetImageKeywordlist()); + img2wgs->SetInputImageMetadata(reader->GetOutput()->GetImageMetadata()); img2wgs->SetOutputProjectionRef(wgsRef); img2wgs->InstantiateTransform(); @@ -141,13 +141,13 @@ int otbGenericRSTransformImageAndMNTToWGS84ConversionChecking(int itkNotUsed(arg Transform3DType::Pointer wgs2img3d = Transform3DType::New(); wgs2img3d->SetInputProjectionRef(wgsRef); wgs2img3d->SetOutputProjectionRef(reader->GetOutput()->GetProjectionRef()); - wgs2img3d->SetOutputKeywordList(reader->GetOutput()->GetImageKeywordlist()); + wgs2img3d->SetOutputImageMetadata(reader->GetOutput()->GetImageMetadata()); wgs2img3d->InstantiateTransform(); // Instantiate Image->WGS transform 3D Transform3DType::Pointer img2wgs3d = Transform3DType::New(); img2wgs3d->SetInputProjectionRef(reader->GetOutput()->GetProjectionRef()); - img2wgs3d->SetInputKeywordList(reader->GetOutput()->GetImageKeywordlist()); + img2wgs3d->SetInputImageMetadata(reader->GetOutput()->GetImageMetadata()); img2wgs3d->SetOutputProjectionRef(wgsRef); img2wgs3d->InstantiateTransform(); diff --git a/Modules/Filtering/Projection/test/otbGenericRSTransformGenericTest.cxx b/Modules/Filtering/Projection/test/otbGenericRSTransformGenericTest.cxx index 9f01ebb03a..8d242741f4 100644 --- a/Modules/Filtering/Projection/test/otbGenericRSTransformGenericTest.cxx +++ b/Modules/Filtering/Projection/test/otbGenericRSTransformGenericTest.cxx @@ -25,6 +25,7 @@ #include "itkEuclideanDistanceMetric.h" #include "otbSpatialReference.h" #include "otbGeographicalDistance.h" +#include "otbDEMHandler.h" typedef otb::Image ImageType; typedef otb::ImageFileReader ReaderType; @@ -74,7 +75,7 @@ int otbGenericRSTransformGenericTest(int argc, char* argv[]) reader->UpdateOutputInformation(); transform->SetInputProjectionRef(reader->GetOutput()->GetProjectionRef()); - transform->SetInputKeywordList(reader->GetOutput()->GetImageKeywordlist()); + transform->SetInputImageMetadata(reader->GetOutput()->GetImageMetadata()); std::cout << "Input projection read from image: " << argv[6] << std::endl; } @@ -110,7 +111,7 @@ int otbGenericRSTransformGenericTest(int argc, char* argv[]) reader->UpdateOutputInformation(); transform->SetOutputProjectionRef(reader->GetOutput()->GetProjectionRef()); - transform->SetOutputKeywordList(reader->GetOutput()->GetImageKeywordlist()); + transform->SetOutputImageMetadata(reader->GetOutput()->GetImageMetadata()); std::cout << "Output projection read from image: " << argv[8] << std::endl; } diff --git a/Modules/Filtering/Projection/test/otbGeometriesProjectionFilterFromMapToSensor.cxx b/Modules/Filtering/Projection/test/otbGeometriesProjectionFilterFromMapToSensor.cxx index e7319be24a..7595e52004 100644 --- a/Modules/Filtering/Projection/test/otbGeometriesProjectionFilterFromMapToSensor.cxx +++ b/Modules/Filtering/Projection/test/otbGeometriesProjectionFilterFromMapToSensor.cxx @@ -61,7 +61,7 @@ int otbGeometriesProjectionFilterFromMapToSensor(int argc, char* argv[]) GeometriesFilterType::Pointer filter = GeometriesFilterType::New(); filter->SetInput(in_set); filter->SetOutput(out_set); - filter->SetOutputKeywordList(imageReader->GetOutput()->GetImageKeywordlist()); + filter->SetOutputImageMetadata(imageReader->GetOutput()->GetImageMetadata()); filter->SetOutputOrigin(imageReader->GetOutput()->GetOrigin()); filter->SetOutputSpacing(imageReader->GetOutput()->GetSignedSpacing()); diff --git a/Modules/Filtering/Projection/test/otbSensorModel.cxx b/Modules/Filtering/Projection/test/otbSensorModel.cxx index 4edf7baf7d..76f673f773 100644 --- a/Modules/Filtering/Projection/test/otbSensorModel.cxx +++ b/Modules/Filtering/Projection/test/otbSensorModel.cxx @@ -27,6 +27,7 @@ #include "otbVectorImage.h" #include "otbImageFileReader.h" +#include "otbImageMetadata.h" #include "otbRPCForwardTransform.h" #include "otbRPCInverseTransform.h" #include "otbDEMHandler.h" @@ -57,37 +58,37 @@ typedef otb::VectorImage ImageType; typedef itk::Statistics::EuclideanDistanceMetric DistanceType; typedef otb::GeographicalDistance GeographicalDistanceType; -int produceGCP(char* outputgcpfilename, const otb::ImageKeywordlist& kwlist, bool useForwardSensorModel = true, double z = 16.19688987731934) +int produceGCP(char* outputgcpfilename, const otb::ImageMetadata& imd, bool useForwardSensorModel = true, double z = 16.19688987731934) { itk::Point imagePoint; itk::Point geoPoint; // otbForwardSensorModel - typedef otb::RPCForwardTransform ForwardSensorModelType; + typedef otb::RPCForwardTransform ForwardSensorModelType; ForwardSensorModelType::Pointer forwardSensorModel = ForwardSensorModelType::New(); - forwardSensorModel->SetImageGeometry(kwlist); + forwardSensorModel->SetMetadataModel(imd[otb::MDGeom::RPC]); if (forwardSensorModel->IsValidSensorModel() == false) { - otbLogMacro(Warning, << "Invalid Model pointer m_Model == NULL!\n The ossim keywordlist is invalid!"); + otbLogMacro(Warning, << "Invalid Model pointer m_Model == NULL!\n The metadata is invalid!"); return EXIT_FAILURE; } otb::DEMHandler::Instance()->SetDefaultHeightAboveEllipsoid(z); // ossim classes - ossimKeywordlist ossimKwlist; - kwlist.convertToOSSIMKeywordlist(ossimKwlist); - - ossimProjection* ossimSensorModel = ossimSensorModelFactory::instance()->createProjection(ossimKwlist); - if (ossimSensorModel == nullptr) - { - ossimSensorModel = ossimplugins::ossimPluginProjectionFactory::instance()->createProjection(ossimKwlist); - } - if (ossimSensorModel == nullptr) // Model validity - { - std::cerr << "Invalid sensor model (ossimSensorModel is NULL)" << std::endl; - return EXIT_FAILURE; - } +// ossimKeywordlist ossimKwlist; +// kwlist.convertToOSSIMKeywordlist(ossimKwlist); +// +// ossimProjection* ossimSensorModel = ossimSensorModelFactory::instance()->createProjection(ossimKwlist); +// if (ossimSensorModel == nullptr) +// { +// ossimSensorModel = ossimplugins::ossimPluginProjectionFactory::instance()->createProjection(ossimKwlist); +// } +// if (ossimSensorModel == nullptr) // Model validity +// { +// std::cerr << "Invalid sensor model (ossimSensorModel is NULL)" << std::endl; +// return EXIT_FAILURE; +// } std::ofstream file(outputgcpfilename, std::ios::out | std::ios::trunc); if (file) @@ -101,15 +102,15 @@ int produceGCP(char* outputgcpfilename, const otb::ImageKeywordlist& kwlist, boo { geoPoint = forwardSensorModel->TransformPoint(imagePoint); } - else // ossim classes - { - ossimDpt ossimPoint(otb::internal::ConvertToOSSIMFrame(imagePoint[0]), // x - otb::internal::ConvertToOSSIMFrame(imagePoint[1])); // y - ossimGpt ossimGPoint; - ossimSensorModel->lineSampleHeightToWorld(ossimPoint, z, ossimGPoint); - geoPoint[0] = ossimGPoint.lon; - geoPoint[1] = ossimGPoint.lat; - } +// else // ossim classes +// { +// ossimDpt ossimPoint(otb::internal::ConvertToOSSIMFrame(imagePoint[0]), // x +// otb::internal::ConvertToOSSIMFrame(imagePoint[1])); // y +// ossimGpt ossimGPoint; +// ossimSensorModel->lineSampleHeightToWorld(ossimPoint, z, ossimGPoint); +// geoPoint[0] = ossimGPoint.lon; +// geoPoint[1] = ossimGPoint.lat; +// } file << std::setprecision(16) << x << " " << y << " " << geoPoint[0] << " " << geoPoint[1] << " " << z << std::endl; } @@ -177,6 +178,7 @@ int otbSensorModel(int argc, char* argv[]) // Some instantiations // ------------------- otb::ImageKeywordlist kwlist = otb::ReadGeometryFromGEOMFile(geomfilename); + otb::ImageMetadata imd; // TODO: Read metadata from GEOMFile if (!(kwlist.GetSize() > 0)) { @@ -186,39 +188,39 @@ int otbSensorModel(int argc, char* argv[]) if (writeBaseline) { - return produceGCP(outFilename, kwlist); + //TODO when reading geomfiles OK: return produceGCP(outFilename, kwlist); } typedef otb::ImageKeywordlist::KeywordlistMap KeywordlistMapType; KeywordlistMapType kwmap = kwlist.GetKeywordlist(); // otbForwardSensorModel - typedef otb::ForwardSensorModel ForwardSensorModelType; + typedef otb::RPCForwardTransform ForwardSensorModelType; ForwardSensorModelType::Pointer forwardSensorModel = ForwardSensorModelType::New(); if (!forwardSensorModel) { std::cerr << "Invalid sensor model (ForwardSensorModelType::Pointer is NULL)" << std::endl; return EXIT_FAILURE; } - forwardSensorModel->SetImageGeometry(kwlist); + forwardSensorModel->SetMetadataModel(imd[otb::MDGeom::RPC]); if (forwardSensorModel->IsValidSensorModel() == false) { - std::cerr << "Invalid Model pointer m_Model == NULL!\n The ossim keywordlist is invalid!" << std::endl; + std::cerr << "Invalid Model pointer m_Model == NULL!\n The metadata is invalid!" << std::endl; return EXIT_FAILURE; } // otbInverseSensorModel - typedef otb::RPCInverseTransform InverseSensorModelType; + typedef otb::RPCInverseTransform InverseSensorModelType; InverseSensorModelType::Pointer inverseSensorModel = InverseSensorModelType::New(); if (!inverseSensorModel) { std::cerr << "Invalid sensor model (InverseSensorModelType::Pointer is NULL)" << std::endl; return EXIT_FAILURE; } - inverseSensorModel->SetImageGeometry(kwlist); + inverseSensorModel->SetMetadataModel(imd[otb::MDGeom::RPC]); if (inverseSensorModel->IsValidSensorModel() == false) { - std::cerr << "Invalid Model pointer m_Model == NULL!\n The ossim keywordlist is invalid!" << std::endl; + std::cerr << "Invalid Model pointer m_Model == NULL!\n The metadata is invalid!" << std::endl; return EXIT_FAILURE; } @@ -240,7 +242,7 @@ int otbSensorModel(int argc, char* argv[]) } img2wgs->SetInputProjectionRef(""); img2wgs->SetOutputProjectionRef(wgsRef); - img2wgs->SetInputKeywordList(kwlist); + img2wgs->SetInputImageMetadata(&imd); img2wgs->InstantiateTransform(); @@ -253,7 +255,7 @@ int otbSensorModel(int argc, char* argv[]) } wgs2img->SetInputProjectionRef(wgsRef); wgs2img->SetOutputProjectionRef(""); - wgs2img->SetOutputKeywordList(kwlist); + wgs2img->SetOutputImageMetadata(&imd); wgs2img->InstantiateTransform(); // ossim classes diff --git a/Modules/Filtering/Projection/test/otbTileImageFilterRSTransformTest.cxx b/Modules/Filtering/Projection/test/otbTileImageFilterRSTransformTest.cxx index 24ece3588e..8aeaa17c13 100644 --- a/Modules/Filtering/Projection/test/otbTileImageFilterRSTransformTest.cxx +++ b/Modules/Filtering/Projection/test/otbTileImageFilterRSTransformTest.cxx @@ -23,6 +23,7 @@ #include "otbImageFileReader.h" #include "otbGeographicalDistance.h" #include "otbGenericRSTransform.h" +#include "otbDEMHandler.h" #include typedef otb::Image ImageType; @@ -73,7 +74,7 @@ int otbTileImageFilterRSTransformTest(int argc, char* argv[]) // Set-up transform RSTransformType::Pointer rsTransform = RSTransformType::New(); - rsTransform->SetInputKeywordList(reader->GetOutput()->GetImageKeywordlist()); + rsTransform->SetInputImageMetadata(reader->GetOutput()->GetImageMetadata()); rsTransform->InstantiateTransform(); transforms.push_back(rsTransform); @@ -84,7 +85,7 @@ int otbTileImageFilterRSTransformTest(int argc, char* argv[]) // Build RS transform for tiled image RSTransformType::Pointer mosaicRsTransform = RSTransformType::New(); - mosaicRsTransform->SetInputKeywordList(tileFilter->GetOutput()->GetImageKeywordlist()); + mosaicRsTransform->SetInputImageMetadata(tileFilter->GetOutput()->GetImageMetadata()); mosaicRsTransform->InstantiateTransform(); // Check that individual RSTransform gives the same result as tiled diff --git a/Modules/Filtering/VectorDataManipulation/include/otbVectorDataExtractROI.hxx b/Modules/Filtering/VectorDataManipulation/include/otbVectorDataExtractROI.hxx index 76f8da8307..9923e7db2c 100644 --- a/Modules/Filtering/VectorDataManipulation/include/otbVectorDataExtractROI.hxx +++ b/Modules/Filtering/VectorDataManipulation/include/otbVectorDataExtractROI.hxx @@ -428,10 +428,10 @@ void VectorDataExtractROI::ProjectRegionToInputVectorProjection() /** Set up the projection */ genericTransform->SetInputProjectionRef(m_ROI.GetRegionProjection()); - genericTransform->SetInputKeywordList(m_ROI.GetKeywordList()); + //TODO: genericTransform->SetInputImageMetadata(m_ROI.GetImageMetadata()); genericTransform->SetOutputProjectionRef(this->GetInput()->GetProjectionRef()); const itk::MetaDataDictionary& inputDict = this->GetInput()->GetMetaDataDictionary(); - genericTransform->SetOutputDictionary(inputDict); + //TODO: genericTransform->SetOutputImageMetadata(this->GetInput()->GetImageMetadata()); genericTransform->SetOutputOrigin(this->GetInput()->GetOrigin()); genericTransform->SetOutputSpacing(this->GetInput()->GetSpacing()); genericTransform->InstantiateTransform(); -- GitLab From 434a00f2415597c51c0c47efd86aaaeb7ee46dce Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 2 Sep 2020 12:20:21 +0200 Subject: [PATCH 010/123] REFACT: Update Registration module elements so they use ImageMetadata instead of KeywordLists --- .../include/otbDisparityMapTo3DFilter.hxx | 5 +++-- .../include/otbDisparityMapToDEMFilter.hxx | 10 +++++----- .../include/otbMultiDisparityMapTo3DFilter.hxx | 6 ++++-- .../Stereo/include/otbMulti3DMapToDEMFilter.hxx | 11 ++--------- .../otbStereoSensorModelToElevationMapFilter.hxx | 10 +++++----- ...bStereorectificationDisplacementFieldSource.hxx | 14 +++++++------- 6 files changed, 26 insertions(+), 30 deletions(-) diff --git a/Modules/Registration/DisparityMap/include/otbDisparityMapTo3DFilter.hxx b/Modules/Registration/DisparityMap/include/otbDisparityMapTo3DFilter.hxx index 9913889176..6bd8416b88 100644 --- a/Modules/Registration/DisparityMap/include/otbDisparityMapTo3DFilter.hxx +++ b/Modules/Registration/DisparityMap/include/otbDisparityMapTo3DFilter.hxx @@ -200,8 +200,9 @@ void DisparityMapTo3DFilterSetInputKeywordList(m_LeftKeywordList); - m_RightToGroundTransform->SetInputKeywordList(m_RightKeywordList); + //TODO: Replace KeywordLists by ImageMetadatas + //m_LeftToGroundTransform->SetInputKeywordList(m_LeftKeywordList); + //m_RightToGroundTransform->SetInputKeywordList(m_RightKeywordList); m_LeftToGroundTransform->InstantiateTransform(); m_RightToGroundTransform->InstantiateTransform(); diff --git a/Modules/Registration/DisparityMap/include/otbDisparityMapToDEMFilter.hxx b/Modules/Registration/DisparityMap/include/otbDisparityMapToDEMFilter.hxx index 67cda3d520..aa2055d810 100644 --- a/Modules/Registration/DisparityMap/include/otbDisparityMapToDEMFilter.hxx +++ b/Modules/Registration/DisparityMap/include/otbDisparityMapToDEMFilter.hxx @@ -211,11 +211,11 @@ void DisparityMapToDEMFilter RSTransform2DType; RSTransform2DType::Pointer leftToGroundTransform = RSTransform2DType::New(); - leftToGroundTransform->SetInputKeywordList(leftImgPtr->GetImageKeywordlist()); + leftToGroundTransform->SetInputImageMetadata(leftImgPtr->GetImageMetadata()); leftToGroundTransform->InstantiateTransform(); RSTransform2DType::Pointer rightToGroundTransform = RSTransform2DType::New(); - rightToGroundTransform->SetInputKeywordList(rightImgPtr->GetImageKeywordlist()); + rightToGroundTransform->SetInputImageMetadata(rightImgPtr->GetImageMetadata()); rightToGroundTransform->InstantiateTransform(); // left image @@ -335,7 +335,7 @@ void DisparityMapToDEMFilterGetSignedSpacing(); RSTransformType::Pointer groundToLeftTransform = RSTransformType::New(); - groundToLeftTransform->SetOutputKeywordList(leftSensor->GetImageKeywordlist()); + groundToLeftTransform->SetOutputImageMetadata(leftSensor->GetImageMetadata()); groundToLeftTransform->InstantiateTransform(); // For the disparity maps and mask @@ -591,8 +591,8 @@ void DisparityMapToDEMFilterSetInputKeywordList(leftSensor->GetImageKeywordlist()); - m_RightToGroundTransform->SetInputKeywordList(rightSensor->GetImageKeywordlist()); + m_LeftToGroundTransform->SetInputImageMetadata(leftSensor->GetImageMetadata()); + m_RightToGroundTransform->SetInputImageMetadata(rightSensor->GetImageMetadata()); m_LeftToGroundTransform->InstantiateTransform(); m_RightToGroundTransform->InstantiateTransform(); diff --git a/Modules/Registration/DisparityMap/include/otbMultiDisparityMapTo3DFilter.hxx b/Modules/Registration/DisparityMap/include/otbMultiDisparityMapTo3DFilter.hxx index 8439caf6a0..54b6490eb8 100644 --- a/Modules/Registration/DisparityMap/include/otbMultiDisparityMapTo3DFilter.hxx +++ b/Modules/Registration/DisparityMap/include/otbMultiDisparityMapTo3DFilter.hxx @@ -279,14 +279,16 @@ void MultiDisparityMapTo3DFilterm_ReferenceToGroundTransform = RSTransformType::New(); - this->m_ReferenceToGroundTransform->SetInputKeywordList(this->m_ReferenceKeywordList); + //TODO OSSIM: replace KeywordList by ImageMetadata + //this->m_ReferenceToGroundTransform->SetInputKeywordList(this->m_ReferenceKeywordList); this->m_ReferenceToGroundTransform->InstantiateTransform(); this->m_MovingToGroundTransform.clear(); for (unsigned int k = 0; k < this->m_MovingKeywordLists.size(); ++k) { RSTransformType::Pointer transfo = RSTransformType::New(); - transfo->SetInputKeywordList(this->m_MovingKeywordLists[k]); + //TODO OSSIM: replace KeywordList by ImageMetadata + //transfo->SetInputKeywordList(this->m_MovingKeywordLists[k]); transfo->InstantiateTransform(); this->m_MovingToGroundTransform.push_back(transfo); } diff --git a/Modules/Registration/Stereo/include/otbMulti3DMapToDEMFilter.hxx b/Modules/Registration/Stereo/include/otbMulti3DMapToDEMFilter.hxx index a0638a3083..06643f40fe 100644 --- a/Modules/Registration/Stereo/include/otbMulti3DMapToDEMFilter.hxx +++ b/Modules/Registration/Stereo/include/otbMulti3DMapToDEMFilter.hxx @@ -175,8 +175,7 @@ void Multi3DMapToDEMFilter::SetOutputPara T3DImage* imgPtr = const_cast(this->Get3DMapInput(k)); RSTransform2DType::Pointer mapToGroundTransform = RSTransform2DType::New(); - ImageKeywordListType imageKWL = imgPtr->GetImageKeywordlist(); - mapToGroundTransform->SetInputKeywordList(imageKWL); + mapToGroundTransform->SetInputImageMetadata(imgPtr->GetImageMetadata()); /*if(!m_ProjectionRef.empty()) { @@ -219,12 +218,6 @@ void Multi3DMapToDEMFilter::SetOutputPara box_xmax = std::max(box_xmax, xmax); box_ymin = std::min(box_ymin, ymin); box_ymax = std::max(box_ymax, ymax); - - /* if (imageKWL.GetSize() > 0) - { - itk::EncapsulateMetaData(outputPtr->GetMetaDataDictionary(), - MetaDataKey::OSSIMKeywordlistKey, imageKWL); - }*/ } // Compute step : @@ -396,7 +389,7 @@ void Multi3DMapToDEMFilter::GenerateInput // groundToSensorTransform->SetInputSpacing(outputDEM->GetSignedSpacing()); groundToSensorTransform->SetInputProjectionRef(m_ProjectionRef); - groundToSensorTransform->SetOutputKeywordList(imgPtr->GetImageKeywordlist()); + groundToSensorTransform->SetOutputImageMetadata(imgPtr->GetImageMetadata()); groundToSensorTransform->SetOutputOrigin(imgPtr->GetOrigin()); groundToSensorTransform->SetOutputSpacing(imgPtr->GetSignedSpacing()); groundToSensorTransform->InstantiateTransform(); diff --git a/Modules/Registration/Stereo/include/otbStereoSensorModelToElevationMapFilter.hxx b/Modules/Registration/Stereo/include/otbStereoSensorModelToElevationMapFilter.hxx index 4222bc55dc..ee9546c6f3 100644 --- a/Modules/Registration/Stereo/include/otbStereoSensorModelToElevationMapFilter.hxx +++ b/Modules/Registration/Stereo/include/otbStereoSensorModelToElevationMapFilter.hxx @@ -146,8 +146,8 @@ void StereoSensorModelToElevationFilter::GenerateInp // Build the transform to switch from the master to the slave image typename GenericRSTransformType::Pointer transform = GenericRSTransformType::New(); - transform->SetInputKeywordList(masterPtr->GetImageKeywordlist()); - transform->SetOutputKeywordList(slavePtr->GetImageKeywordlist()); + transform->SetInputImageMetadata(masterPtr->GetImageMetadata()); + transform->SetOutputImageMetadata(slavePtr->GetImageMetadata()); transform->InstantiateTransform(); @@ -266,7 +266,7 @@ void StereoSensorModelToElevationFilter::BeforeThrea OutputImageType* outputPtr = this->GetOutput(); typename GenericRSTransformType::Pointer rsTransform = GenericRSTransformType::New(); - rsTransform->SetInputKeywordList(outputPtr->GetImageKeywordlist()); + rsTransform->SetInputImageMetadata(outputPtr->GetImageMetadata()); rsTransform->InstantiateTransform(); // Fill output @@ -288,8 +288,8 @@ void StereoSensorModelToElevationFilter::BeforeThrea // Set-up the forward-inverse sensor model transform m_MasterToSlave = GenericRSTransform3DType::New(); - m_MasterToSlave->SetInputKeywordList(masterPtr->GetImageKeywordlist()); - m_MasterToSlave->SetOutputKeywordList(slavePtr->GetImageKeywordlist()); + m_MasterToSlave->SetInputImageMetadata(masterPtr->GetImageMetadata()); + m_MasterToSlave->SetOutputImageMetadata(slavePtr->GetImageMetadata()); m_MasterToSlave->InstantiateTransform(); } diff --git a/Modules/Registration/Stereo/include/otbStereorectificationDisplacementFieldSource.hxx b/Modules/Registration/Stereo/include/otbStereorectificationDisplacementFieldSource.hxx index d31a09a94f..bfbb542c57 100644 --- a/Modules/Registration/Stereo/include/otbStereorectificationDisplacementFieldSource.hxx +++ b/Modules/Registration/Stereo/include/otbStereorectificationDisplacementFieldSource.hxx @@ -124,7 +124,7 @@ void StereorectificationDisplacementFieldSource::Gene // Set-up a transform to use the DEMHandler typedef otb::GenericRSTransform<> RSTransform2DType; RSTransform2DType::Pointer leftToGroundTransform = RSTransform2DType::New(); - leftToGroundTransform->SetInputKeywordList(m_LeftImage->GetImageKeywordlist()); + leftToGroundTransform->SetInputImageMetadata(m_LeftImage->GetImageMetadata()); leftToGroundTransform->InstantiateTransform(); @@ -132,13 +132,13 @@ void StereorectificationDisplacementFieldSource::Gene OutputImageType* leftDFPtr = this->GetLeftDisplacementFieldOutput(); OutputImageType* rightDFPtr = this->GetRightDisplacementFieldOutput(); - // Set up the RS transforms - m_LeftToRightTransform->SetInputKeywordList(m_LeftImage->GetImageKeywordlist()); - m_LeftToRightTransform->SetOutputKeywordList(m_RightImage->GetImageKeywordlist()); + // Set up the RS transforms + m_LeftToRightTransform->SetInputImageMetadata(m_LeftImage->GetImageMetadata()); + m_LeftToRightTransform->SetOutputImageMetadata(m_RightImage->GetImageMetadata()); m_LeftToRightTransform->InstantiateTransform(); - m_RightToLeftTransform->SetInputKeywordList(m_RightImage->GetImageKeywordlist()); - m_RightToLeftTransform->SetOutputKeywordList(m_LeftImage->GetImageKeywordlist()); + m_RightToLeftTransform->SetInputImageMetadata(m_RightImage->GetImageMetadata()); + m_RightToLeftTransform->SetOutputImageMetadata(m_LeftImage->GetImageMetadata()); m_RightToLeftTransform->InstantiateTransform(); // Now, we must determine the optimized size, spacing and origin of the @@ -301,7 +301,7 @@ void StereorectificationDisplacementFieldSource::Gene typedef otb::GenericRSTransform<> RSTransform2DType; RSTransform2DType::Pointer leftToGroundTransform = RSTransform2DType::New(); - leftToGroundTransform->SetInputKeywordList(m_LeftImage->GetImageKeywordlist()); + leftToGroundTransform->SetInputImageMetadata(m_LeftImage->GetImageMetadata()); leftToGroundTransform->InstantiateTransform(); -- GitLab From ffa8809c3ef1785cf33f2b1df705113b07f48e3e Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 2 Sep 2020 12:20:38 +0200 Subject: [PATCH 011/123] REFAC: Update IO module elements so they use ImageMetadata instead of KeywordLists --- Modules/IO/Carto/include/otbImageToOSMVectorDataGenerator.hxx | 2 +- Modules/IO/KMZWriter/include/otbKmzProductWriter.hxx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/IO/Carto/include/otbImageToOSMVectorDataGenerator.hxx b/Modules/IO/Carto/include/otbImageToOSMVectorDataGenerator.hxx index 6cec470747..0131440668 100644 --- a/Modules/IO/Carto/include/otbImageToOSMVectorDataGenerator.hxx +++ b/Modules/IO/Carto/include/otbImageToOSMVectorDataGenerator.hxx @@ -84,7 +84,7 @@ void ImageToOSMVectorDataGenerator::EstimateImageExtent() // Local generic RS Transform to project the 4 corners to WGS84 typedef otb::GenericRSTransform<> TransformType; typename TransformType::Pointer transform = TransformType::New(); - transform->SetInputKeywordList(input->GetImageKeywordlist()); + transform->SetInputImageMetadata(input->GetImageMetadata()); transform->SetInputProjectionRef(input->GetProjectionRef()); transform->SetOutputProjectionRef(otb::SpatialReference::FromWGS84().ToWkt()); transform->InstantiateTransform(); diff --git a/Modules/IO/KMZWriter/include/otbKmzProductWriter.hxx b/Modules/IO/KMZWriter/include/otbKmzProductWriter.hxx index f2de585ae6..59f7ba4719 100644 --- a/Modules/IO/KMZWriter/include/otbKmzProductWriter.hxx +++ b/Modules/IO/KMZWriter/include/otbKmzProductWriter.hxx @@ -415,7 +415,7 @@ void KmzProductWriter::Tiling() /** TODO : Generate KML for this tile */ // Search Lat/Lon box m_Transform = TransformType::New(); - m_Transform->SetInputKeywordList(m_ResampleVectorImage->GetImageKeywordlist()); + m_Transform->SetInputImageMetadata(m_ResampleVectorImage->GetImageMetadata()); m_Transform->SetInputProjectionRef(m_VectorImage->GetProjectionRef()); m_Transform->SetOutputProjectionRef(wgsRef); m_Transform->InstantiateTransform(); -- GitLab From e9e0091c5347a07709ffb949114d8f8eb7d03da2 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 2 Sep 2020 12:20:51 +0200 Subject: [PATCH 012/123] REFAC: Update Visu module elements so they use ImageMetadata instead of KeywordLists --- Modules/Visualization/Ice/src/otbGlImageActor.cxx | 15 +++++++++------ Modules/Visualization/Ice/src/otbGlROIActor.cxx | 9 +++++---- .../Visualization/Ice/src/otbGlVectorActor.cxx | 5 +++-- Modules/Visualization/Ice/src/otbViewSettings.cxx | 8 ++++---- 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/Modules/Visualization/Ice/src/otbGlImageActor.cxx b/Modules/Visualization/Ice/src/otbGlImageActor.cxx index 9ebcb2a5fd..fd415c7a5a 100644 --- a/Modules/Visualization/Ice/src/otbGlImageActor.cxx +++ b/Modules/Visualization/Ice/src/otbGlImageActor.cxx @@ -1114,11 +1114,12 @@ void GlImageActor::UpdateTransforms() // << std::hex << this << std::dec // << " WKT-changed: " << isEqualOrNot << std::endl; + //TODO OSSIM: Replace KeywordList by ImageMetadata in the settings object geometryChanged = geometryChanged || (m_ViewportToImageTransform.IsNotNull() && m_ViewportToImageTransform->GetInputProjectionRef() != settings->GetWkt()) || (m_ImageToViewportTransform.IsNotNull() && m_ImageToViewportTransform->GetOutputProjectionRef() != settings->GetWkt()) - || (m_ViewportToImageTransform.IsNotNull() && !(m_ViewportToImageTransform->GetInputKeywordList() == settings->GetKeywordList())) - || (m_ImageToViewportTransform.IsNotNull() && !(m_ImageToViewportTransform->GetOutputKeywordList() == settings->GetKeywordList())); + || (m_ViewportToImageTransform.IsNotNull() /*&& !(m_ViewportToImageTransform->GetInputKeywordList() == settings->GetKeywordList())*/) + || (m_ImageToViewportTransform.IsNotNull() /*&& !(m_ImageToViewportTransform->GetOutputKeywordList() == settings->GetKeywordList())*/); if(settings->GetUseProjection() && geometryChanged) { @@ -1130,14 +1131,16 @@ void GlImageActor::UpdateTransforms() m_ImageToViewportTransform = RSTransformType::New(); m_ViewportToImageTransform->SetInputProjectionRef(settings->GetWkt()); - m_ViewportToImageTransform->SetInputKeywordList(settings->GetKeywordList()); + //TODO OSSIM: Replace KeywordList by ImageMetadata in the settings object + //m_ViewportToImageTransform->SetInputKeywordList(settings->GetKeywordList()); m_ViewportToImageTransform->SetOutputProjectionRef(m_FileReader->GetOutput()->GetProjectionRef()); - m_ViewportToImageTransform->SetOutputKeywordList(m_FileReader->GetOutput()->GetImageKeywordlist()); + m_ViewportToImageTransform->SetOutputImageMetadata(m_FileReader->GetOutput()->GetImageMetadata()); m_ImageToViewportTransform->SetOutputProjectionRef(settings->GetWkt()); - m_ImageToViewportTransform->SetOutputKeywordList(settings->GetKeywordList()); + //TODO OSSIM: Replace KeywordList by ImageMetadata in the settings object + //m_ImageToViewportTransform->SetOutputKeywordList(settings->GetKeywordList()); m_ImageToViewportTransform->SetInputProjectionRef(m_FileReader->GetOutput()->GetProjectionRef()); - m_ImageToViewportTransform->SetInputKeywordList(m_FileReader->GetOutput()->GetImageKeywordlist()); + m_ImageToViewportTransform->SetInputImageMetadata(m_FileReader->GetOutput()->GetImageMetadata()); hasChanged = true; } diff --git a/Modules/Visualization/Ice/src/otbGlROIActor.cxx b/Modules/Visualization/Ice/src/otbGlROIActor.cxx index 182af261eb..75fdf91420 100644 --- a/Modules/Visualization/Ice/src/otbGlROIActor.cxx +++ b/Modules/Visualization/Ice/src/otbGlROIActor.cxx @@ -251,14 +251,15 @@ void GlROIActor::UpdateTransforms() m_ViewportToImageTransform = RSTransformType::New(); m_ViewportToImageTransform->SetInputProjectionRef( settings->GetWkt() ); - m_ViewportToImageTransform->SetInputKeywordList( settings->GetKeywordList() ); + //TODO: Replace KeywordList by ImageMetadata in the settings object + //m_ViewportToImageTransform->SetInputKeywordList( settings->GetKeywordList() ); m_ViewportToImageTransform->SetOutputProjectionRef( m_Wkt ); - m_ViewportToImageTransform->SetOutputKeywordList( m_Kwl ); + //TODO: m_ViewportToImageTransform->SetOutputKeywordList( m_Kwl ); m_ImageToViewportTransform->SetInputProjectionRef( m_Wkt ); - m_ImageToViewportTransform->SetInputKeywordList( m_Kwl ); + //TODO: m_ImageToViewportTransform->SetInputKeywordList( m_Kwl ); m_ImageToViewportTransform->SetOutputProjectionRef( settings->GetWkt() ); - m_ImageToViewportTransform->SetOutputKeywordList( settings->GetKeywordList() ); + //TODO: m_ImageToViewportTransform->SetOutputKeywordList( settings->GetKeywordList() ); m_ViewportToImageTransform->InstantiateTransform(); m_ImageToViewportTransform->InstantiateTransform(); diff --git a/Modules/Visualization/Ice/src/otbGlVectorActor.cxx b/Modules/Visualization/Ice/src/otbGlVectorActor.cxx index f13f93cbcc..9f236dd74e 100644 --- a/Modules/Visualization/Ice/src/otbGlVectorActor.cxx +++ b/Modules/Visualization/Ice/src/otbGlVectorActor.cxx @@ -663,11 +663,12 @@ void GlVectorActor::UpdateTransforms() if(settings->GetUseProjection()) { m_ViewportToVectorTransform->SetInputProjectionRef(settings->GetWkt()); - m_ViewportToVectorTransform->SetInputKeywordList(settings->GetKeywordList()); + //TODO OSSIM: Replace KeywordList by ImageMetadata in the settings object + //m_ViewportToVectorTransform->SetInputKeywordList(settings->GetKeywordList()); m_ViewportToVectorTransform->SetOutputProjectionRef((m_OGRDataSource->GetLayerChecked(m_CurrentLayer).GetProjectionRef())); m_VectorToViewportTransform->SetOutputProjectionRef(settings->GetWkt()); - m_VectorToViewportTransform->SetOutputKeywordList(settings->GetKeywordList()); + //TODO OSSIM: m_VectorToViewportTransform->SetOutputKeywordList(settings->GetKeywordList()); m_VectorToViewportTransform->SetInputProjectionRef((m_OGRDataSource->GetLayerChecked(m_CurrentLayer).GetProjectionRef())); } m_ViewportToVectorTransform->InstantiateTransform(); diff --git a/Modules/Visualization/Ice/src/otbViewSettings.cxx b/Modules/Visualization/Ice/src/otbViewSettings.cxx index 520ef1eeb1..49df9e7dbd 100644 --- a/Modules/Visualization/Ice/src/otbViewSettings.cxx +++ b/Modules/Visualization/Ice/src/otbViewSettings.cxx @@ -129,13 +129,13 @@ void ViewSettings::SetPersepectiveAngle() typedef otb::GenericRSTransform RSTransformType; // Build the RS transform RSTransformType::Pointer forwardTransform = RSTransformType::New(); - forwardTransform->SetInputKeywordList(m_KeywordList); + //TODO OSSIM: forwardTransform->SetInputKeywordList(m_KeywordList); forwardTransform->SetInputProjectionRef(m_Wkt); forwardTransform->InstantiateTransform(); RSTransformType::Pointer inverseTransform = RSTransformType::New(); inverseTransform->SetOutputProjectionRef(m_Wkt); - inverseTransform->SetOutputKeywordList(m_KeywordList); + //TODO OSSIM: inverseTransform->SetOutputKeywordList(m_KeywordList); inverseTransform->InstantiateTransform(); PointType centerPoint = GetViewportCenter(); @@ -163,13 +163,13 @@ void ViewSettings::SetNorthUpAngle() typedef otb::GenericRSTransform RSTransformType; // Build the RS transform RSTransformType::Pointer forwardTransform = RSTransformType::New(); - forwardTransform->SetInputKeywordList(m_KeywordList); + //TODO OSSIM: forwardTransform->SetInputKeywordList(m_KeywordList); forwardTransform->SetInputProjectionRef(m_Wkt); forwardTransform->InstantiateTransform(); RSTransformType::Pointer inverseTransform = RSTransformType::New(); inverseTransform->SetOutputProjectionRef(m_Wkt); - inverseTransform->SetOutputKeywordList(m_KeywordList); + //TODO OSSIM: inverseTransform->SetOutputKeywordList(m_KeywordList); inverseTransform->InstantiateTransform(); PointType centerPoint = GetViewportCenter(); -- GitLab From c0b610939ff1a58226f79a44b12f22098016c2dd Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 2 Sep 2020 12:21:10 +0200 Subject: [PATCH 013/123] REFAC: Update applications so they use ImageMetadata instead of KeywordLists --- .../app/otbPolygonClassStatistics.cxx | 2 +- .../AppClassification/app/otbSampleSelection.cxx | 2 +- .../app/otbHomologousPointsExtraction.cxx | 8 ++++---- .../AppImageUtils/app/otbDownloadSRTMTiles.cxx | 2 +- .../AppImageUtils/app/otbExtractROI.cxx | 16 ++++++++-------- .../AppImageUtils/app/otbPixelValue.cxx | 4 ++-- .../app/otbConvertSensorToGeoPoint.cxx | 6 +++--- .../app/otbVectorDataReprojection.cxx | 2 +- .../AppStereo/app/otbGeneratePlyFile.cxx | 2 +- 9 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx b/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx index 0a7979ba28..715d2522b3 100644 --- a/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx +++ b/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx @@ -209,7 +209,7 @@ private: geometriesProjFilter->SetInput(inputGeomSet); if (imageProjectionRef.empty()) { - geometriesProjFilter->SetOutputKeywordList(inputImg->GetImageKeywordlist()); // nec qd capteur + geometriesProjFilter->SetOutputImageMetadata(inputImg->GetImageMetadata()); } geometriesProjFilter->SetOutputProjectionRef(imageProjectionRef); geometriesProjFilter->SetOutput(outputGeomSet); diff --git a/Modules/Applications/AppClassification/app/otbSampleSelection.cxx b/Modules/Applications/AppClassification/app/otbSampleSelection.cxx index daf849099e..da0bb94dff 100644 --- a/Modules/Applications/AppClassification/app/otbSampleSelection.cxx +++ b/Modules/Applications/AppClassification/app/otbSampleSelection.cxx @@ -375,7 +375,7 @@ private: geometriesProjFilter->SetInput(inputGeomSet); if (imageProjectionRef.empty()) { - geometriesProjFilter->SetOutputKeywordList(inputImg->GetImageKeywordlist()); // nec qd capteur + geometriesProjFilter->SetOutputImageMetadata(inputImg->GetImageMetadata()); } geometriesProjFilter->SetOutputProjectionRef(imageProjectionRef); geometriesProjFilter->SetOutput(outputGeomSet); diff --git a/Modules/Applications/AppDescriptors/app/otbHomologousPointsExtraction.cxx b/Modules/Applications/AppDescriptors/app/otbHomologousPointsExtraction.cxx index 653c330272..11b7bf0078 100644 --- a/Modules/Applications/AppDescriptors/app/otbHomologousPointsExtraction.cxx +++ b/Modules/Applications/AppDescriptors/app/otbHomologousPointsExtraction.cxx @@ -333,17 +333,17 @@ private: // Setting up RS Transform RSTransformType::Pointer rsTransform = RSTransformType::New(); - rsTransform->SetInputKeywordList(image1->GetImageKeywordlist()); + rsTransform->SetInputImageMetadata(image1->GetImageMetadata()); rsTransform->SetInputProjectionRef(image1->GetProjectionRef()); - rsTransform->SetOutputKeywordList(image2->GetImageKeywordlist()); + rsTransform->SetOutputImageMetadata(image2->GetImageMetadata()); rsTransform->SetOutputProjectionRef(image2->GetProjectionRef()); RSTransformType::Pointer rsTransform1ToWGS84 = RSTransformType::New(); - rsTransform1ToWGS84->SetInputKeywordList(image1->GetImageKeywordlist()); + rsTransform1ToWGS84->SetInputImageMetadata(image1->GetImageMetadata()); rsTransform1ToWGS84->SetInputProjectionRef(image1->GetProjectionRef()); RSTransformType::Pointer rsTransform2ToWGS84 = RSTransformType::New(); - rsTransform2ToWGS84->SetInputKeywordList(image2->GetImageKeywordlist()); + rsTransform2ToWGS84->SetInputImageMetadata(image2->GetImageMetadata()); rsTransform2ToWGS84->SetInputProjectionRef(image2->GetProjectionRef()); // Setting up output file diff --git a/Modules/Applications/AppImageUtils/app/otbDownloadSRTMTiles.cxx b/Modules/Applications/AppImageUtils/app/otbDownloadSRTMTiles.cxx index 2c56e61505..a300d5a1a6 100644 --- a/Modules/Applications/AppImageUtils/app/otbDownloadSRTMTiles.cxx +++ b/Modules/Applications/AppImageUtils/app/otbDownloadSRTMTiles.cxx @@ -291,7 +291,7 @@ private: auto inImage = inList->GetNthElement(i); auto rsTransformToWGS84 = RSTransformType::New(); - rsTransformToWGS84->SetInputKeywordList(inImage->GetImageKeywordlist()); + rsTransformToWGS84->SetInputImageMetadata(inImage->GetImageMetadata()); rsTransformToWGS84->SetInputProjectionRef(inImage->GetProjectionRef()); rsTransformToWGS84->SetOutputProjectionRef(static_cast(otb::SpatialReference::FromWGS84().ToWkt())); rsTransformToWGS84->InstantiateTransform(); diff --git a/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx b/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx index 4dbab35664..ac5a99a62b 100644 --- a/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx +++ b/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx @@ -421,7 +421,7 @@ private: { RSTransformType::Pointer rsTransform = RSTransformType::New(); ImageType* inImage = GetParameterImage("in"); - rsTransform->SetOutputKeywordList(inImage->GetImageKeywordlist()); + rsTransform->SetOutputImageMetadata(inImage->GetImageMetadata()); rsTransform->SetOutputProjectionRef(inImage->GetProjectionRef()); rsTransform->InstantiateTransform(); itk::Point ulp_in, lrp_in, ulp_out, lrp_out; @@ -480,7 +480,7 @@ private: else // if ( GetParameterString( "mode.extent.unit" ) == "lonlat" ) { RSTransformType::Pointer rsTransform = RSTransformType::New(); - rsTransform->SetInputKeywordList(input->GetImageKeywordlist()); + rsTransform->SetInputImageMetadata(input->GetImageMetadata()); rsTransform->SetInputProjectionRef(input->GetProjectionRef()); rsTransform->InstantiateTransform(); itk::Point ulp_in, lrp_in, ulp_out, lrp_out; @@ -538,7 +538,7 @@ private: { RSTransformType::Pointer rsTransform = RSTransformType::New(); ImageType* inImage = GetParameterImage("in"); - rsTransform->SetOutputKeywordList(inImage->GetImageKeywordlist()); + rsTransform->SetOutputImageMetadata(inImage->GetImageMetadata()); rsTransform->SetOutputProjectionRef(inImage->GetProjectionRef()); rsTransform->InstantiateTransform(); itk::Point centerp_in, centerp_out; @@ -580,7 +580,7 @@ private: else // if ( GetParameterString( "mode.radius.unitc" ) == "lon/lat" ) { RSTransformType::Pointer rsTransform = RSTransformType::New(); - rsTransform->SetOutputKeywordList(inImage->GetImageKeywordlist()); + rsTransform->SetOutputImageMetadata(inImage->GetImageMetadata()); rsTransform->SetOutputProjectionRef(inImage->GetProjectionRef()); rsTransform->InstantiateTransform(); itk::Point centerp_in; @@ -653,7 +653,7 @@ private: else // if ( GetParameterString("mode.radius.unitc") == "lonlat" ) { RSTransformType::Pointer rsTransform = RSTransformType::New(); - rsTransform->SetInputKeywordList(input->GetImageKeywordlist()); + rsTransform->SetInputImageMetadata(input->GetImageMetadata()); rsTransform->SetInputProjectionRef(input->GetProjectionRef()); rsTransform->InstantiateTransform(); itk::Point centerp_in, centerp_out; @@ -718,7 +718,7 @@ private: } RSTransformType::Pointer rsTransform = RSTransformType::New(); rsTransform->SetInputProjectionRef(inputProjectionRef); - rsTransform->SetOutputKeywordList(inImage->GetImageKeywordlist()); + rsTransform->SetOutputImageMetadata(inImage->GetImageMetadata()); rsTransform->SetOutputProjectionRef(inImage->GetProjectionRef()); rsTransform->InstantiateTransform(); itk::Point ulp_in, urp_in, llp_in, lrp_in; @@ -762,9 +762,9 @@ private: RSTransformType::Pointer rsTransform = RSTransformType::New(); - rsTransform->SetInputKeywordList(referencePtr->GetImageKeywordlist()); + rsTransform->SetInputImageMetadata(referencePtr->GetImageMetadata()); rsTransform->SetInputProjectionRef(referencePtr->GetProjectionRef()); - rsTransform->SetOutputKeywordList(inImage->GetImageKeywordlist()); + rsTransform->SetOutputImageMetadata(inImage->GetImageMetadata()); rsTransform->SetOutputProjectionRef(inImage->GetProjectionRef()); rsTransform->InstantiateTransform(); diff --git a/Modules/Applications/AppImageUtils/app/otbPixelValue.cxx b/Modules/Applications/AppImageUtils/app/otbPixelValue.cxx index 67acfe116e..f5fbe0cd5d 100644 --- a/Modules/Applications/AppImageUtils/app/otbPixelValue.cxx +++ b/Modules/Applications/AppImageUtils/app/otbPixelValue.cxx @@ -166,7 +166,7 @@ private: std::string wktFromEpsg = otb::SpatialReference::FromEPSG(GetParameterInt("mode.epsg.code")).ToWkt(); inverse->SetOutputProjectionRef(wktFromEpsg); } - inverse->SetInputKeywordList(inImage->GetImageKeywordlist()); + inverse->SetInputImageMetadata(inImage->GetImageMetadata()); inverse->SetInputProjectionRef(inImage->GetProjectionRef()); inverse->InstantiateTransform(); itk::Point minPOut(0), maxPOut(0), minP(0), maxP(0); @@ -238,7 +238,7 @@ private: std::string wktFromEpsg = otb::SpatialReference::FromEPSG(GetParameterInt("mode.epsg.code")).ToWkt(); rsTransform->SetInputProjectionRef(wktFromEpsg); } - rsTransform->SetOutputKeywordList(inImage->GetImageKeywordlist()); + rsTransform->SetOutputImageMetadata(inImage->GetImageMetadata()); rsTransform->SetOutputProjectionRef(inImage->GetProjectionRef()); rsTransform->InstantiateTransform(); itk::Point pixelIn(0), pixelOut(0); diff --git a/Modules/Applications/AppProjection/app/otbConvertSensorToGeoPoint.cxx b/Modules/Applications/AppProjection/app/otbConvertSensorToGeoPoint.cxx index 2104388cd2..6e4c76edab 100644 --- a/Modules/Applications/AppProjection/app/otbConvertSensorToGeoPoint.cxx +++ b/Modules/Applications/AppProjection/app/otbConvertSensorToGeoPoint.cxx @@ -21,7 +21,7 @@ #include "otbWrapperApplication.h" #include "otbWrapperApplicationFactory.h" -#include "otbForwardSensorModel.h" +#include "otbRPCForwardTransform.h" #include "otbCoordinateToName.h" namespace otb @@ -44,7 +44,7 @@ public: itkTypeMacro(ConvertSensorToGeoPoint, otb::Application); /** Filters typedef */ - typedef otb::ForwardSensorModel ModelType; + typedef otb::RPCForwardTransform ModelType; typedef itk::Point PointType; private: @@ -111,7 +111,7 @@ private: // Instantiate a ForwardSensor Model ModelType::Pointer model = ModelType::New(); - model->SetImageGeometry(inImage->GetImageKeywordlist()); + model->SetMetadataModel(inImage->GetImageMetadata()[MDGeom::RPC]); if (model->IsValidSensorModel() == false) { itkGenericExceptionMacro(<< "Unable to create a model"); diff --git a/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx b/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx index 0b4656b125..08948b8c85 100644 --- a/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx +++ b/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx @@ -147,7 +147,7 @@ private: m_OutputProjectionRef = outImage->GetProjectionRef(); // ~ wkt if (m_OutputProjectionRef.empty()) { - m_GeometriesProjFilter->SetOutputKeywordList(outImage->GetImageKeywordlist()); // nec qd capteur + m_GeometriesProjFilter->SetOutputImageMetadata(outImage->GetImageMetadata()); } } else diff --git a/Modules/Applications/AppStereo/app/otbGeneratePlyFile.cxx b/Modules/Applications/AppStereo/app/otbGeneratePlyFile.cxx index c7f79b7e2b..026f3ed05d 100644 --- a/Modules/Applications/AppStereo/app/otbGeneratePlyFile.cxx +++ b/Modules/Applications/AppStereo/app/otbGeneratePlyFile.cxx @@ -165,7 +165,7 @@ private: } rsTransform->SetOutputProjectionRef(colorPtr->GetProjectionRef()); - rsTransform->SetOutputKeywordList(colorPtr->GetImageKeywordlist()); + rsTransform->SetOutputImageMetadata(colorPtr->GetImageMetadata()); rsTransform->InstantiateTransform(); toMap->InstantiateTransform(); -- GitLab From d15ecfc9b30597dfd410398597b7905620658aa3 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 2 Sep 2020 12:21:20 +0200 Subject: [PATCH 014/123] REFAC: Update Exemples so they use ImageMetadata instead of KeywordLists --- Examples/Projections/GeometriesProjectionExample.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Examples/Projections/GeometriesProjectionExample.cxx b/Examples/Projections/GeometriesProjectionExample.cxx index 77845a2c5e..3232d03cc7 100644 --- a/Examples/Projections/GeometriesProjectionExample.cxx +++ b/Examples/Projections/GeometriesProjectionExample.cxx @@ -84,7 +84,7 @@ int main(int argc, char* argv[]) // the image: // necessary for sensors - filter->SetOutputKeywordList(imageReader->GetOutput()->GetImageKeywordlist()); + filter->SetOutputImageMetadata(imageReader->GetOutput()->GetImageMetadata()); // necessary for sensors filter->SetOutputOrigin(imageReader->GetOutput()->GetOrigin()); // necessary for sensors -- GitLab From c2030215b6fd36ac9e91843a83429f4ae6bae6dd Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 2 Sep 2020 12:21:51 +0200 Subject: [PATCH 015/123] REFAC: Remove tests for OSSIM RPC transform --- .../OSSIMAdapters/test/CMakeLists.txt | 1 - .../test/otbOSSIMAdaptersTestDriver.cxx | 1 - .../test/otbRPCSolverAdapterTest.cxx | 194 ------------------ 3 files changed, 196 deletions(-) delete mode 100644 Modules/Adapters/OSSIMAdapters/test/otbRPCSolverAdapterTest.cxx diff --git a/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt b/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt index 6a3aed38b9..dbb929a84d 100644 --- a/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt +++ b/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt @@ -27,7 +27,6 @@ otbOssimJpegFileResourceLeakTest.cxx otbOssimElevManagerTest2.cxx otbOssimElevManagerTest4.cxx otbDEMHandlerTest.cxx -otbRPCSolverAdapterTest.cxx otbSarSensorModelAdapterTest.cxx ) diff --git a/Modules/Adapters/OSSIMAdapters/test/otbOSSIMAdaptersTestDriver.cxx b/Modules/Adapters/OSSIMAdapters/test/otbOSSIMAdaptersTestDriver.cxx index 6346389566..e85ab14706 100644 --- a/Modules/Adapters/OSSIMAdapters/test/otbOSSIMAdaptersTestDriver.cxx +++ b/Modules/Adapters/OSSIMAdapters/test/otbOSSIMAdaptersTestDriver.cxx @@ -27,6 +27,5 @@ void RegisterTests() REGISTER_TEST(otbOssimElevManagerTest2); REGISTER_TEST(otbOssimElevManagerTest4); REGISTER_TEST(otbDEMHandlerTest); - REGISTER_TEST(otbRPCSolverAdapterTest); REGISTER_TEST(otbSarSensorModelAdapterTest); } diff --git a/Modules/Adapters/OSSIMAdapters/test/otbRPCSolverAdapterTest.cxx b/Modules/Adapters/OSSIMAdapters/test/otbRPCSolverAdapterTest.cxx deleted file mode 100644 index 10f0514383..0000000000 --- a/Modules/Adapters/OSSIMAdapters/test/otbRPCSolverAdapterTest.cxx +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "otbMacro.h" -#include "otbImage.h" -#include "otbImageFileReader.h" -#include "otbGenericRSTransform.h" -#include "otbGeographicalDistance.h" -#include "itkEuclideanDistanceMetric.h" -#include "otbSensorModelAdapter.h" -#include "otbRPCSolverAdapter.h" - -typedef otb::Image ImageType; -typedef otb::ImageFileReader ReaderType; -typedef otb::GenericRSTransform<> RSTranformType; -typedef otb::RPCSolverAdapter::Point2DType Point2DType; -typedef otb::RPCSolverAdapter::Point3DType Point3DType; -typedef otb::GenericRSTransform RSTranform3dType; -typedef itk::Statistics::EuclideanDistanceMetric EuclideanDistanceMetricType; -typedef otb::GeographicalDistance GeoDistanceType; - -int otbRPCSolverAdapterTest(int argc, char* argv[]) -{ - if (argc < 7) - { - std::cout << "Usage: test_driver input grid_size geo_tol img_tol dem_dir geoid" << std::endl; - return EXIT_FAILURE; - } - // This test takes a sensor model (possibly a rpc one), use it to - // generate gcps and estimate a rpc model. It then checks the - // precision of both forward and inverse transform - std::string infname = argv[1]; - const unsigned int gridSize = atoi(argv[2]); - const double geoTol = atof(argv[3]); - const double imgTol = atof(argv[4]); - const std::string demdir = argv[5]; - const std::string geoid = argv[6]; - - if (gridSize == 0) - { - std::cerr << "Grid size is null!" << std::endl; - return EXIT_FAILURE; - } - - std::cout << "GeoTol: " << geoTol << " meters" << std::endl; - std::cout << "ImgTol: " << imgTol << " pixels" << std::endl; - - otb::DEMHandler::Pointer demHandler = otb::DEMHandler::Instance(); - demHandler->SetDefaultHeightAboveEllipsoid(0); - if (demdir != "no") - demHandler->OpenDEMDirectory(demdir); - if (geoid != "no") - demHandler->OpenGeoidFile(geoid); - - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(infname); - reader->UpdateOutputInformation(); - - RSTranformType::Pointer fwd2dTransform = RSTranformType::New(); - fwd2dTransform->SetInputKeywordList(reader->GetOutput()->GetImageKeywordlist()); - fwd2dTransform->InstantiateTransform(); - - ImageType::SizeType size = reader->GetOutput()->GetLargestPossibleRegion().GetSize(); - - unsigned int stepx = size[0] / gridSize; - unsigned int stepy = size[1] / gridSize; - - otb::RPCSolverAdapter::GCPsContainerType gcps; - - // Generate gcps - for (unsigned int i = 0; i < gridSize; ++i) - { - for (unsigned int j = 0; j < gridSize; ++j) - { - ImageType::IndexType currentIndex; - currentIndex[0] = i * stepx; - currentIndex[1] = j * stepy; - - Point2DType currentPoint, currentWgs84Point; - reader->GetOutput()->TransformIndexToPhysicalPoint(currentIndex, currentPoint); - - currentWgs84Point = fwd2dTransform->TransformPoint(currentPoint); - - double height = otb::DEMHandler::Instance()->GetHeightAboveEllipsoid(currentWgs84Point); - - Point3DType current3DWgs84Point; - current3DWgs84Point[0] = currentWgs84Point[0]; - current3DWgs84Point[1] = currentWgs84Point[1]; - current3DWgs84Point[2] = height; - - gcps.push_back(std::make_pair(currentPoint, current3DWgs84Point)); - - std::cout << currentPoint[0] << " " << currentPoint[1] << " " << current3DWgs84Point[0] << " " << current3DWgs84Point[1] << " " << current3DWgs84Point[2] - << std::endl; - } - } - - // Solve rpc - otb::ImageKeywordlist rpcKwl; - double rmse; - - // Call solver: either write geom and exit, or evaluate model precision - if (argc == 8) - { - const std::string outgeom = argv[7]; - bool success = otb::RPCSolverAdapter::Solve(gcps, rmse, outgeom); - if (success) - return EXIT_SUCCESS; - else - return EXIT_FAILURE; - } - - otb::RPCSolverAdapter::Solve(gcps, rmse, rpcKwl); - - std::cout << "Optimization done, RMSE=" << rmse << std::endl; - - // Build forward and inverse rpc transform - RSTranform3dType::Pointer rpcFwdTransform = RSTranform3dType::New(); - rpcFwdTransform->SetInputKeywordList(rpcKwl); - rpcFwdTransform->InstantiateTransform(); - RSTranformType::Pointer rpcInvTransform = RSTranformType::New(); - rpcInvTransform->SetOutputKeywordList(rpcKwl); - rpcInvTransform->InstantiateTransform(); - - EuclideanDistanceMetricType::Pointer euclideanDistanceMetric = EuclideanDistanceMetricType::New(); - GeoDistanceType::Pointer geoDistance = GeoDistanceType::New(); - - bool fail = false; - - for (otb::RPCSolverAdapter::GCPsContainerType::iterator it = gcps.begin(); it != gcps.end(); ++it) - { - Point2DType imgPoint, groundPoint, groundPoint2dRef; - Point3DType imgPoint3D, groundPoint3D; - - groundPoint2dRef[0] = it->second[0]; - groundPoint2dRef[1] = it->second[1]; - - // Check forward transform - imgPoint3D[0] = it->first[0]; - imgPoint3D[1] = it->first[1]; - imgPoint3D[2] = it->second[2]; - - groundPoint3D = rpcFwdTransform->TransformPoint(imgPoint3D); - - groundPoint[0] = groundPoint3D[0]; - groundPoint[1] = groundPoint3D[1]; - - double groundRes = geoDistance->Evaluate(groundPoint, groundPoint2dRef); - - if (groundRes > geoTol) - { - fail = true; - std::cerr << "Imprecise result with forward estimated model: fwd(" << it->first << ") = " << groundPoint << ", but reference is " << groundPoint2dRef - << " error: " << groundRes << " meters)" << std::endl; - } - - // Check inverse transform - imgPoint = rpcInvTransform->TransformPoint(groundPoint2dRef); - - double imgRes = euclideanDistanceMetric->Evaluate(imgPoint, it->first); - - if (imgRes > imgTol) - { - fail = true; - std::cerr << "Imprecise result with inverse estimated model: inv(" << groundPoint2dRef << ") = " << imgPoint << ", but reference is " << it->first - << " error: " << imgRes << " pixels)" << std::endl; - } - } - - - if (fail) - { - return EXIT_FAILURE; - } - - return EXIT_SUCCESS; -} -- GitLab From 697b96139436f3a2c7702e75abcfcb106dcf677f Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 2 Sep 2020 14:26:25 +0200 Subject: [PATCH 016/123] REFAC: Update Monteverdi's elements so they use ImageMetadata instead of KeywordLists --- .../Visualization/MonteverdiCore/src/mvdVectorImageModel.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Visualization/MonteverdiCore/src/mvdVectorImageModel.cxx b/Modules/Visualization/MonteverdiCore/src/mvdVectorImageModel.cxx index a49e43eb68..0a17a7d91c 100644 --- a/Modules/Visualization/MonteverdiCore/src/mvdVectorImageModel.cxx +++ b/Modules/Visualization/MonteverdiCore/src/mvdVectorImageModel.cxx @@ -121,7 +121,7 @@ void VectorImageModel::SetFilename(const QString& filename, int w, int h) // Setup GenericRSTransform m_ToWgs84 = otb::GenericRSTransform<>::New(); - m_ToWgs84->SetInputDictionary(m_ImageFileReader->GetOutput()->GetMetaDataDictionary()); + m_ToWgs84->SetInputImageMetadata(m_ImageFileReader->GetOutput()->GetImageMetadata()); m_ToWgs84->SetOutputProjectionRef(otb::SpatialReference::FromWGS84().ToWkt()); m_ToWgs84->InstantiateTransform(); -- GitLab From e4c08a0dc338b31b97f600aaf40cfa16599ecbb2 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 2 Sep 2020 15:14:58 +0200 Subject: [PATCH 017/123] ENH: Use vectors instead of arrays. Remove default value. Use 1point version. --- .../include/otbGDALRPCTransformer.h | 4 +-- .../src/otbGDALRPCTransformer.cxx | 30 +++++++++---------- .../include/otbRPCForwardTransform.hxx | 15 +++++----- .../include/otbRPCInverseTransform.hxx | 15 +++++----- 4 files changed, 30 insertions(+), 34 deletions(-) diff --git a/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h b/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h index 101be529df..60a5cae855 100644 --- a/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h +++ b/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h @@ -157,7 +157,7 @@ public: * \pre `x, y, z != nullptr` * */ - bool ForwardTransform(double* x, double* y, double* z, int nPointCount=1); + bool ForwardTransform(double* x, double* y, double* z, int nPointCount); /** * Compute an forward transformation @@ -183,7 +183,7 @@ public: * \pre `x, y, z != nullptr` * */ - bool InverseTransform(double* x, double* y, double* z, int nPointCount=1); + bool InverseTransform(double* x, double* y, double* z, int nPointCount); /** * Compute an inverse transformation diff --git a/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx b/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx index 6da7737d58..d80a8d8999 100644 --- a/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx +++ b/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx @@ -74,10 +74,9 @@ bool GDALRPCTransformer::ForwardTransform(double* x, double* y, double* z, int n assert(z); if (this->m_Modified) this->Update(); - int* success = new int[nPointCount]; - GDALRPCTransform(this->m_TransformArg, false, nPointCount, x, y, z, success); - bool finalSuccess = std::all_of(success, success+nPointCount, [](int i){return i;}); - delete[] success; + std::vector success(nPointCount); + GDALRPCTransform(this->m_TransformArg, false, nPointCount, x, y, z, success.data()); + bool finalSuccess = std::all_of(success.begin(), success.end(), [](int i){return i;}); return finalSuccess; } @@ -86,10 +85,10 @@ GDALRPCTransformer::PointType GDALRPCTransformer::ForwardTransform(GDALRPCTransf if (m_Modified) this->Update(); int success; - GDALRPCTransform(this->m_TransformArg, false, 1, &p[0], &p[1], &p[2], &success); - if (!success) - throw std::runtime_error("GDALRPCTransform was not able to process the ForwardTransform."); - return p; + GDALRPCTransform(this->m_TransformArg, false, 1, &p[0], &p[1], &p[2], &success); + if (!success) + throw std::runtime_error("GDALRPCTransform was not able to process the ForwardTransform."); + return p; } @@ -100,10 +99,9 @@ bool GDALRPCTransformer::InverseTransform(double* x, double* y, double* z, int n assert(z); if (this->m_Modified) this->Update(); - int* success = new int[nPointCount]; - GDALRPCTransform(this->m_TransformArg, true, nPointCount, x, y, z, success); - bool finalSuccess = std::all_of(success, success+nPointCount, [](int i){return i;}); - delete[] success; + std::vector success(nPointCount); + GDALRPCTransform(this->m_TransformArg, true, nPointCount, x, y, z, success.data()); + bool finalSuccess = std::all_of(success.begin(), success.end(), [](int i){return i;}); return finalSuccess; } @@ -112,9 +110,9 @@ GDALRPCTransformer::PointType GDALRPCTransformer::InverseTransform(GDALRPCTransf if (m_Modified) this->Update(); int success; - GDALRPCTransform(this->m_TransformArg, true, 1, &p[0], &p[1], &p[2], &success); - if (!success) - throw std::runtime_error("GDALRPCTransform was not able to process the InverseTransform."); - return p; + GDALRPCTransform(this->m_TransformArg, true, 1, &p[0], &p[1], &p[2], &success); + if (!success) + throw std::runtime_error("GDALRPCTransform was not able to process the InverseTransform."); + return p; } } diff --git a/Modules/Core/Transform/include/otbRPCForwardTransform.hxx b/Modules/Core/Transform/include/otbRPCForwardTransform.hxx index fd0ba22bfe..8e913e81f9 100644 --- a/Modules/Core/Transform/include/otbRPCForwardTransform.hxx +++ b/Modules/Core/Transform/include/otbRPCForwardTransform.hxx @@ -30,18 +30,17 @@ template ::OutputPointType RPCForwardTransform::TransformPoint(const RPCForwardTransform::InputPointType& point) const { - double x = static_cast(point[0]); - double y = static_cast(point[1]); - double z; + GDALRPCTransformer::PointType zePoint; + zePoint[0] = static_cast(point[0]); + zePoint[1] = static_cast(point[1]); - if(!this->m_Transformer->ForwardTransform(&x, &y, &z)) - throw std::runtime_error("An error occurred while processing the ForwardTransform."); + this->m_Transformer->ForwardTransform(zePoint); OutputPointType pOut; - pOut[0] = static_cast(x); - pOut[1] = static_cast(y); + pOut[0] = static_cast(zePoint[0]); + pOut[1] = static_cast(zePoint[1]); if (NOutputDimensions > 2) - pOut[2] = static_cast(z); + pOut[2] = static_cast(zePoint[2]); return pOut; } diff --git a/Modules/Core/Transform/include/otbRPCInverseTransform.hxx b/Modules/Core/Transform/include/otbRPCInverseTransform.hxx index 6e539649a9..58d1803d35 100644 --- a/Modules/Core/Transform/include/otbRPCInverseTransform.hxx +++ b/Modules/Core/Transform/include/otbRPCInverseTransform.hxx @@ -30,18 +30,17 @@ template ::OutputPointType RPCInverseTransform::TransformPoint(const RPCInverseTransform::InputPointType& point) const { - double x = static_cast(point[0]); - double y = static_cast(point[1]); - double z = 0; + GDALRPCTransformer::PointType zePoint; + zePoint[0] = static_cast(point[0]); + zePoint[1] = static_cast(point[1]); if (NInputDimensions > 2) - z = static_cast(point[2]); + zePoint[2] = static_cast(point[2]); - if(!this->m_Transformer->InverseTransform(&x, &y, &z)) - throw std::runtime_error("An error occurred while processing the InverseTransform."); + this->m_Transformer->InverseTransform(zePoint); OutputPointType pOut; - pOut[0] = static_cast(x); - pOut[1] = static_cast(y); + pOut[0] = static_cast(zePoint[0]); + pOut[1] = static_cast(zePoint[1]); return pOut; } -- GitLab From 45b73aefaecc370096a8305cf63aa3fb1c299c6a Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Thu, 3 Sep 2020 11:42:09 +0200 Subject: [PATCH 018/123] BUG: remove solved TODOs --- Modules/Core/Transform/include/otbGenericRSTransform.hxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Core/Transform/include/otbGenericRSTransform.hxx b/Modules/Core/Transform/include/otbGenericRSTransform.hxx index 6a185520cc..03d2028783 100644 --- a/Modules/Core/Transform/include/otbGenericRSTransform.hxx +++ b/Modules/Core/Transform/include/otbGenericRSTransform.hxx @@ -122,7 +122,7 @@ void GenericRSTransform::Insta if (sensorModel->IsValidSensorModel()) { - //TODO: m_InputTransform = sensorModel.GetPointer(); + m_InputTransform = sensorModel.GetPointer(); inputTransformIsSensor = true; otbMsgDevMacro(<< "Input projection set to sensor model."); } @@ -154,7 +154,7 @@ void GenericRSTransform::Insta if (sensorModel->IsValidSensorModel()) { - //TODO: m_OutputTransform = sensorModel.GetPointer(); + m_OutputTransform = sensorModel.GetPointer(); outputTransformIsSensor = true; otbMsgDevMacro(<< "Output projection set to sensor model"); } -- GitLab From 47a03f3e5ec6ddd64460fe093d88c000e40a77e6 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Thu, 3 Sep 2020 17:54:21 +0200 Subject: [PATCH 019/123] BUG: Update tests for GDALRPCTransformer --- .../test/otbGDALRPCTransformerTest.cxx | 106 +++++++++++++----- .../include/otbRPCForwardTransform.hxx | 1 + 2 files changed, 76 insertions(+), 31 deletions(-) diff --git a/Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx b/Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx index c08dd464df..8dfb50a82e 100644 --- a/Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx +++ b/Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx @@ -61,52 +61,96 @@ int otbGDALRPCTransformerTest(int itkNotUsed(argc), char* argv[]) line_num_coeff, line_den_coeff, samp_num_coeff, samp_den_coeff); // Test ForwardTransform - double x = 20, y = 10, z = 0; - double exp_x = 147.1753248795781, exp_y = -42.78881952208293, exp_z = 0.0; - if(!transformer.ForwardTransform(&x, &y, &z)) + std::vector x = {20, 20}; + std::vector y = {10, 10}; + std::vector z = {0, 0}; + double exp_x = 147.1753248795781; + double exp_y = -42.78881952208293; + double exp_z = 0.0; + if(!transformer.ForwardTransform(x.data(), y.data(), z.data(), 2)) { std::cout << "ForwardTransform failed, returned False." << '\n'; success = false; } - if (!itk::Math::FloatAlmostEqual(x, exp_x)) + if (!itk::Math::FloatAlmostEqual(x[0], exp_x)) { - std::cout << "Bad value for latitude. Expected " << exp_x << " but computed " << x << "\n"; + std::cout << "Bad value for latitude. Expected " << exp_x << " but computed " << x[0] << "\n"; success = false; } - if (!itk::Math::FloatAlmostEqual(y, exp_y)) + if (!itk::Math::FloatAlmostEqual(y[0], exp_y)) { - std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << y << "\n"; + std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << y[0] << "\n"; success = false; } - if (!itk::Math::FloatAlmostEqual(z, exp_z)) + if (!itk::Math::FloatAlmostEqual(z[0], exp_z)) { - std::cout << "Bad value for height. Expected " << exp_z << " but computed " << z << "\n"; + std::cout << "Bad value for height. Expected " << exp_z << " but computed " << z[0] << "\n"; + success = false; + } + otb::GDALRPCTransformer::PointType zePoint; + zePoint[0] = 20.0; + zePoint[1] = 10.0; + zePoint[2] = 0.0; + transformer.ForwardTransform(zePoint); + if (!itk::Math::FloatAlmostEqual(zePoint[0], exp_x)) + { + std::cout << "Bad value for latitude. Expected " << exp_x << " but computed " << zePoint[0] << "\n"; + success = false; + } + if (!itk::Math::FloatAlmostEqual(zePoint[1], exp_y)) + { + std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << zePoint[1] << "\n"; + success = false; + } + if (!itk::Math::FloatAlmostEqual(zePoint[2], exp_z)) + { + std::cout << "Bad value for height. Expected " << exp_z << " but computed " << zePoint[2] << "\n"; success = false; } // Test InverseTransform - x = 147.1753248795781; y = -42.78881952208293; z = 0; - exp_x = 20.01139515217801; exp_y = 9.984517889590279; exp_z = 0.0; - if(!transformer.InverseTransform(&x, &y, &z)) - { - std::cout << "ForwardTransform failed, returned False." << '\n'; - success = false; - } - if (!itk::Math::FloatAlmostEqual(x, exp_x)) - { - std::cout << "Bad value for latitude. Expected " << exp_x << " but computed " << x << "\n"; - success = false; - } - if (!itk::Math::FloatAlmostEqual(y, exp_y)) - { - std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << y << "\n"; - success = false; - } - if (!itk::Math::FloatAlmostEqual(z, exp_z)) - { - std::cout << "Bad value for height. Expected " << exp_z << " but computed " << z << "\n"; - success = false; - } + x = {exp_x, exp_x}; + y = {exp_y, exp_y}; + zePoint[0] = exp_x; + zePoint[1] = exp_y; + exp_x = 20.01139515217801; + exp_y = 9.984517889590279; + if(!transformer.InverseTransform(x.data(), y.data(), z.data(), 2)) + { + std::cout << "ForwardTransform failed, returned False." << '\n'; + success = false; + } + if (!itk::Math::FloatAlmostEqual(x[0], exp_x)) + { + std::cout << "Bad value for latitude. Expected " << exp_x << " but computed " << x[0] << "\n"; + success = false; + } + if (!itk::Math::FloatAlmostEqual(y[0], exp_y)) + { + std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << y[0] << "\n"; + success = false; + } + if (!itk::Math::FloatAlmostEqual(z[0], exp_z)) + { + std::cout << "Bad value for height. Expected " << exp_z << " but computed " << z[0] << "\n"; + success = false; + } + transformer.ForwardTransform(zePoint); + if (!itk::Math::FloatAlmostEqual(zePoint[0], exp_x)) + { + std::cout << "Bad value for latitude. Expected " << exp_x << " but computed " << zePoint[0] << "\n"; + success = false; + } + if (!itk::Math::FloatAlmostEqual(zePoint[1], exp_y)) + { + std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << zePoint[1] << "\n"; + success = false; + } + if (!itk::Math::FloatAlmostEqual(zePoint[2], exp_z)) + { + std::cout << "Bad value for height. Expected " << exp_z << " but computed " << zePoint[2] << "\n"; + success = false; + } if (success) return EXIT_SUCCESS; diff --git a/Modules/Core/Transform/include/otbRPCForwardTransform.hxx b/Modules/Core/Transform/include/otbRPCForwardTransform.hxx index 8e913e81f9..872daeeae9 100644 --- a/Modules/Core/Transform/include/otbRPCForwardTransform.hxx +++ b/Modules/Core/Transform/include/otbRPCForwardTransform.hxx @@ -33,6 +33,7 @@ RPCForwardTransform::Transform GDALRPCTransformer::PointType zePoint; zePoint[0] = static_cast(point[0]); zePoint[1] = static_cast(point[1]); + zePoint[2] = 0.0; this->m_Transformer->ForwardTransform(zePoint); -- GitLab From 69f97d37dacb4360c0678411fe997ef2a08b049c Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Fri, 4 Sep 2020 09:56:57 +0200 Subject: [PATCH 020/123] BUG: Check pointer state --- Modules/Core/Transform/include/otbGenericRSTransform.hxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Core/Transform/include/otbGenericRSTransform.hxx b/Modules/Core/Transform/include/otbGenericRSTransform.hxx index 03d2028783..3ee824e4f1 100644 --- a/Modules/Core/Transform/include/otbGenericRSTransform.hxx +++ b/Modules/Core/Transform/include/otbGenericRSTransform.hxx @@ -113,7 +113,7 @@ void GenericRSTransform::Insta } // If not, try to make a RPC sensor model - if ((m_InputTransform.IsNull()) && (m_InputImd->Has(MDGeom::RPC))) + if ((m_InputTransform.IsNull()) && (m_InputImd != nullptr) && (m_InputImd->Has(MDGeom::RPC))) { typedef otb::RPCForwardTransform RPCForwardTransformType; typename RPCForwardTransformType::Pointer sensorModel = RPCForwardTransformType::New(); @@ -145,7 +145,7 @@ void GenericRSTransform::Insta } // If not, try to make a RPC sensor model - if ((m_OutputTransform.IsNull()) && (m_OutputImd->Has(MDGeom::RPC))) + if ((m_OutputTransform.IsNull()) && (m_OutputImd != nullptr) && (m_OutputImd->Has(MDGeom::RPC))) { typedef otb::RPCInverseTransform RPCInverseTransformType; typename RPCInverseTransformType::Pointer sensorModel = RPCInverseTransformType::New(); -- GitLab From b053dc83bf7a50a3eafcd13c8931f7f75a53fbbb Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Fri, 4 Sep 2020 17:38:50 +0200 Subject: [PATCH 021/123] Set the correct branch to use for DiapOTB --- Modules/Remote/diapotb.remote.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Remote/diapotb.remote.cmake b/Modules/Remote/diapotb.remote.cmake index 0f9791f05c..d207f2f33f 100644 --- a/Modules/Remote/diapotb.remote.cmake +++ b/Modules/Remote/diapotb.remote.cmake @@ -22,5 +22,5 @@ otb_fetch_module(DiapOTBModule "OTB module for SAR processing in Diapason." GIT_REPOSITORY https://gitlab.orfeo-toolbox.org/remote_modules/diapotb.git - GIT_TAG f84b85352abb75ff3eefafdf0480fcde7fa06173 + GIT_TAG 3a058ebdf2a1dc18d5136f322324837065d5ef75 ) -- GitLab From 9f878e403dfde9f295e73292ed3ff05193cfd14c Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Fri, 4 Sep 2020 17:39:32 +0200 Subject: [PATCH 022/123] BUG: Remove calls to KeywordList related methods --- .../app/otbOrthoRectification.cxx | 2 +- .../AppProjection/app/otbSuperimpose.cxx | 6 ++-- .../include/otbGenericRSResampleImageFilter.h | 31 +++++++------------ .../otbGenericRSResampleImageFilter.hxx | 12 ++----- 4 files changed, 18 insertions(+), 33 deletions(-) diff --git a/Modules/Applications/AppProjection/app/otbOrthoRectification.cxx b/Modules/Applications/AppProjection/app/otbOrthoRectification.cxx index ae1916ca7e..9de053ef55 100644 --- a/Modules/Applications/AppProjection/app/otbOrthoRectification.cxx +++ b/Modules/Applications/AppProjection/app/otbOrthoRectification.cxx @@ -565,7 +565,7 @@ private: // Set the output projection Ref m_ResampleFilter->SetInputProjectionRef(inImage->GetProjectionRef()); - m_ResampleFilter->SetInputKeywordList(inImage->GetImageKeywordlist()); + m_ResampleFilter->SetInputImageMetadata(inImage->GetImageMetadata()); m_ResampleFilter->SetOutputProjectionRef(m_OutputProjectionRef); // Check size diff --git a/Modules/Applications/AppProjection/app/otbSuperimpose.cxx b/Modules/Applications/AppProjection/app/otbSuperimpose.cxx index 469fd1a1f6..4da32c7c9d 100644 --- a/Modules/Applications/AppProjection/app/otbSuperimpose.cxx +++ b/Modules/Applications/AppProjection/app/otbSuperimpose.cxx @@ -242,11 +242,11 @@ private: } m_Resampler->SetDisplacementFieldSpacing(defSpacing); - // Setup transform through projRef and Keywordlist - m_Resampler->SetInputKeywordList(movingImage->GetImageKeywordlist()); + // Setup transform through projRef and ImageMetadata + m_Resampler->SetInputImageMetadata(movingImage->GetImageMetadata()); m_Resampler->SetInputProjectionRef(movingImage->GetProjectionRef()); - m_Resampler->SetOutputKeywordList(refImage->GetImageKeywordlist()); + m_Resampler->SetOutputImageMetadata(refImage->GetImageMetadata()); m_Resampler->SetOutputProjectionRef(refImage->GetProjectionRef()); m_Resampler->SetInput(movingImage); diff --git a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.h b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.h index f6be28090a..0e23741e95 100644 --- a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.h +++ b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.h @@ -167,30 +167,15 @@ public: return m_Transform->GetInputProjectionRef(); } - /** Set/Get Input Keywordlist - * \depricated - */ - void SetInputKeywordList(const ImageKeywordlist& kwl) - { - } - const ImageKeywordlist GetInputKeywordList() - { - } - - /** Set/Get output Keywordlist - * \depricated + /** Set/Get Input ImageMetadata */ - void SetOutputKeywordList(const ImageKeywordlist& kwl) - { - } - - const ImageKeywordlist GetOutputKeywordList() + void SetInputImageMetadata(ImageMetadata* imd) { + m_Transform->SetOutputImageMetadata(imd); + this->Modified(); } - /** Set/Get Input ImageMetadata - */ - void SetInputImageMetadata(ImageMetadata* imd) + void SetInputImageMetadata(ImageMetadata imd) { m_Transform->SetOutputImageMetadata(imd); this->Modified(); @@ -209,6 +194,12 @@ public: this->Modified(); } + void SetOutputImageMetadata(ImageMetadata imd) + { + m_Transform->SetInputImageMetadata(imd); + this->Modified(); + } + const ImageMetadata* GetOutputImageMetadata() { return m_Transform->GetInputImageMetadata(); diff --git a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx index 365c674f42..3bd2c610b0 100644 --- a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx +++ b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx @@ -100,13 +100,8 @@ void GenericRSResampleImageFilter::GenerateOutputInfo m_Resampler->UpdateOutputInformation(); this->GraftOutput(m_Resampler->GetOutput()); - // Encapsulate output projRef and keywordlist - itk::MetaDataDictionary& dict = this->GetOutput()->GetMetaDataDictionary(); - itk::EncapsulateMetaData(dict, MetaDataKey::ProjectionRefKey, this->GetOutputProjectionRef()); - if (this->GetOutputKeywordList().GetSize() > 0) - { - itk::EncapsulateMetaData(dict, MetaDataKey::OSSIMKeywordlistKey, this->GetOutputKeywordList()); - } + // Encapsulate output projRef + this->GetOutput()->m_Imd.Add(MDGeom::ProjectionProj, this->GetOutputProjectionRef()); } /** @@ -125,9 +120,8 @@ void GenericRSResampleImageFilter::EstimateOutputRpcM tempPtr->SetRegions(region); // Encapsulate the output metadata in the temp image + tempPtr->SetImageMetadata(*(this->GetOutputImageMetadata())); tempPtr->m_Imd.Add(MDGeom::ProjectionProj, this->GetOutputProjectionRef()); - ImageMetadata* imd = const_cast(this->GetOutputImageMetadata()); - tempPtr->m_Imd.Merge(*imd); // Estimate the rpc model from the temp image m_OutputRpcEstimator->SetInput(tempPtr); -- GitLab From c0a56e4a03a25bd8e510fdf5254ec51e668580c3 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Mon, 7 Sep 2020 09:54:25 +0200 Subject: [PATCH 023/123] BUG: set a temporary branch for DiapOTB --- Modules/Remote/diapotb.remote.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Remote/diapotb.remote.cmake b/Modules/Remote/diapotb.remote.cmake index d207f2f33f..9447fbf347 100644 --- a/Modules/Remote/diapotb.remote.cmake +++ b/Modules/Remote/diapotb.remote.cmake @@ -22,5 +22,5 @@ otb_fetch_module(DiapOTBModule "OTB module for SAR processing in Diapason." GIT_REPOSITORY https://gitlab.orfeo-toolbox.org/remote_modules/diapotb.git - GIT_TAG 3a058ebdf2a1dc18d5136f322324837065d5ef75 + GIT_TAG 5cedc91f6cd66ecfb4adccae55f823b00db636ee ) -- GitLab From 3a45625090076d26c51175fa0251bedd50b6b204 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Tue, 8 Sep 2020 16:32:53 +0200 Subject: [PATCH 024/123] ENH: Remove deprecated methods and fixe the corresponding calls --- .../AppProjection/app/otbVectorDataReprojection.cxx | 2 +- Modules/Core/Transform/include/otbGenericRSTransform.hxx | 5 +++++ Modules/Core/Transform/include/otbRPCForwardTransform.hxx | 2 +- .../Projection/include/otbGeometriesProjectionFilter.h | 6 ------ 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx b/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx index 08948b8c85..312b8d20f2 100644 --- a/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx +++ b/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx @@ -134,7 +134,7 @@ private: if (HasValue("in.kwl")) { FloatVectorImageType::Pointer inImage = GetParameterFloatVectorImage("in.kwl"); - m_GeometriesProjFilter->SetInputKeywordList(inImage->GetImageKeywordlist()); + m_GeometriesProjFilter->SetInputImageMetadata(inImage->GetImageMetadata()); // otbAppLogINFO(<<"kwl."<::Insta { m_Transform = TransformType::New(); + if (m_InputProjectionRef.empty() && m_InputImd->Has(MDGeom::ProjectionProj)) + { + m_InputProjectionRef = boost::any_cast(m_InputImd->operator[](MDGeom::ProjectionProj)); + } + otbMsgDevMacro(<< "Information to instantiate transform: "); otbMsgDevMacro(<< " * Input Origin: " << m_InputOrigin); otbMsgDevMacro(<< " * Input Spacing: " << m_InputSpacing); diff --git a/Modules/Core/Transform/include/otbRPCForwardTransform.hxx b/Modules/Core/Transform/include/otbRPCForwardTransform.hxx index 872daeeae9..f073757f02 100644 --- a/Modules/Core/Transform/include/otbRPCForwardTransform.hxx +++ b/Modules/Core/Transform/include/otbRPCForwardTransform.hxx @@ -28,7 +28,7 @@ namespace otb template typename RPCForwardTransform::OutputPointType -RPCForwardTransform::TransformPoint(const RPCForwardTransform::InputPointType& point) const +RPCForwardTransform::TransformPoint(const InputPointType& point) const { GDALRPCTransformer::PointType zePoint; zePoint[0] = static_cast(point[0]); diff --git a/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.h b/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.h index d612e9bf92..c7b688e3df 100644 --- a/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.h +++ b/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.h @@ -254,12 +254,6 @@ public: void SetOutputOrigin(ImageReference::OriginType const& origin); //@} - /**\name Keywords lists accessors and mutators - * \deprecated - */ - ImageKeywordlist& GetInputKeywordList(){}; - void SetInputKeywordList(const ImageKeywordlist& kwl){}; - /**\name ImageMetadata accessors and mutators */ //@{ itkGetMacro(InputImageMetadata, ImageMetadata*); -- GitLab From fc6fa1a9615c11a38feba99bf224db6fd8e99e66 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Tue, 8 Sep 2020 17:15:04 +0200 Subject: [PATCH 025/123] BUG: set a temporary branch for DiapOTB --- Modules/Remote/diapotb.remote.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Remote/diapotb.remote.cmake b/Modules/Remote/diapotb.remote.cmake index 9447fbf347..43637a41fa 100644 --- a/Modules/Remote/diapotb.remote.cmake +++ b/Modules/Remote/diapotb.remote.cmake @@ -22,5 +22,5 @@ otb_fetch_module(DiapOTBModule "OTB module for SAR processing in Diapason." GIT_REPOSITORY https://gitlab.orfeo-toolbox.org/remote_modules/diapotb.git - GIT_TAG 5cedc91f6cd66ecfb4adccae55f823b00db636ee + GIT_TAG RPCModel ) -- GitLab From 2d83c0571b5bfd4497e1a401dcdfef8b8a8488f4 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 9 Sep 2020 12:27:12 +0200 Subject: [PATCH 026/123] BUG: Check for null pointer --- .../Core/Transform/include/otbGenericRSTransform.hxx | 2 +- .../include/otbImageToGenericRSOutputParameters.h | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/Modules/Core/Transform/include/otbGenericRSTransform.hxx b/Modules/Core/Transform/include/otbGenericRSTransform.hxx index a8234beffb..104c65da51 100644 --- a/Modules/Core/Transform/include/otbGenericRSTransform.hxx +++ b/Modules/Core/Transform/include/otbGenericRSTransform.hxx @@ -74,7 +74,7 @@ void GenericRSTransform::Insta { m_Transform = TransformType::New(); - if (m_InputProjectionRef.empty() && m_InputImd->Has(MDGeom::ProjectionProj)) + if (m_InputProjectionRef.empty() && m_InputImd != nullptr && m_InputImd->Has(MDGeom::ProjectionProj)) { m_InputProjectionRef = boost::any_cast(m_InputImd->operator[](MDGeom::ProjectionProj)); } diff --git a/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.h b/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.h index f22bf6c70a..4d8bd3450e 100644 --- a/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.h +++ b/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.h @@ -149,18 +149,6 @@ public: return m_Transform->GetOutputProjectionRef(); } - /** Set/Get Input Keywordlist - * \deprecated - * TODO: Remove before v8.0.0 - */ - void SetInputKeywordList(const ImageKeywordlist& kwl) - { - } - - const ImageKeywordlist GetInputKeywordList() - { - } - /** Set/Get Input ImageMetadata */ void SetInputImageMetadata(ImageMetadata* imd) -- GitLab From 867005b29d290cf33c866da7a8e86889d0792d37 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 9 Sep 2020 16:24:55 +0200 Subject: [PATCH 027/123] BUG: Fix compilation error on Windows --- Modules/Core/Transform/include/otbRPCForwardTransform.h | 4 ++-- Modules/Core/Transform/include/otbRPCInverseTransform.h | 4 ++-- Modules/Core/Transform/include/otbRPCInverseTransform.hxx | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Modules/Core/Transform/include/otbRPCForwardTransform.h b/Modules/Core/Transform/include/otbRPCForwardTransform.h index e78e04b5e1..3a6386ef92 100644 --- a/Modules/Core/Transform/include/otbRPCForwardTransform.h +++ b/Modules/Core/Transform/include/otbRPCForwardTransform.h @@ -45,8 +45,8 @@ public: using Pointer = itk::SmartPointer; using ConstPointer = itk::SmartPointer ; - using InputPointType = itk::Point; - using OutputPointType = itk::Point; + typedef itk::Point InputPointType; + typedef itk::Point OutputPointType; using PixelType =TScalarType; //@} diff --git a/Modules/Core/Transform/include/otbRPCInverseTransform.h b/Modules/Core/Transform/include/otbRPCInverseTransform.h index 5351deb80e..b1cd85bde5 100644 --- a/Modules/Core/Transform/include/otbRPCInverseTransform.h +++ b/Modules/Core/Transform/include/otbRPCInverseTransform.h @@ -45,8 +45,8 @@ public: using Pointer = itk::SmartPointer; using ConstPointer = itk::SmartPointer ; - using InputPointType = itk::Point; - using OutputPointType = itk::Point; + typedef itk::Point InputPointType; + typedef itk::Point OutputPointType; using PixelType =TScalarType; //@} diff --git a/Modules/Core/Transform/include/otbRPCInverseTransform.hxx b/Modules/Core/Transform/include/otbRPCInverseTransform.hxx index 58d1803d35..438467c97e 100644 --- a/Modules/Core/Transform/include/otbRPCInverseTransform.hxx +++ b/Modules/Core/Transform/include/otbRPCInverseTransform.hxx @@ -28,7 +28,7 @@ namespace otb template typename RPCInverseTransform::OutputPointType -RPCInverseTransform::TransformPoint(const RPCInverseTransform::InputPointType& point) const +RPCInverseTransform::TransformPoint(const InputPointType& point) const { GDALRPCTransformer::PointType zePoint; zePoint[0] = static_cast(point[0]); -- GitLab From c690f2d00eca45a13dcef2d57fbba30226238798 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Mon, 14 Sep 2020 14:32:57 +0200 Subject: [PATCH 028/123] ENH: fetch RPCs in Quickbird IMI --- .../Metadata/include/otbQuickBirdImageMetadataInterface.h | 2 ++ .../Core/Metadata/src/otbQuickBirdImageMetadataInterface.cxx | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/Modules/Core/Metadata/include/otbQuickBirdImageMetadataInterface.h b/Modules/Core/Metadata/include/otbQuickBirdImageMetadataInterface.h index d4d0a353c0..5b1c77062b 100644 --- a/Modules/Core/Metadata/include/otbQuickBirdImageMetadataInterface.h +++ b/Modules/Core/Metadata/include/otbQuickBirdImageMetadataInterface.h @@ -136,6 +136,8 @@ public: * There values a computed by 6S. */ WavelengthSpectralBandVectorType GetSpectralSensitivity() const override; + void Parse(const MetadataSupplierInterface *) override; + protected: QuickBirdImageMetadataInterface(); ~QuickBirdImageMetadataInterface() override diff --git a/Modules/Core/Metadata/src/otbQuickBirdImageMetadataInterface.cxx b/Modules/Core/Metadata/src/otbQuickBirdImageMetadataInterface.cxx index 86c0d40cba..c1fc52f2d2 100644 --- a/Modules/Core/Metadata/src/otbQuickBirdImageMetadataInterface.cxx +++ b/Modules/Core/Metadata/src/otbQuickBirdImageMetadataInterface.cxx @@ -954,4 +954,9 @@ QuickBirdImageMetadataInterface::WavelengthSpectralBandVectorType QuickBirdImage return wavelengthSpectralBand; } +void QuickBirdImageMetadataInterface::Parse(const MetadataSupplierInterface *mds) +{ + FetchRPC(*mds); +} + } // end namespace otb -- GitLab From 059f393ca9a8be9729c13159fdd4aa735ea6ccb9 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Mon, 14 Sep 2020 14:38:49 +0200 Subject: [PATCH 029/123] ENH: Simpler API for SensorModelBase::SetMetadata --- .../AppProjection/app/otbConvertSensorToGeoPoint.cxx | 2 +- Modules/Core/Transform/include/otbGenericRSTransform.hxx | 9 +++++---- Modules/Core/Transform/include/otbRPCTransformBase.h | 5 ++--- Modules/Core/Transform/include/otbRPCTransformBase.hxx | 6 ++++-- Modules/Core/Transform/include/otbSensorModelBase.h | 5 ++--- .../test/otbCreateInverseForwardSensorModel.cxx | 4 ++-- .../test/otbRegionProjectionResampler.cxx | 2 +- .../Filtering/Projection/test/otbCompositeTransform.cxx | 2 +- Modules/Filtering/Projection/test/otbSensorModel.cxx | 6 +++--- 9 files changed, 21 insertions(+), 20 deletions(-) diff --git a/Modules/Applications/AppProjection/app/otbConvertSensorToGeoPoint.cxx b/Modules/Applications/AppProjection/app/otbConvertSensorToGeoPoint.cxx index 6e4c76edab..21235d057c 100644 --- a/Modules/Applications/AppProjection/app/otbConvertSensorToGeoPoint.cxx +++ b/Modules/Applications/AppProjection/app/otbConvertSensorToGeoPoint.cxx @@ -111,7 +111,7 @@ private: // Instantiate a ForwardSensor Model ModelType::Pointer model = ModelType::New(); - model->SetMetadataModel(inImage->GetImageMetadata()[MDGeom::RPC]); + model->SetMetadata(inImage->GetImageMetadata()); if (model->IsValidSensorModel() == false) { itkGenericExceptionMacro(<< "Unable to create a model"); diff --git a/Modules/Core/Transform/include/otbGenericRSTransform.hxx b/Modules/Core/Transform/include/otbGenericRSTransform.hxx index 104c65da51..023276370a 100644 --- a/Modules/Core/Transform/include/otbGenericRSTransform.hxx +++ b/Modules/Core/Transform/include/otbGenericRSTransform.hxx @@ -123,13 +123,13 @@ void GenericRSTransform::Insta typedef otb::RPCForwardTransform RPCForwardTransformType; typename RPCForwardTransformType::Pointer sensorModel = RPCForwardTransformType::New(); - sensorModel->SetMetadataModel((*m_InputImd)[MDGeom::RPC]); + sensorModel->SetMetadata(*m_InputImd); if (sensorModel->IsValidSensorModel()) { m_InputTransform = sensorModel.GetPointer(); inputTransformIsSensor = true; - otbMsgDevMacro(<< "Input projection set to sensor model."); + otbMsgDevMacro(<< "Input projection set to RPC model."); } } @@ -155,13 +155,13 @@ void GenericRSTransform::Insta typedef otb::RPCInverseTransform RPCInverseTransformType; typename RPCInverseTransformType::Pointer sensorModel = RPCInverseTransformType::New(); - sensorModel->SetMetadataModel((*m_OutputImd)[MDGeom::RPC]); + sensorModel->SetMetadata(*m_OutputImd); if (sensorModel->IsValidSensorModel()) { m_OutputTransform = sensorModel.GetPointer(); outputTransformIsSensor = true; - otbMsgDevMacro(<< "Output projection set to sensor model"); + otbMsgDevMacro(<< "Output projection set to RPC model"); } } @@ -175,6 +175,7 @@ void GenericRSTransform::Insta } m_InputTransform = itk::IdentityTransform::New(); + otbMsgDevMacro(<< "Input projection set to identity"); } diff --git a/Modules/Core/Transform/include/otbRPCTransformBase.h b/Modules/Core/Transform/include/otbRPCTransformBase.h index 96ce321582..861e0383a7 100644 --- a/Modules/Core/Transform/include/otbRPCTransformBase.h +++ b/Modules/Core/Transform/include/otbRPCTransformBase.h @@ -64,11 +64,10 @@ public: itkStaticConstMacro(OutputSpaceDimension, unsigned int, NOutputDimensions); /* - * Set the model as it is defined in the ImageMetadata. - * Used by the factory to find the correct class. + * Provide the ImageMetadata in order to set the model. * Return false if model not valid. */ - bool SetMetadataModel(boost::any imdModel) override; + bool SetMetadata(const ImageMetadata& imd) override; /** Check model validity */ bool IsValidSensorModel() const override; diff --git a/Modules/Core/Transform/include/otbRPCTransformBase.hxx b/Modules/Core/Transform/include/otbRPCTransformBase.hxx index a548653982..046dd106cf 100644 --- a/Modules/Core/Transform/include/otbRPCTransformBase.hxx +++ b/Modules/Core/Transform/include/otbRPCTransformBase.hxx @@ -27,11 +27,13 @@ namespace otb { template -bool RPCTransformBase::SetMetadataModel(boost::any imdModel) +bool RPCTransformBase::SetMetadata(const ImageMetadata& imd) { + if (!imd.Has(MDGeom::RPC)) + return false; try { - Projection::RPCParam newParam = boost::any_cast(imdModel); + Projection::RPCParam newParam = boost::any_cast(imd[MDGeom::RPC]); this->m_RPCParam.reset(&newParam); } catch (boost::bad_any_cast) diff --git a/Modules/Core/Transform/include/otbSensorModelBase.h b/Modules/Core/Transform/include/otbSensorModelBase.h index 526fcdb278..714ad79a31 100644 --- a/Modules/Core/Transform/include/otbSensorModelBase.h +++ b/Modules/Core/Transform/include/otbSensorModelBase.h @@ -68,11 +68,10 @@ public: itkStaticConstMacro(OutputSpaceDimension, unsigned int, NOutputDimensions); /* - * Set the model as it is defined in the ImageMetadata. - * Used by the factory to find the correct class. + * Provide the ImageMetadata in order to set the model. * Return false if model not valid. */ - virtual bool SetMetadataModel(boost::any imdModel) = 0; + virtual bool SetMetadata(const ImageMetadata& imd) = 0; /** Check model validity */ virtual bool IsValidSensorModel() const = 0; diff --git a/Modules/Core/Transform/test/otbCreateInverseForwardSensorModel.cxx b/Modules/Core/Transform/test/otbCreateInverseForwardSensorModel.cxx index 2df96f517e..9a4284b75e 100644 --- a/Modules/Core/Transform/test/otbCreateInverseForwardSensorModel.cxx +++ b/Modules/Core/Transform/test/otbCreateInverseForwardSensorModel.cxx @@ -68,7 +68,7 @@ int otbCreateInverseForwardSensorModel(int argc, char* argv[]) ImageType::Pointer inputImage = reader->GetOutput(); otbGenericMsgDebugMacro(<< "Inverse model creation..."); - if (inverse_rpc_model->SetMetadataModel(inputImage->GetImageMetadata()[otb::MDGeom::RPC])) + if (inverse_rpc_model->SetMetadata(inputImage->GetImageMetadata())) { std::cout << "Error while reading model. This is not a RPC model!" << std::endl; return EXIT_FAILURE; @@ -80,7 +80,7 @@ int otbCreateInverseForwardSensorModel(int argc, char* argv[]) } otbGenericMsgDebugMacro(<< "Forward model creation..."); - if (forward_rpc_model->SetMetadataModel(inputImage->GetImageMetadata()[otb::MDGeom::RPC])) + if (forward_rpc_model->SetMetadata(inputImage->GetImageMetadata())) { std::cout << "Error while reading model. This is not a RPC model!" << std::endl; return EXIT_FAILURE; diff --git a/Modules/Filtering/ImageManipulation/test/otbRegionProjectionResampler.cxx b/Modules/Filtering/ImageManipulation/test/otbRegionProjectionResampler.cxx index f4f46d47c8..45d264e5fc 100644 --- a/Modules/Filtering/ImageManipulation/test/otbRegionProjectionResampler.cxx +++ b/Modules/Filtering/ImageManipulation/test/otbRegionProjectionResampler.cxx @@ -90,7 +90,7 @@ int otbRegionProjectionResampler(int argc, char* argv[]) reader->GenerateOutputInformation(); ImageType::ConstPointer inputImage = reader->GetOutput(); - model->SetMetadataModel(reader->GetOutput()->GetImageMetadata()[otb::MDGeom::RPC]); + model->SetMetadata(reader->GetOutput()->GetImageMetadata()); if (model->IsValidSensorModel() == false) { diff --git a/Modules/Filtering/Projection/test/otbCompositeTransform.cxx b/Modules/Filtering/Projection/test/otbCompositeTransform.cxx index 67cd2596da..e52c27357d 100644 --- a/Modules/Filtering/Projection/test/otbCompositeTransform.cxx +++ b/Modules/Filtering/Projection/test/otbCompositeTransform.cxx @@ -57,7 +57,7 @@ int otbCompositeTransform(int argc, char* argv[]) typedef otb::RPCInverseTransform SensorModelType; SensorModelType::Pointer sensorModel = SensorModelType::New(); - sensorModel->SetMetadataModel(reader->GetOutput()->GetImageMetadata()[otb::MDGeom::RPC]); + sensorModel->SetMetadata(reader->GetOutput()->GetImageMetadata()); if (sensorModel->IsValidSensorModel() == false) { diff --git a/Modules/Filtering/Projection/test/otbSensorModel.cxx b/Modules/Filtering/Projection/test/otbSensorModel.cxx index 76f673f773..72008da3f0 100644 --- a/Modules/Filtering/Projection/test/otbSensorModel.cxx +++ b/Modules/Filtering/Projection/test/otbSensorModel.cxx @@ -66,7 +66,7 @@ int produceGCP(char* outputgcpfilename, const otb::ImageMetadata& imd, bool useF // otbForwardSensorModel typedef otb::RPCForwardTransform ForwardSensorModelType; ForwardSensorModelType::Pointer forwardSensorModel = ForwardSensorModelType::New(); - forwardSensorModel->SetMetadataModel(imd[otb::MDGeom::RPC]); + forwardSensorModel->SetMetadata(imd); if (forwardSensorModel->IsValidSensorModel() == false) { otbLogMacro(Warning, << "Invalid Model pointer m_Model == NULL!\n The metadata is invalid!"); @@ -202,7 +202,7 @@ int otbSensorModel(int argc, char* argv[]) std::cerr << "Invalid sensor model (ForwardSensorModelType::Pointer is NULL)" << std::endl; return EXIT_FAILURE; } - forwardSensorModel->SetMetadataModel(imd[otb::MDGeom::RPC]); + forwardSensorModel->SetMetadata(imd); if (forwardSensorModel->IsValidSensorModel() == false) { std::cerr << "Invalid Model pointer m_Model == NULL!\n The metadata is invalid!" << std::endl; @@ -217,7 +217,7 @@ int otbSensorModel(int argc, char* argv[]) std::cerr << "Invalid sensor model (InverseSensorModelType::Pointer is NULL)" << std::endl; return EXIT_FAILURE; } - inverseSensorModel->SetMetadataModel(imd[otb::MDGeom::RPC]); + inverseSensorModel->SetMetadata(imd); if (inverseSensorModel->IsValidSensorModel() == false) { std::cerr << "Invalid Model pointer m_Model == NULL!\n The metadata is invalid!" << std::endl; -- GitLab From 12591edbe01d15f74a1f308eaa1709ba0709c5f3 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Mon, 14 Sep 2020 14:55:50 +0200 Subject: [PATCH 030/123] BUG: Correct test for RPC model initialization --- .../Transform/test/otbCreateInverseForwardSensorModel.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/Core/Transform/test/otbCreateInverseForwardSensorModel.cxx b/Modules/Core/Transform/test/otbCreateInverseForwardSensorModel.cxx index 9a4284b75e..5eee545c5a 100644 --- a/Modules/Core/Transform/test/otbCreateInverseForwardSensorModel.cxx +++ b/Modules/Core/Transform/test/otbCreateInverseForwardSensorModel.cxx @@ -68,24 +68,24 @@ int otbCreateInverseForwardSensorModel(int argc, char* argv[]) ImageType::Pointer inputImage = reader->GetOutput(); otbGenericMsgDebugMacro(<< "Inverse model creation..."); - if (inverse_rpc_model->SetMetadata(inputImage->GetImageMetadata())) + if (!inverse_rpc_model->SetMetadata(inputImage->GetImageMetadata())) { std::cout << "Error while reading model. This is not a RPC model!" << std::endl; return EXIT_FAILURE; } - if (inverse_rpc_model->IsValidSensorModel() == false) + if (!inverse_rpc_model->IsValidSensorModel()) { std::cout << "Model not set!" << std::endl; return EXIT_FAILURE; } otbGenericMsgDebugMacro(<< "Forward model creation..."); - if (forward_rpc_model->SetMetadata(inputImage->GetImageMetadata())) + if (!forward_rpc_model->SetMetadata(inputImage->GetImageMetadata())) { std::cout << "Error while reading model. This is not a RPC model!" << std::endl; return EXIT_FAILURE; } - if (forward_rpc_model->IsValidSensorModel() == false) + if (!forward_rpc_model->IsValidSensorModel()) { std::cout << "Model not set!" << std::endl; return EXIT_FAILURE; -- GitLab From 0a4fe5bfbf7ccb09f743ffefa17b96972502d83f Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Mon, 14 Sep 2020 16:02:55 +0200 Subject: [PATCH 031/123] BUG: Use make_unique to instantiate unique_ptrs --- Modules/Core/Transform/include/otbRPCTransformBase.hxx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Modules/Core/Transform/include/otbRPCTransformBase.hxx b/Modules/Core/Transform/include/otbRPCTransformBase.hxx index 046dd106cf..d75c7d68b3 100644 --- a/Modules/Core/Transform/include/otbRPCTransformBase.hxx +++ b/Modules/Core/Transform/include/otbRPCTransformBase.hxx @@ -34,17 +34,16 @@ bool RPCTransformBase::SetMeta try { Projection::RPCParam newParam = boost::any_cast(imd[MDGeom::RPC]); - this->m_RPCParam.reset(&newParam); + this->m_RPCParam = std::make_unique(newParam); } catch (boost::bad_any_cast) { return false; } - GDALRPCTransformer newTrans = GDALRPCTransformer( + this->m_Transformer = std::make_unique( m_RPCParam->LineOffset, m_RPCParam->SampleOffset, m_RPCParam->LatOffset, m_RPCParam->LonOffset, m_RPCParam->HeightOffset, m_RPCParam->LineScale, m_RPCParam->SampleScale, m_RPCParam->LatScale, m_RPCParam->LonScale, m_RPCParam->HeightScale, m_RPCParam->LineNum, m_RPCParam->LineDen, m_RPCParam->SampleNum, m_RPCParam->SampleDen); - this->m_Transformer.reset(&newTrans); return true; } -- GitLab From a6c88a59eedd10952f0bec34d3383e6b1a74d7ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Tue, 15 Sep 2020 16:03:10 +0200 Subject: [PATCH 032/123] WIP: add RPC parsing for SPOT 6 --- .../include/otbSpot6ImageMetadataInterface.h | 3 ++ .../otbQuickBirdImageMetadataInterface.cxx | 25 +++++++++++++- .../src/otbSpot6ImageMetadataInterface.cxx | 34 +++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/Modules/Core/Metadata/include/otbSpot6ImageMetadataInterface.h b/Modules/Core/Metadata/include/otbSpot6ImageMetadataInterface.h index 9fd5a17438..6f83a0258f 100644 --- a/Modules/Core/Metadata/include/otbSpot6ImageMetadataInterface.h +++ b/Modules/Core/Metadata/include/otbSpot6ImageMetadataInterface.h @@ -150,6 +150,9 @@ public: * There values a computed by 6S. */ WavelengthSpectralBandVectorType GetSpectralSensitivity() const override; + void Parse(const MetadataSupplierInterface *) override; + + protected: Spot6ImageMetadataInterface(); ~Spot6ImageMetadataInterface() override diff --git a/Modules/Core/Metadata/src/otbQuickBirdImageMetadataInterface.cxx b/Modules/Core/Metadata/src/otbQuickBirdImageMetadataInterface.cxx index c1fc52f2d2..98aae1ec0a 100644 --- a/Modules/Core/Metadata/src/otbQuickBirdImageMetadataInterface.cxx +++ b/Modules/Core/Metadata/src/otbQuickBirdImageMetadataInterface.cxx @@ -955,7 +955,30 @@ QuickBirdImageMetadataInterface::WavelengthSpectralBandVectorType QuickBirdImage } void QuickBirdImageMetadataInterface::Parse(const MetadataSupplierInterface *mds) -{ +{ + assert(mds); + // Check if there is DG metadatas + bool hasValue = false; + auto metadatatype = mds->GetMetadataValue("METADATATYPE", hasValue); + if (!hasValue || metadatatype != "DG") + { + otbGenericExceptionMacro(MissingMetadataException, + << "No Digital Globe metadata has been found") + } + + // Check if the sensor is WorldView 2 + auto sensorID = mds->GetMetadataValue("IMD/IMAGE_1.satId", hasValue); + + if (sensorID.find("QB02") != std::string::npos) + { + m_Imd.Add(MDStr::SensorID, "QB02"); + m_Imd.Add(MDStr::Mission, "Quickbird"); + } + else + { + otbGenericExceptionMacro(MissingMetadataException, << "Not a Quickbird image") + } + FetchRPC(*mds); } diff --git a/Modules/Core/Metadata/src/otbSpot6ImageMetadataInterface.cxx b/Modules/Core/Metadata/src/otbSpot6ImageMetadataInterface.cxx index 4721ae9c95..d3fef73884 100644 --- a/Modules/Core/Metadata/src/otbSpot6ImageMetadataInterface.cxx +++ b/Modules/Core/Metadata/src/otbSpot6ImageMetadataInterface.cxx @@ -26,6 +26,8 @@ #include "otbImageKeywordlist.h" #include "otbStringUtils.h" +#include "otbDimapMetadataHelper.h" + namespace otb { using boost::lexical_cast; @@ -1252,4 +1254,36 @@ Spot6ImageMetadataInterface::WavelengthSpectralBandVectorType Spot6ImageMetadata return wavelengthSpectralBand; } +void Spot6ImageMetadataInterface::Parse(const MetadataSupplierInterface *mds) +{ + assert(mds); + + std::cout << "Spot6ImageMetadataInterface::Parse" << std::endl; +/* + bool hasValue = false; + auto metadatatype = mds->GetMetadataValue("METADATATYPE", hasValue); + + // DIMAP metadata has already been parsed by gdal + if (hasValue && metadatatype == "DIMAP") + { + DimapMetadataHelper helper(mds); + + helper.ParseRadiometry(m_Imd); + } +*/ + + Fetch(MDStr::SensorID, *mds, "IMAGERY/SATELLITEID"); + if (strncmp(m_Imd[MDStr::SensorID].c_str(), "SPOT 6", 6) == 0) + { + m_Imd.Add(MDStr::Mission, "SPOT 6"); + } + else + { + otbGenericExceptionMacro(MissingMetadataException,<<"Not a spot 6 product") + } + + FetchRPC(*mds); +} + + } // end namespace otb -- GitLab From a92b6226f44600811f8b28db2ff48022934be473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Tue, 15 Sep 2020 16:20:57 +0200 Subject: [PATCH 033/123] COMP: remove missing header --- Modules/Core/Metadata/src/otbSpot6ImageMetadataInterface.cxx | 2 -- 1 file changed, 2 deletions(-) diff --git a/Modules/Core/Metadata/src/otbSpot6ImageMetadataInterface.cxx b/Modules/Core/Metadata/src/otbSpot6ImageMetadataInterface.cxx index d3fef73884..cafc8037f6 100644 --- a/Modules/Core/Metadata/src/otbSpot6ImageMetadataInterface.cxx +++ b/Modules/Core/Metadata/src/otbSpot6ImageMetadataInterface.cxx @@ -26,8 +26,6 @@ #include "otbImageKeywordlist.h" #include "otbStringUtils.h" -#include "otbDimapMetadataHelper.h" - namespace otb { using boost::lexical_cast; -- GitLab From 7b56d4647465ae39ca64fa415afbd4afdcd9180d Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 16 Sep 2020 13:20:00 +0200 Subject: [PATCH 034/123] WIP: Analyse of a segfault --- .../Metadata/include/otbGeometryMetadata.h | 5 +++ .../Core/Metadata/src/otbGeometryMetadata.cxx | 43 +++++++++++++++++++ .../src/otbImageMetadataInterfaceBase.cxx | 3 +- .../Transform/include/otbRPCTransformBase.hxx | 3 ++ .../otbGenericRSResampleImageFilter.hxx | 4 +- 5 files changed, 55 insertions(+), 3 deletions(-) diff --git a/Modules/Core/Metadata/include/otbGeometryMetadata.h b/Modules/Core/Metadata/include/otbGeometryMetadata.h index ccd902ecce..bcb9b903f3 100644 --- a/Modules/Core/Metadata/include/otbGeometryMetadata.h +++ b/Modules/Core/Metadata/include/otbGeometryMetadata.h @@ -116,6 +116,11 @@ struct OTBMetadata_EXPORT GCPParam */ struct OTBMetadata_EXPORT RPCParam { + // Constructors + RPCParam() = default; + RPCParam( const RPCParam & ); // CopyConstructible required for boost::any + RPCParam& operator=(RPCParam); //CopyAssignment optional for boost::any + // Offsets double LineOffset = 0.0; double SampleOffset = 0.0; diff --git a/Modules/Core/Metadata/src/otbGeometryMetadata.cxx b/Modules/Core/Metadata/src/otbGeometryMetadata.cxx index 0dadc355c4..dcb21155b2 100644 --- a/Modules/Core/Metadata/src/otbGeometryMetadata.cxx +++ b/Modules/Core/Metadata/src/otbGeometryMetadata.cxx @@ -77,6 +77,49 @@ std::string GCPParam::ToJSON(bool multiline) const return oss.str(); } +RPCParam::RPCParam( const RPCParam & other ) + : LineOffset(other.LineOffset), + SampleOffset(other.SampleOffset), + LatOffset(other.LatOffset), + LonOffset(other.LonOffset), + HeightOffset(other.HeightOffset), + LineScale(other.LineScale), + SampleScale(other.SampleScale), + LatScale(other.LatScale), + LonScale(other.LonScale), + HeightScale(other.HeightScale) +{ + for(int i = 0 ; i < 20 ; ++i) + { + LineNum[i] = other.LineNum[i]; + LineDen[i] = other.LineDen[i]; + SampleNum[i] = other.SampleNum[i]; + SampleDen[i] = other.SampleDen[i]; + } +} + +RPCParam& RPCParam::operator=(RPCParam other) +{ + LineOffset = other.LineOffset; + SampleOffset = other.SampleOffset; + LatOffset = other.LatOffset; + LonOffset = other.LonOffset; + HeightOffset = other.HeightOffset; + LineScale = other.LineScale; + SampleScale = other.SampleScale; + LatScale = other.LatScale; + LonScale = other.LonScale; + HeightScale = other.HeightScale; + for(int i = 0 ; i < 20 ; ++i) + { + LineNum[i] = other.LineNum[i]; + LineDen[i] = other.LineDen[i]; + SampleNum[i] = other.SampleNum[i]; + SampleDen[i] = other.SampleDen[i]; + } + return *this; +} + std::string RPCParam::ToJSON(bool multiline) const { std::ostringstream oss; diff --git a/Modules/Core/Metadata/src/otbImageMetadataInterfaceBase.cxx b/Modules/Core/Metadata/src/otbImageMetadataInterfaceBase.cxx index 7d662a217e..d4351f9062 100644 --- a/Modules/Core/Metadata/src/otbImageMetadataInterfaceBase.cxx +++ b/Modules/Core/Metadata/src/otbImageMetadataInterfaceBase.cxx @@ -718,7 +718,8 @@ const boost::any& ImageMetadataInterfaceBase::FetchRPC( coeffs = mds.GetAsVector("RPC/SAMP_DEN_COEFF",' ',20); std::copy(coeffs.begin(), coeffs.end(), rpcStruct.SampleDen); - m_Imd.Add(MDGeom::RPC, rpcStruct); + boost::any to_append = rpcStruct; + m_Imd.Add(MDGeom::RPC, to_append); return m_Imd[MDGeom::RPC]; } diff --git a/Modules/Core/Transform/include/otbRPCTransformBase.hxx b/Modules/Core/Transform/include/otbRPCTransformBase.hxx index d75c7d68b3..1c04f39c66 100644 --- a/Modules/Core/Transform/include/otbRPCTransformBase.hxx +++ b/Modules/Core/Transform/include/otbRPCTransformBase.hxx @@ -33,6 +33,9 @@ bool RPCTransformBase::SetMeta return false; try { + const boost::any any_rpc = imd[MDGeom::RPC]; //TODO: Segfault here. + if (any_rpc.empty()) + return false; Projection::RPCParam newParam = boost::any_cast(imd[MDGeom::RPC]); this->m_RPCParam = std::make_unique(newParam); } diff --git a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx index 3bd2c610b0..b500e572ae 100644 --- a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx +++ b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx @@ -198,7 +198,7 @@ void GenericRSResampleImageFilter::SetOutputParameter this->SetOutputStartIndex(src->GetLargestPossibleRegion().GetIndex()); this->SetOutputSize(src->GetLargestPossibleRegion().GetSize()); this->SetOutputProjectionRef(src->GetProjectionRef()); - this->SetOutputKeywordList(src->GetImageKeywordlist()); + this->GetOutput()->SetImageMetadata(src->GetImageKeywordlist()); } /** @@ -214,7 +214,7 @@ void GenericRSResampleImageFilter::SetOutputParameter this->SetOutputStartIndex(image->GetLargestPossibleRegion().GetIndex()); this->SetOutputSize(image->GetLargestPossibleRegion().GetSize()); this->SetOutputProjectionRef(image->GetProjectionRef()); - this->SetOutputKeywordList(image->GetImageKeywordlist()); + this->GetOutput()->SetImageMetadata(image->GetImageKeywordlist()); } /** -- GitLab From c6a9027c4419795d20d1fc89db86135378e6ed50 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Thu, 1 Oct 2020 09:49:23 +0200 Subject: [PATCH 035/123] BUG: Miss-merged conflicts --- Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt | 1 - .../Adapters/OSSIMAdapters/test/otbOSSIMAdaptersTestDriver.cxx | 1 - 2 files changed, 2 deletions(-) diff --git a/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt b/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt index 4a0529ce24..711553b7f8 100644 --- a/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt +++ b/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt @@ -27,7 +27,6 @@ otbOssimJpegFileResourceLeakTest.cxx otbOssimElevManagerTest2.cxx otbOssimElevManagerTest4.cxx otbDEMHandlerTest.cxx -otbSarSensorModelAdapterTest.cxx ) add_executable(otbOSSIMAdaptersTestDriver ${OTBOSSIMAdaptersTests}) diff --git a/Modules/Adapters/OSSIMAdapters/test/otbOSSIMAdaptersTestDriver.cxx b/Modules/Adapters/OSSIMAdapters/test/otbOSSIMAdaptersTestDriver.cxx index e85ab14706..9deb8f2a3c 100644 --- a/Modules/Adapters/OSSIMAdapters/test/otbOSSIMAdaptersTestDriver.cxx +++ b/Modules/Adapters/OSSIMAdapters/test/otbOSSIMAdaptersTestDriver.cxx @@ -27,5 +27,4 @@ void RegisterTests() REGISTER_TEST(otbOssimElevManagerTest2); REGISTER_TEST(otbOssimElevManagerTest4); REGISTER_TEST(otbDEMHandlerTest); - REGISTER_TEST(otbSarSensorModelAdapterTest); } -- GitLab From e45643e3c7e6324deb629a9810bb14120c84944c Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Fri, 2 Oct 2020 18:37:58 +0200 Subject: [PATCH 036/123] WIP: Add possibility to use "in-memory dataset" for multi-tile DEM --- Modules/IO/IOGDAL/include/otbDEMHandler.h | 5 ++++- Modules/IO/IOGDAL/src/otbDEMHandler.cxx | 12 ++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Modules/IO/IOGDAL/include/otbDEMHandler.h b/Modules/IO/IOGDAL/include/otbDEMHandler.h index 830a5a90d0..4fe01039a9 100644 --- a/Modules/IO/IOGDAL/include/otbDEMHandler.h +++ b/Modules/IO/IOGDAL/include/otbDEMHandler.h @@ -33,7 +33,7 @@ namespace otb * This class is the single configuration and access point for * elevation handling in images projections and localization * functions. Since this class is a singleton, there is no New() method. The - * DEMHandler::Instance() method should be used instead. + * DEMHandler::GetInstance() method should be used instead. * * Please be aware that a proper instantiation and parameter setting * of this class is advised before any call to geometric filters or @@ -141,6 +141,9 @@ public: /** Clear the DEM list and close all DEM datasets */ void ClearDEMs(); + /** Path to the in-memory vrt */ + const std::string DEM_DATASET_PATH = "/vsimem/otb_dem_dataset.vrt"; + protected: DEMHandler(); diff --git a/Modules/IO/IOGDAL/src/otbDEMHandler.cxx b/Modules/IO/IOGDAL/src/otbDEMHandler.cxx index ee175b97dd..5412b2c1dc 100644 --- a/Modules/IO/IOGDAL/src/otbDEMHandler.cxx +++ b/Modules/IO/IOGDAL/src/otbDEMHandler.cxx @@ -181,6 +181,7 @@ DEMHandler::~DEMHandler() } ClearDEMs(); + VSIUnlink(DEM_DATASET_PATH.c_str()); } void DEMHandler::OpenDEMFile(const std::string& path) @@ -195,6 +196,10 @@ void DEMHandler::OpenDEMDirectory(const std::string& DEMDirectory) // TODO : RemoveOSSIM OssimDEMHandler::Instance()->OpenDEMDirectory(DEMDirectory); + // Free the previous in-memory dataset (if any) + if (!m_DatasetList.empty()) + VSIUnlink(DEM_DATASET_PATH.c_str()); + auto demFiles = DEMDetails::GetFilesInDirectory(DEMDirectory); for (const auto & file : demFiles) { @@ -227,8 +232,11 @@ void DEMHandler::OpenDEMDirectory(const std::string& DEMDirectory) vrtDatasetList[i] = m_DatasetList[i]->GetDataSet(); } - m_Dataset = static_cast (GDALBuildVRT(nullptr, vrtSize, vrtDatasetList.data(), - nullptr, nullptr, nullptr)); + auto close_me = GDALBuildVRT(DEM_DATASET_PATH.c_str(), vrtSize, vrtDatasetList.data(), + nullptr, nullptr, nullptr); + // Need to close the dataset, so it is flushed into memory. + GDALClose(close_me); + m_Dataset = static_cast(GDALOpen(DEM_DATASET_PATH.c_str(), GA_ReadOnly)); m_DEMDirectories.push_back(DEMDirectory); } -- GitLab From 13d9dff98d857181312eb6d062d7f9f1ee68eab1 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Fri, 2 Oct 2020 18:39:07 +0200 Subject: [PATCH 037/123] WIP: Fix RPCTransform test and update with DEM capabilities (failing) --- .../include/otbGDALRPCTransformer.h | 2 + .../Adapters/GdalAdapters/test/CMakeLists.txt | 2 +- .../test/otbGDALRPCTransformerTest.cxx | 106 +++++++++++------- 3 files changed, 66 insertions(+), 44 deletions(-) diff --git a/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h b/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h index 60a5cae855..d9f67e3fbd 100644 --- a/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h +++ b/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h @@ -166,6 +166,7 @@ public: * It works with only one point. * * \param[in] p coordinates of the point to convert + * \return the coordinates of the converted point */ PointType ForwardTransform(PointType p); @@ -192,6 +193,7 @@ public: * It works with only one point. * * \param[in] p coordinates of the point to convert + * \return the coordinates of the converted point */ PointType InverseTransform(PointType p); diff --git a/Modules/Adapters/GdalAdapters/test/CMakeLists.txt b/Modules/Adapters/GdalAdapters/test/CMakeLists.txt index 362341908b..b3278aec04 100644 --- a/Modules/Adapters/GdalAdapters/test/CMakeLists.txt +++ b/Modules/Adapters/GdalAdapters/test/CMakeLists.txt @@ -102,5 +102,5 @@ otb_add_test(NAME TuOCoordinateTransformationTest otb_add_test(NAME TuGDALRPCTransformerTest COMMAND otbGdalAdaptersTestDriver otbGDALRPCTransformerTest - LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF} + ${INPUTDATA}/DEM/srtm_directory/ ) diff --git a/Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx b/Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx index 8dfb50a82e..47ecac22fc 100644 --- a/Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx +++ b/Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx @@ -23,6 +23,9 @@ #include "otbImage.h" #include "otbImageFileReader.h" #include "otbImageMetadata.h" +#include "gdal_utils.h" +#include +#include "otbDEMHandler.h" typedef otb::Image ImageType; typedef otb::ImageFileReader ReaderType; @@ -67,31 +70,34 @@ int otbGDALRPCTransformerTest(int itkNotUsed(argc), char* argv[]) double exp_x = 147.1753248795781; double exp_y = -42.78881952208293; double exp_z = 0.0; + std::cout << "Test ForwardTransform with double interface." << '\n'; if(!transformer.ForwardTransform(x.data(), y.data(), z.data(), 2)) { std::cout << "ForwardTransform failed, returned False." << '\n'; success = false; - } - if (!itk::Math::FloatAlmostEqual(x[0], exp_x)) - { - std::cout << "Bad value for latitude. Expected " << exp_x << " but computed " << x[0] << "\n"; - success = false; - } - if (!itk::Math::FloatAlmostEqual(y[0], exp_y)) - { - std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << y[0] << "\n"; - success = false; - } - if (!itk::Math::FloatAlmostEqual(z[0], exp_z)) - { - std::cout << "Bad value for height. Expected " << exp_z << " but computed " << z[0] << "\n"; - success = false; + } else { + if (!itk::Math::FloatAlmostEqual(x[0], exp_x)) + { + std::cout << "Bad value for latitude. Expected " << exp_x << " but computed " << x[0] << "\n"; + success = false; + } + if (!itk::Math::FloatAlmostEqual(y[0], exp_y)) + { + std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << y[0] << "\n"; + success = false; + } + if (!itk::Math::FloatAlmostEqual(z[0], exp_z)) + { + std::cout << "Bad value for height. Expected " << exp_z << " but computed " << z[0] << "\n"; + success = false; + } } otb::GDALRPCTransformer::PointType zePoint; zePoint[0] = 20.0; zePoint[1] = 10.0; zePoint[2] = 0.0; - transformer.ForwardTransform(zePoint); + std::cout << "Test ForwardTransform with point interface." << '\n'; + zePoint = transformer.ForwardTransform(zePoint); if (!itk::Math::FloatAlmostEqual(zePoint[0], exp_x)) { std::cout << "Bad value for latitude. Expected " << exp_x << " but computed " << zePoint[0] << "\n"; @@ -113,44 +119,58 @@ int otbGDALRPCTransformerTest(int itkNotUsed(argc), char* argv[]) y = {exp_y, exp_y}; zePoint[0] = exp_x; zePoint[1] = exp_y; + zePoint[2] = 0.0; exp_x = 20.01139515217801; exp_y = 9.984517889590279; + std::cout << "Test InverseTransform with double interface." << '\n'; if(!transformer.InverseTransform(x.data(), y.data(), z.data(), 2)) { - std::cout << "ForwardTransform failed, returned False." << '\n'; - success = false; - } - if (!itk::Math::FloatAlmostEqual(x[0], exp_x)) - { - std::cout << "Bad value for latitude. Expected " << exp_x << " but computed " << x[0] << "\n"; + std::cout << "InverseTransform failed, returned False." << '\n'; success = false; + } else { + if (!itk::Math::FloatAlmostEqual(x[0], exp_x)) + { + std::cout << "Bad value for latitude. Expected " << exp_x << " but computed " << x[0] << "\n"; + success = false; + } + if (!itk::Math::FloatAlmostEqual(y[0], exp_y)) + { + std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << y[0] << "\n"; + success = false; + } + if (!itk::Math::FloatAlmostEqual(z[0], exp_z)) + { + std::cout << "Bad value for height. Expected " << exp_z << " but computed " << z[0] << "\n"; + success = false; + } } - if (!itk::Math::FloatAlmostEqual(y[0], exp_y)) - { - std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << y[0] << "\n"; - success = false; - } - if (!itk::Math::FloatAlmostEqual(z[0], exp_z)) - { - std::cout << "Bad value for height. Expected " << exp_z << " but computed " << z[0] << "\n"; - success = false; - } - transformer.ForwardTransform(zePoint); + std::cout << "Test InverseTransform with point interface." << '\n'; + zePoint = transformer.InverseTransform(zePoint); if (!itk::Math::FloatAlmostEqual(zePoint[0], exp_x)) { std::cout << "Bad value for latitude. Expected " << exp_x << " but computed " << zePoint[0] << "\n"; success = false; + } else { + if (!itk::Math::FloatAlmostEqual(zePoint[1], exp_y)) + { + std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << zePoint[1] << "\n"; + success = false; + } + if (!itk::Math::FloatAlmostEqual(zePoint[2], exp_z)) + { + std::cout << "Bad value for height. Expected " << exp_z << " but computed " << zePoint[2] << "\n"; + success = false; + } } - if (!itk::Math::FloatAlmostEqual(zePoint[1], exp_y)) - { - std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << zePoint[1] << "\n"; - success = false; - } - if (!itk::Math::FloatAlmostEqual(zePoint[2], exp_z)) - { - std::cout << "Bad value for height. Expected " << exp_z << " but computed " << zePoint[2] << "\n"; - success = false; - } + + // Test with a DEM + otb::DEMHandler& dem = otb::DEMHandler::GetInstance(); + dem.OpenDEMDirectory(argv[1]); + zePoint[0] = 41.9051; + zePoint[1] = 2.3495; + transformer.SetOption("RPC_DEM", dem.DEM_DATASET_PATH); + zePoint = transformer.InverseTransform(zePoint); + std::cout << "POINT : " << zePoint << '\n'; if (success) return EXIT_SUCCESS; -- GitLab From bccb6f158bc1704f2dc85474128df6dd87d8f4c9 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Tue, 6 Oct 2020 10:27:33 +0200 Subject: [PATCH 038/123] ENH: Write the DEM to the VSI memory as a VRT The DEMHandler creates a VRT in any cases (the user provides a unique file, or a directory with only one file or with multiple files). This VRT is loaded into vsi memory, so it can be accessed by other procvesses. --- Modules/IO/IOGDAL/src/otbDEMHandler.cxx | 39 ++++++++++++------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/Modules/IO/IOGDAL/src/otbDEMHandler.cxx b/Modules/IO/IOGDAL/src/otbDEMHandler.cxx index 5412b2c1dc..ce049f51b6 100644 --- a/Modules/IO/IOGDAL/src/otbDEMHandler.cxx +++ b/Modules/IO/IOGDAL/src/otbDEMHandler.cxx @@ -187,7 +187,13 @@ DEMHandler::~DEMHandler() void DEMHandler::OpenDEMFile(const std::string& path) { m_DatasetList.push_back(otb::GDALDriverManagerWrapper::GetInstance().Open(path)); - m_Dataset = m_DatasetList.back()->GetDataSet(); + std::vector vrtDatasetList(1); + vrtDatasetList[0] = m_DatasetList[0]->GetDataSet(); + auto close_me = GDALBuildVRT(DEM_DATASET_PATH.c_str(), 1, vrtDatasetList.data(), + nullptr, nullptr, nullptr); + // Need to close the dataset, so it is flushed into memory. + GDALClose(close_me); + m_Dataset = static_cast(GDALOpen(DEM_DATASET_PATH.c_str(), GA_ReadOnly)); m_DEMDirectories.push_back(path); } @@ -212,34 +218,25 @@ void DEMHandler::OpenDEMDirectory(const std::string& DEMDirectory) int vrtSize = m_DatasetList.size(); - // Don't build a vrt if there is less than two dataset + // Don't build a vrt if there is no dataset if (m_DatasetList.empty()) { m_Dataset = nullptr; } else { - if (vrtSize == 1) + std::vector vrtDatasetList(vrtSize); + for (int i = 0; i < vrtSize; i++) { - m_Dataset = m_DatasetList[0]->GetDataSet(); - m_DEMDirectories.push_back(DEMDirectory); + vrtDatasetList[i] = m_DatasetList[i]->GetDataSet(); } - else - { - std::vector vrtDatasetList(vrtSize); - for (int i = 0; i < vrtSize; i++) - { - vrtDatasetList[i] = m_DatasetList[i]->GetDataSet(); - } - - auto close_me = GDALBuildVRT(DEM_DATASET_PATH.c_str(), vrtSize, vrtDatasetList.data(), - nullptr, nullptr, nullptr); - // Need to close the dataset, so it is flushed into memory. - GDALClose(close_me); - m_Dataset = static_cast(GDALOpen(DEM_DATASET_PATH.c_str(), GA_ReadOnly)); - m_DEMDirectories.push_back(DEMDirectory); - } - + + auto close_me = GDALBuildVRT(DEM_DATASET_PATH.c_str(), vrtSize, vrtDatasetList.data(), + nullptr, nullptr, nullptr); + // Need to close the dataset, so it is flushed into memory. + GDALClose(close_me); + m_Dataset = static_cast(GDALOpen(DEM_DATASET_PATH.c_str(), GA_ReadOnly)); + m_DEMDirectories.push_back(DEMDirectory); } } -- GitLab From 2511d662512d39d40394bfe7b552608a7983691c Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Tue, 6 Oct 2020 10:28:19 +0200 Subject: [PATCH 039/123] TEST: Update the RPCTransformer test with DEM capabilities --- Data/Input/TuGDALRPCTransformerTest_DEM.tif | 3 + .../Adapters/GdalAdapters/test/CMakeLists.txt | 2 +- .../test/otbGDALRPCTransformerTest.cxx | 147 +++++++++++------- 3 files changed, 97 insertions(+), 55 deletions(-) create mode 100644 Data/Input/TuGDALRPCTransformerTest_DEM.tif diff --git a/Data/Input/TuGDALRPCTransformerTest_DEM.tif b/Data/Input/TuGDALRPCTransformerTest_DEM.tif new file mode 100644 index 0000000000..2e415a945d --- /dev/null +++ b/Data/Input/TuGDALRPCTransformerTest_DEM.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cdb3ff53ea8395991872756e94025a72a43d9ad11229699370e3ae92f2a9ad2f +size 10376 diff --git a/Modules/Adapters/GdalAdapters/test/CMakeLists.txt b/Modules/Adapters/GdalAdapters/test/CMakeLists.txt index b3278aec04..548c17738f 100644 --- a/Modules/Adapters/GdalAdapters/test/CMakeLists.txt +++ b/Modules/Adapters/GdalAdapters/test/CMakeLists.txt @@ -102,5 +102,5 @@ otb_add_test(NAME TuOCoordinateTransformationTest otb_add_test(NAME TuGDALRPCTransformerTest COMMAND otbGdalAdaptersTestDriver otbGDALRPCTransformerTest - ${INPUTDATA}/DEM/srtm_directory/ + ${INPUTDATA}/TuGDALRPCTransformerTest_DEM.tif ) diff --git a/Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx b/Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx index 47ecac22fc..78dd1b2af6 100644 --- a/Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx +++ b/Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx @@ -34,41 +34,41 @@ int otbGDALRPCTransformerTest(int itkNotUsed(argc), char* argv[]) { bool success = true; - double LineOffset = 15834.0, SampleOffset = 13464.0, - LatOffset = -42.8607, LonOffset = 147.2588, HeightOffset = 300.0, - LineScale = 15834.0, SampleScale = 13464.0, - LatScale = 0.0715, LonScale = 0.0828, HeightScale = 970.0; + double LineOffset = 16201.0, SampleOffset = 15184.0, + LatOffset = 39.7792, LonOffset = 125.7510, HeightOffset = 97.0, + LineScale = 16480.0, SampleScale = 15217.0, + LatScale = 0.0900, LonScale = 0.1096, HeightScale = 501.0; const double line_num_coeff[20] = { - -0.000539636886315094, 0.00262771165447159, -1.00287836503009, -0.0340303311076584, 0.00523658598538616, - 0.00210057328569037, 0.00311664695421511, 0.000406267962891555, -0.00550089873884607, 5.26202553862825e-05, - 2.5958707865627e-06, -2.23632198653199e-06, 2.02822452334703e-05, -5.24009408417096e-06, 2.16913023637956e-05, - -2.36002554032361e-05, 1.56703932477487e-06, -6.14095576183939e-06, 1.8422191786661e-05, 2.01615774485329e-07}; + +5.105608E-04, -2.921055E-02, -1.010407E+00, -1.743729E-02, -6.604239E-05, + -7.871396E-05, +3.027877E-04, -4.323587E-04, -2.624751E-04, +6.186490E-06, + +1.084676E-06, +5.389738E-05, +4.145232E-06, +3.911486E-07, +1.772434E-05, + +3.302960E-06, +3.006106E-06, +1.662606E-05, +6.051677E-06, -2.657667E-08}; const double line_den_coeff[20] = { - 1, -0.00520769693945429, 0.00549138470185778, -0.00472718007439368, -2.02057365543208e-05, - 8.39509604990839e-06, -3.43728317291176e-05, -1.94598141718645e-05, 2.35660616018416e-05, 3.71653924834455e-06, - 7.08406853351595e-08, -5.72002373463043e-09, 8.71363385561163e-09, -4.39082343385483e-09, 1.39161295297537e-08, - -1.24914964124471e-08, 4.6171143198849e-08, 1.70067569381897e-08, -2.37449991316111e-08, 9.05460084990073e-10}; + +1.000000E+00, -9.652128E-05, +2.488346E-04, +3.089019E-04, -2.120170E-06, + +4.117913E-07, +1.370009E-06, +1.357281E-05, -4.174324E-06, -3.146787E-06, + -7.724587E-06, +3.524480E-04, -1.303224E-05, -8.507679E-07, -1.670972E-05, + +6.781061E-06, +5.602262E-07, +1.161421E-05, +4.681872E-06, +5.593931E-08}; const double samp_num_coeff[20] = { - 0.00121386429106107, 1.0047652205584, 0.00363040578479236, -0.033702055558379, 0.00665808526532754, - -0.0036225246184886, -0.000251174639124558, -0.00523232964739848, 1.74629130199178e-05, 0.000131049715749837, - -2.8029900276216e-05, -1.95273546561053e-05, 2.91977037724833e-05, 2.78736117374265e-07, -2.64005759423042e-05, - 7.08277764663844e-08, 1.12211574945991e-06, 1.15330773275834e-06, 7.15463416011193e-07, -2.42741993962372e-08}; + -2.429563E-04, +1.028320E+00, -3.360972E-02, +3.519600E-03, -6.568341E-04, + +5.951139E-04, -3.875716E-04, +1.260622E-04, -5.273817E-05, -4.418981E-06, + -3.520581E-06, -2.502760E-04, -4.167704E-05, -5.973233E-05, -1.438949E-04, + +7.603041E-06, +2.358136E-06, -2.275274E-05, +1.602657E-06, -1.716541E-07}; const double samp_den_coeff[20] = { - 1, -0.00520769693945429, 0.00549138470185778, -0.00472718007439368, -2.02057365543208e-05, - 8.39509604990839e-06, -3.43728317291176e-05, -1.94598141718645e-05, 2.35660616018416e-05, 3.71653924834455e-06, - 7.08406853351595e-08, -5.72002373463043e-09, 8.71363385561163e-09, -4.39082343385483e-09, 1.39161295297537e-08, - -1.24914964124471e-08, 4.6171143198849e-08, 1.70067569381897e-08, -2.37449991316111e-08, 9.05460084990073e-10}; + +1.000000E+00, +7.765620E-05, +6.568707E-04, -6.270621E-04, +5.163170E-05, + +6.979463E-06, +2.476334E-07, +1.083558E-04, -4.043734E-05, -5.819288E-05, + +1.778201E-07, +5.665202E-05, +6.927205E-06, +6.793485E-07, +3.604209E-05, + -4.057103E-07, -8.291254E-07, +1.010650E-05, -2.875552E-06, +5.142751E-08}; otb::GDALRPCTransformer transformer(LineOffset, SampleOffset, LatOffset, LonOffset, HeightOffset, LineScale, SampleScale, LatScale, LonScale, HeightScale, line_num_coeff, line_den_coeff, samp_num_coeff, samp_den_coeff); // Test ForwardTransform - std::vector x = {20, 20}; - std::vector y = {10, 10}; + std::vector x = {20.5, 20.5}; + std::vector y = {10.5, 10.5}; std::vector z = {0, 0}; - double exp_x = 147.1753248795781; - double exp_y = -42.78881952208293; + double exp_x = 125.64830100509131; + double exp_y = 39.869433991997553; double exp_z = 0.0; std::cout << "Test ForwardTransform with double interface." << '\n'; if(!transformer.ForwardTransform(x.data(), y.data(), z.data(), 2)) @@ -76,39 +76,39 @@ int otbGDALRPCTransformerTest(int itkNotUsed(argc), char* argv[]) std::cout << "ForwardTransform failed, returned False." << '\n'; success = false; } else { - if (!itk::Math::FloatAlmostEqual(x[0], exp_x)) + if (x[0] - exp_x > 0.000001) { std::cout << "Bad value for latitude. Expected " << exp_x << " but computed " << x[0] << "\n"; success = false; } - if (!itk::Math::FloatAlmostEqual(y[0], exp_y)) + if (y[0] - exp_y > 0.000001) { std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << y[0] << "\n"; success = false; } - if (!itk::Math::FloatAlmostEqual(z[0], exp_z)) + if (z[0] - exp_z > 0.1) { std::cout << "Bad value for height. Expected " << exp_z << " but computed " << z[0] << "\n"; success = false; } } otb::GDALRPCTransformer::PointType zePoint; - zePoint[0] = 20.0; - zePoint[1] = 10.0; + zePoint[0] = 20.5; + zePoint[1] = 10.5; zePoint[2] = 0.0; std::cout << "Test ForwardTransform with point interface." << '\n'; zePoint = transformer.ForwardTransform(zePoint); - if (!itk::Math::FloatAlmostEqual(zePoint[0], exp_x)) + if (zePoint[0] - exp_x > 0.000001) { std::cout << "Bad value for latitude. Expected " << exp_x << " but computed " << zePoint[0] << "\n"; success = false; } - if (!itk::Math::FloatAlmostEqual(zePoint[1], exp_y)) + if (zePoint[1] - exp_y > 0.000001) { std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << zePoint[1] << "\n"; success = false; } - if (!itk::Math::FloatAlmostEqual(zePoint[2], exp_z)) + if (zePoint[2] - exp_z > 0.1) { std::cout << "Bad value for height. Expected " << exp_z << " but computed " << zePoint[2] << "\n"; success = false; @@ -120,25 +120,25 @@ int otbGDALRPCTransformerTest(int itkNotUsed(argc), char* argv[]) zePoint[0] = exp_x; zePoint[1] = exp_y; zePoint[2] = 0.0; - exp_x = 20.01139515217801; - exp_y = 9.984517889590279; + exp_x = 20.5; + exp_y = 10.5; std::cout << "Test InverseTransform with double interface." << '\n'; if(!transformer.InverseTransform(x.data(), y.data(), z.data(), 2)) { std::cout << "InverseTransform failed, returned False." << '\n'; success = false; } else { - if (!itk::Math::FloatAlmostEqual(x[0], exp_x)) + if (x[0] - exp_x > 0.05) { std::cout << "Bad value for latitude. Expected " << exp_x << " but computed " << x[0] << "\n"; success = false; } - if (!itk::Math::FloatAlmostEqual(y[0], exp_y)) + if (y[0] - exp_y > 0.05) { std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << y[0] << "\n"; success = false; } - if (!itk::Math::FloatAlmostEqual(z[0], exp_z)) + if (z[0] - exp_z > 0.1) { std::cout << "Bad value for height. Expected " << exp_z << " but computed " << z[0] << "\n"; success = false; @@ -146,31 +146,70 @@ int otbGDALRPCTransformerTest(int itkNotUsed(argc), char* argv[]) } std::cout << "Test InverseTransform with point interface." << '\n'; zePoint = transformer.InverseTransform(zePoint); - if (!itk::Math::FloatAlmostEqual(zePoint[0], exp_x)) + if (zePoint[0] - exp_x > 0.05) { - std::cout << "Bad value for latitude. Expected " << exp_x << " but computed " << zePoint[0] << "\n"; + std::cout << "Bad value for latitude. Expected " << exp_y << " but computed " << zePoint[1] << "\n"; + success = false; + } + if (zePoint[1] - exp_y > 0.05) + { + std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << zePoint[1] << "\n"; + success = false; + } + if (zePoint[2] - exp_z > 0.1) + { + std::cout << "Bad value for height. Expected " << exp_z << " but computed " << zePoint[2] << "\n"; success = false; - } else { - if (!itk::Math::FloatAlmostEqual(zePoint[1], exp_y)) - { - std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << zePoint[1] << "\n"; - success = false; - } - if (!itk::Math::FloatAlmostEqual(zePoint[2], exp_z)) - { - std::cout << "Bad value for height. Expected " << exp_z << " but computed " << zePoint[2] << "\n"; - success = false; - } } // Test with a DEM otb::DEMHandler& dem = otb::DEMHandler::GetInstance(); - dem.OpenDEMDirectory(argv[1]); - zePoint[0] = 41.9051; - zePoint[1] = 2.3495; + dem.OpenDEMFile(argv[1]); + zePoint[0] = 20.5; + zePoint[1] = 10.5; + zePoint[2] = 0.0; + exp_x = 125.64828521533849; + exp_y = 39.869345204440144; transformer.SetOption("RPC_DEM", dem.DEM_DATASET_PATH); + transformer.SetOption("RPC_HEIGHT_SCALE", "2"); + + std::cout << "Test ForwardTransform with DEM." << '\n'; + zePoint = transformer.ForwardTransform(zePoint); + if (zePoint[0] - exp_x > 0.000001) + { + std::cout << "Bad value for latitude. Expected " << exp_y << " but computed " << zePoint[1] << "\n"; + success = false; + } + if (zePoint[1] - exp_y > 0.000001) + { + std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << zePoint[1] << "\n"; + success = false; + } + if (zePoint[2] - exp_z > 0.1) + { + std::cout << "Bad value for height. Expected " << exp_z << " but computed " << zePoint[2] << "\n"; + success = false; + } + + exp_x = 20.5; + exp_y = 10.5; + std::cout << "Test InverseTransform with DEM." << '\n'; zePoint = transformer.InverseTransform(zePoint); - std::cout << "POINT : " << zePoint << '\n'; + if (zePoint[0] - exp_x > 0.05) + { + std::cout << "Bad value for latitude. Expected " << exp_y << " but computed " << zePoint[1] << "\n"; + success = false; + } + if (zePoint[1] - exp_y > 0.05) + { + std::cout << "Bad value for longitude. Expected " << exp_y << " but computed " << zePoint[1] << "\n"; + success = false; + } + if (zePoint[2] - exp_z > 0.1) + { + std::cout << "Bad value for height. Expected " << exp_z << " but computed " << zePoint[2] << "\n"; + success = false; + } if (success) return EXIT_SUCCESS; -- GitLab From 486315cff8b71386f747b366ad2cf465978c75a8 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Tue, 6 Oct 2020 11:57:41 +0200 Subject: [PATCH 040/123] STYLE: Rename SensorModelBase to SensorTransformBase --- .../Core/Transform/include/otbRPCTransformBase.h | 6 +++--- ...ensorModelBase.h => otbSensorTransformBase.h} | 16 ++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) rename Modules/Core/Transform/include/{otbSensorModelBase.h => otbSensorTransformBase.h} (86%) diff --git a/Modules/Core/Transform/include/otbRPCTransformBase.h b/Modules/Core/Transform/include/otbRPCTransformBase.h index 861e0383a7..2611744e07 100644 --- a/Modules/Core/Transform/include/otbRPCTransformBase.h +++ b/Modules/Core/Transform/include/otbRPCTransformBase.h @@ -21,7 +21,7 @@ #ifndef otbRPCTransformBase_h #define otbRPCTransformBase_h -#include "otbSensorModelBase.h" +#include "otbSensorTransformBase.h" #include "otbGeometryMetadata.h" #include "otbGDALRPCTransformer.h" @@ -42,13 +42,13 @@ namespace otb * \ingroup OTBTransform */ template -class ITK_EXPORT RPCTransformBase : public SensorModelBase +class ITK_EXPORT RPCTransformBase : public SensorTransformBase { public: /** @name Standard class type definitions */ //@{ using Self = RPCTransformBase; - using Superclass = SensorModelBase; + using Superclass = SensorTransformBase; using Pointer = itk::SmartPointer; using ConstPointer = itk::SmartPointer ; diff --git a/Modules/Core/Transform/include/otbSensorModelBase.h b/Modules/Core/Transform/include/otbSensorTransformBase.h similarity index 86% rename from Modules/Core/Transform/include/otbSensorModelBase.h rename to Modules/Core/Transform/include/otbSensorTransformBase.h index 714ad79a31..c53124530a 100644 --- a/Modules/Core/Transform/include/otbSensorModelBase.h +++ b/Modules/Core/Transform/include/otbSensorTransformBase.h @@ -18,8 +18,8 @@ * limitations under the License. */ -#ifndef otbSensorModelBase_h -#define otbSensorModelBase_h +#ifndef otbSensorTransformBase_h +#define otbSensorTransformBase_h #include "otbMacro.h" #include "otbImageMetadata.h" @@ -29,7 +29,7 @@ namespace otb { -/** \class SensorModelBase +/** \class SensorTransformBase * \brief Base class for the sensor model projection classes. * * This is the base class for sensor model projection classes. Those @@ -45,13 +45,13 @@ namespace otb * \ingroup OTBTransform */ template -class ITK_EXPORT SensorModelBase : public Transform +class ITK_EXPORT SensorTransformBase : public Transform { public: /** @name Standard class type definitions */ //@{ - using Self = SensorModelBase; + using Self = SensorTransformBase; using Superclass = Transform; using Pointer = itk::SmartPointer; using ConstPointer = itk::SmartPointer ; @@ -77,11 +77,11 @@ public: virtual bool IsValidSensorModel() const = 0; protected: - SensorModelBase() = default; - ~SensorModelBase() = default; + SensorTransformBase() = default; + ~SensorTransformBase() = default; private: - SensorModelBase(const Self&) = delete; + SensorTransformBase(const Self&) = delete; void operator=(const Self&) = delete; }; -- GitLab From 8309433f09548c15a44faef67fd0c32055cc9204 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Fri, 30 Oct 2020 08:57:58 +0100 Subject: [PATCH 041/123] BUG: set correct branch for diapotb --- Modules/Remote/diapotb.remote.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Remote/diapotb.remote.cmake b/Modules/Remote/diapotb.remote.cmake index 4de2362eed..7e2de0cb18 100644 --- a/Modules/Remote/diapotb.remote.cmake +++ b/Modules/Remote/diapotb.remote.cmake @@ -22,5 +22,5 @@ otb_fetch_module(DiapOTBModule "OTB module for SAR processing in Diapason." GIT_REPOSITORY https://gitlab.orfeo-toolbox.org/remote_modules/diapotb.git - GIT_TAG 130f9286533414faf4b1a2bae3ff2496d2541d0f + GIT_TAG 9119c2eb062012f7d1c00047d4ca0df24163d61d ) -- GitLab From 06061cdeee96091b7fe6ad55a568be8812546127 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Thu, 12 Nov 2020 14:47:36 +0100 Subject: [PATCH 042/123] BUG: Use FetchRPC for GEOM medata --- .../app/otbMultiImageSamplingRate.cxx | 2 +- .../Core/Metadata/include/otbGeomMetadataSupplier.h | 2 +- .../Core/Metadata/src/otbGeomMetadataSupplier.cxx | 13 ++++++++++--- Modules/IO/ImageIO/include/otbImageFileReader.hxx | 5 ++++- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Modules/Applications/AppClassification/app/otbMultiImageSamplingRate.cxx b/Modules/Applications/AppClassification/app/otbMultiImageSamplingRate.cxx index 4ce60a4213..cbb15a0a08 100644 --- a/Modules/Applications/AppClassification/app/otbMultiImageSamplingRate.cxx +++ b/Modules/Applications/AppClassification/app/otbMultiImageSamplingRate.cxx @@ -205,7 +205,7 @@ private: std::vector inputs = this->GetParameterStringList("il"); unsigned int nbInputs = inputs.size(); XMLReaderType::Pointer statReader = XMLReaderType::New(); - for (unsigned int i = 0; i < nbInputs; i++) + for (unsigned int i = 0; i < nbInputs; ++i) { m_CalculatorList->PushBack(otb::SamplingRateCalculator::New()); statReader->SetFileName(inputs[i]); diff --git a/Modules/Core/Metadata/include/otbGeomMetadataSupplier.h b/Modules/Core/Metadata/include/otbGeomMetadataSupplier.h index 72cca65249..d2d2354edd 100644 --- a/Modules/Core/Metadata/include/otbGeomMetadataSupplier.h +++ b/Modules/Core/Metadata/include/otbGeomMetadataSupplier.h @@ -67,7 +67,7 @@ public: * * @param imd The ImageMetadata to fill */ - const boost::any& FetchRPC(ImageMetadata & imd); + bool FetchRPC(ImageMetadata & imd); /** * @brief Writes the content of the Geom file into a string diff --git a/Modules/Core/Metadata/src/otbGeomMetadataSupplier.cxx b/Modules/Core/Metadata/src/otbGeomMetadataSupplier.cxx index bc61a34eed..7076440423 100644 --- a/Modules/Core/Metadata/src/otbGeomMetadataSupplier.cxx +++ b/Modules/Core/Metadata/src/otbGeomMetadataSupplier.cxx @@ -72,8 +72,13 @@ int GeomMetadataSupplier::GetNbBands() const return ret_vect.size(); } -const boost::any& GeomMetadataSupplier::FetchRPC(ImageMetadata & imd) +bool GeomMetadataSupplier::FetchRPC(ImageMetadata & imd) { + bool hasValue; + GetMetadataValue("polynomial_format", hasValue); + if (!hasValue) + return false; + Projection::RPCParam rpcStruct; rpcStruct.LineOffset = this->GetAs("line_off"); rpcStruct.SampleOffset = this->GetAs("samp_off"); @@ -118,8 +123,10 @@ const boost::any& GeomMetadataSupplier::FetchRPC(ImageMetadata & imd) coeff = this->GetAs(path.str()); } - imd.Add(MDGeom::RPC, rpcStruct); - return imd[MDGeom::RPC]; + boost::any any_rpcStruct = rpcStruct; + imd.Add(MDGeom::RPC, std::move(any_rpcStruct)); + auto toto = imd[MDGeom::RPC]; + return true; } std::string GeomMetadataSupplier::PrintSelf() const diff --git a/Modules/IO/ImageIO/include/otbImageFileReader.hxx b/Modules/IO/ImageIO/include/otbImageFileReader.hxx index 4ae534022a..4e48e8a882 100644 --- a/Modules/IO/ImageIO/include/otbImageFileReader.hxx +++ b/Modules/IO/ImageIO/include/otbImageFileReader.hxx @@ -486,12 +486,15 @@ void ImageFileReader::GenerateOutputInformatio { GeomMetadataSupplier geomSupplier(m_FilenameHelper->GetExtGEOMFileName()); UpdateImdWithImiAndMds(imd, &geomSupplier); + geomSupplier.FetchRPC(imd); } // Case 2: attached geom (if present) else if (!m_FilenameHelper->GetSkipGeom() && itksys::SystemTools::FileExists(attachedGeom)) { - GeomMetadataSupplier geomSupplier(m_FilenameHelper->GetExtGEOMFileName()); + GeomMetadataSupplier geomSupplier(attachedGeom); UpdateImdWithImiAndMds(imd, &geomSupplier); + geomSupplier.FetchRPC(imd); + auto toto = imd[MDGeom::RPC]; } // Case 3: tags in file else -- GitLab From c383a6f1d56b9e30689e6323cdd23b26b2874e67 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Thu, 12 Nov 2020 14:48:14 +0100 Subject: [PATCH 043/123] BUG: Parse noise metadata --- Modules/Core/Metadata/src/otbSentinel1ImageMetadataInterface.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Core/Metadata/src/otbSentinel1ImageMetadataInterface.cxx b/Modules/Core/Metadata/src/otbSentinel1ImageMetadataInterface.cxx index 1a2eae2376..d1fb7fbaac 100644 --- a/Modules/Core/Metadata/src/otbSentinel1ImageMetadataInterface.cxx +++ b/Modules/Core/Metadata/src/otbSentinel1ImageMetadataInterface.cxx @@ -600,6 +600,7 @@ void Sentinel1ImageMetadataInterface::Parse(const MetadataSupplierInterface *mds if (NoiseFilePath.empty()) otbGenericExceptionMacro(MissingMetadataException,<<"Missing Noise file for band '"<GetNoiseVector(NoiseMS); m_Imd.Bands[bandId].Add(MDGeom::SAR, sarParam); } -- GitLab From 3850847e5c6569a2181eea38a1e3e028514d5a21 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Fri, 13 Nov 2020 15:19:31 +0100 Subject: [PATCH 044/123] BUG: Remove copy version of SetImageMetadata --- .../app/otbHomologousPointsExtraction.cxx | 8 ++++---- .../AppImageUtils/app/otbDownloadSRTMTiles.cxx | 2 +- .../AppImageUtils/app/otbExtractROI.cxx | 16 ++++++++-------- .../AppImageUtils/app/otbPixelValue.cxx | 4 ++-- .../AppProjection/app/otbOrthoRectification.cxx | 2 +- .../AppProjection/app/otbSuperimpose.cxx | 4 ++-- .../AppStereo/app/otbGeneratePlyFile.cxx | 2 +- .../Metadata/src/otbGeomMetadataSupplier.cxx | 7 ++++--- .../Transform/include/otbGenericRSTransform.h | 12 ------------ .../otbImageToGenericRSOutputParameters.hxx | 2 +- .../otbGCPsToRPCSensorModelImageFilter.hxx | 2 +- .../include/otbGenericRSResampleImageFilter.h | 16 ++-------------- .../include/otbGenericRSResampleImageFilter.hxx | 6 +++--- .../include/otbGroundSpacingImageFunction.hxx | 2 +- .../otbImageToEnvelopeVectorDataFilter.hxx | 2 +- .../otbPhysicalToRPCSensorModelImageFilter.hxx | 2 +- .../test/otbGenericRSTransformFromImage.cxx | 12 ++++++------ .../test/otbGenericRSTransformGenericTest.cxx | 4 ++-- .../test/otbTileImageFilterRSTransformTest.cxx | 4 ++-- .../include/otbImageToOSMVectorDataGenerator.hxx | 2 +- .../IO/ImageIO/include/otbImageFileReader.hxx | 1 - .../IO/KMZWriter/include/otbKmzProductWriter.hxx | 2 +- .../include/otbDisparityMapToDEMFilter.hxx | 10 +++++----- .../Stereo/include/otbMulti3DMapToDEMFilter.hxx | 4 ++-- .../otbStereoSensorModelToElevationMapFilter.hxx | 10 +++++----- ...tereorectificationDisplacementFieldSource.hxx | 12 ++++++------ .../Visualization/Ice/src/otbGlImageActor.cxx | 4 ++-- .../MonteverdiCore/src/mvdVectorImageModel.cxx | 2 +- 28 files changed, 66 insertions(+), 90 deletions(-) diff --git a/Modules/Applications/AppDescriptors/app/otbHomologousPointsExtraction.cxx b/Modules/Applications/AppDescriptors/app/otbHomologousPointsExtraction.cxx index 4d1096ea49..a682a59b5b 100644 --- a/Modules/Applications/AppDescriptors/app/otbHomologousPointsExtraction.cxx +++ b/Modules/Applications/AppDescriptors/app/otbHomologousPointsExtraction.cxx @@ -333,17 +333,17 @@ private: // Setting up RS Transform RSTransformType::Pointer rsTransform = RSTransformType::New(); - rsTransform->SetInputImageMetadata(image1->GetImageMetadata()); + rsTransform->SetInputImageMetadata(&(image1->GetImageMetadata())); rsTransform->SetInputProjectionRef(image1->GetProjectionRef()); - rsTransform->SetOutputImageMetadata(image2->GetImageMetadata()); + rsTransform->SetOutputImageMetadata(&(image2->GetImageMetadata())); rsTransform->SetOutputProjectionRef(image2->GetProjectionRef()); RSTransformType::Pointer rsTransform1ToWGS84 = RSTransformType::New(); - rsTransform1ToWGS84->SetInputImageMetadata(image1->GetImageMetadata()); + rsTransform1ToWGS84->SetInputImageMetadata(&(image1->GetImageMetadata())); rsTransform1ToWGS84->SetInputProjectionRef(image1->GetProjectionRef()); RSTransformType::Pointer rsTransform2ToWGS84 = RSTransformType::New(); - rsTransform2ToWGS84->SetInputImageMetadata(image2->GetImageMetadata()); + rsTransform2ToWGS84->SetInputImageMetadata(&(image2->GetImageMetadata())); rsTransform2ToWGS84->SetInputProjectionRef(image2->GetProjectionRef()); // Setting up output file diff --git a/Modules/Applications/AppImageUtils/app/otbDownloadSRTMTiles.cxx b/Modules/Applications/AppImageUtils/app/otbDownloadSRTMTiles.cxx index a300d5a1a6..40baab33db 100644 --- a/Modules/Applications/AppImageUtils/app/otbDownloadSRTMTiles.cxx +++ b/Modules/Applications/AppImageUtils/app/otbDownloadSRTMTiles.cxx @@ -291,7 +291,7 @@ private: auto inImage = inList->GetNthElement(i); auto rsTransformToWGS84 = RSTransformType::New(); - rsTransformToWGS84->SetInputImageMetadata(inImage->GetImageMetadata()); + rsTransformToWGS84->SetInputImageMetadata(&(inImage->GetImageMetadata())); rsTransformToWGS84->SetInputProjectionRef(inImage->GetProjectionRef()); rsTransformToWGS84->SetOutputProjectionRef(static_cast(otb::SpatialReference::FromWGS84().ToWkt())); rsTransformToWGS84->InstantiateTransform(); diff --git a/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx b/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx index ac5a99a62b..324fa2819c 100644 --- a/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx +++ b/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx @@ -421,7 +421,7 @@ private: { RSTransformType::Pointer rsTransform = RSTransformType::New(); ImageType* inImage = GetParameterImage("in"); - rsTransform->SetOutputImageMetadata(inImage->GetImageMetadata()); + rsTransform->SetOutputImageMetadata(&(inImage->GetImageMetadata())); rsTransform->SetOutputProjectionRef(inImage->GetProjectionRef()); rsTransform->InstantiateTransform(); itk::Point ulp_in, lrp_in, ulp_out, lrp_out; @@ -480,7 +480,7 @@ private: else // if ( GetParameterString( "mode.extent.unit" ) == "lonlat" ) { RSTransformType::Pointer rsTransform = RSTransformType::New(); - rsTransform->SetInputImageMetadata(input->GetImageMetadata()); + rsTransform->SetInputImageMetadata(&(input->GetImageMetadata())); rsTransform->SetInputProjectionRef(input->GetProjectionRef()); rsTransform->InstantiateTransform(); itk::Point ulp_in, lrp_in, ulp_out, lrp_out; @@ -538,7 +538,7 @@ private: { RSTransformType::Pointer rsTransform = RSTransformType::New(); ImageType* inImage = GetParameterImage("in"); - rsTransform->SetOutputImageMetadata(inImage->GetImageMetadata()); + rsTransform->SetOutputImageMetadata(&(inImage->GetImageMetadata())); rsTransform->SetOutputProjectionRef(inImage->GetProjectionRef()); rsTransform->InstantiateTransform(); itk::Point centerp_in, centerp_out; @@ -580,7 +580,7 @@ private: else // if ( GetParameterString( "mode.radius.unitc" ) == "lon/lat" ) { RSTransformType::Pointer rsTransform = RSTransformType::New(); - rsTransform->SetOutputImageMetadata(inImage->GetImageMetadata()); + rsTransform->SetOutputImageMetadata(&(inImage->GetImageMetadata())); rsTransform->SetOutputProjectionRef(inImage->GetProjectionRef()); rsTransform->InstantiateTransform(); itk::Point centerp_in; @@ -653,7 +653,7 @@ private: else // if ( GetParameterString("mode.radius.unitc") == "lonlat" ) { RSTransformType::Pointer rsTransform = RSTransformType::New(); - rsTransform->SetInputImageMetadata(input->GetImageMetadata()); + rsTransform->SetInputImageMetadata(&(input->GetImageMetadata())); rsTransform->SetInputProjectionRef(input->GetProjectionRef()); rsTransform->InstantiateTransform(); itk::Point centerp_in, centerp_out; @@ -718,7 +718,7 @@ private: } RSTransformType::Pointer rsTransform = RSTransformType::New(); rsTransform->SetInputProjectionRef(inputProjectionRef); - rsTransform->SetOutputImageMetadata(inImage->GetImageMetadata()); + rsTransform->SetOutputImageMetadata(&(inImage->GetImageMetadata())); rsTransform->SetOutputProjectionRef(inImage->GetProjectionRef()); rsTransform->InstantiateTransform(); itk::Point ulp_in, urp_in, llp_in, lrp_in; @@ -762,9 +762,9 @@ private: RSTransformType::Pointer rsTransform = RSTransformType::New(); - rsTransform->SetInputImageMetadata(referencePtr->GetImageMetadata()); + rsTransform->SetInputImageMetadata(&(referencePtr->GetImageMetadata())); rsTransform->SetInputProjectionRef(referencePtr->GetProjectionRef()); - rsTransform->SetOutputImageMetadata(inImage->GetImageMetadata()); + rsTransform->SetOutputImageMetadata(&(inImage->GetImageMetadata())); rsTransform->SetOutputProjectionRef(inImage->GetProjectionRef()); rsTransform->InstantiateTransform(); diff --git a/Modules/Applications/AppImageUtils/app/otbPixelValue.cxx b/Modules/Applications/AppImageUtils/app/otbPixelValue.cxx index f5fbe0cd5d..bdacbac482 100644 --- a/Modules/Applications/AppImageUtils/app/otbPixelValue.cxx +++ b/Modules/Applications/AppImageUtils/app/otbPixelValue.cxx @@ -166,7 +166,7 @@ private: std::string wktFromEpsg = otb::SpatialReference::FromEPSG(GetParameterInt("mode.epsg.code")).ToWkt(); inverse->SetOutputProjectionRef(wktFromEpsg); } - inverse->SetInputImageMetadata(inImage->GetImageMetadata()); + inverse->SetInputImageMetadata(&(inImage->GetImageMetadata())); inverse->SetInputProjectionRef(inImage->GetProjectionRef()); inverse->InstantiateTransform(); itk::Point minPOut(0), maxPOut(0), minP(0), maxP(0); @@ -238,7 +238,7 @@ private: std::string wktFromEpsg = otb::SpatialReference::FromEPSG(GetParameterInt("mode.epsg.code")).ToWkt(); rsTransform->SetInputProjectionRef(wktFromEpsg); } - rsTransform->SetOutputImageMetadata(inImage->GetImageMetadata()); + rsTransform->SetOutputImageMetadata(&(inImage->GetImageMetadata())); rsTransform->SetOutputProjectionRef(inImage->GetProjectionRef()); rsTransform->InstantiateTransform(); itk::Point pixelIn(0), pixelOut(0); diff --git a/Modules/Applications/AppProjection/app/otbOrthoRectification.cxx b/Modules/Applications/AppProjection/app/otbOrthoRectification.cxx index b1409e90a0..e3c84ce799 100644 --- a/Modules/Applications/AppProjection/app/otbOrthoRectification.cxx +++ b/Modules/Applications/AppProjection/app/otbOrthoRectification.cxx @@ -565,7 +565,7 @@ private: // Set the output projection Ref m_ResampleFilter->SetInputProjectionRef(inImage->GetProjectionRef()); - m_ResampleFilter->SetInputImageMetadata(inImage->GetImageMetadata()); + m_ResampleFilter->SetInputImageMetadata(&(inImage->GetImageMetadata())); m_ResampleFilter->SetOutputProjectionRef(m_OutputProjectionRef); // Check size diff --git a/Modules/Applications/AppProjection/app/otbSuperimpose.cxx b/Modules/Applications/AppProjection/app/otbSuperimpose.cxx index 4da32c7c9d..0148f79d04 100644 --- a/Modules/Applications/AppProjection/app/otbSuperimpose.cxx +++ b/Modules/Applications/AppProjection/app/otbSuperimpose.cxx @@ -243,10 +243,10 @@ private: m_Resampler->SetDisplacementFieldSpacing(defSpacing); // Setup transform through projRef and ImageMetadata - m_Resampler->SetInputImageMetadata(movingImage->GetImageMetadata()); + m_Resampler->SetInputImageMetadata(&(movingImage->GetImageMetadata())); m_Resampler->SetInputProjectionRef(movingImage->GetProjectionRef()); - m_Resampler->SetOutputImageMetadata(refImage->GetImageMetadata()); + m_Resampler->SetOutputImageMetadata(&(refImage->GetImageMetadata())); m_Resampler->SetOutputProjectionRef(refImage->GetProjectionRef()); m_Resampler->SetInput(movingImage); diff --git a/Modules/Applications/AppStereo/app/otbGeneratePlyFile.cxx b/Modules/Applications/AppStereo/app/otbGeneratePlyFile.cxx index 026f3ed05d..83653248a2 100644 --- a/Modules/Applications/AppStereo/app/otbGeneratePlyFile.cxx +++ b/Modules/Applications/AppStereo/app/otbGeneratePlyFile.cxx @@ -165,7 +165,7 @@ private: } rsTransform->SetOutputProjectionRef(colorPtr->GetProjectionRef()); - rsTransform->SetOutputImageMetadata(colorPtr->GetImageMetadata()); + rsTransform->SetOutputImageMetadata(&(colorPtr->GetImageMetadata())); rsTransform->InstantiateTransform(); toMap->InstantiateTransform(); diff --git a/Modules/Core/Metadata/src/otbGeomMetadataSupplier.cxx b/Modules/Core/Metadata/src/otbGeomMetadataSupplier.cxx index 7076440423..10b53fa17f 100644 --- a/Modules/Core/Metadata/src/otbGeomMetadataSupplier.cxx +++ b/Modules/Core/Metadata/src/otbGeomMetadataSupplier.cxx @@ -123,9 +123,10 @@ bool GeomMetadataSupplier::FetchRPC(ImageMetadata & imd) coeff = this->GetAs(path.str()); } - boost::any any_rpcStruct = rpcStruct; - imd.Add(MDGeom::RPC, std::move(any_rpcStruct)); - auto toto = imd[MDGeom::RPC]; + boost::any to_append = rpcStruct; + imd.Add(MDGeom::RPC, to_append); + assert(imd.Has(MDGeom::RPC)); + assert(rpcStruct == boost::any_cast(imd[MDGeom::RPC])); return true; } diff --git a/Modules/Core/Transform/include/otbGenericRSTransform.h b/Modules/Core/Transform/include/otbGenericRSTransform.h index 5d32da1801..89cafc1b31 100644 --- a/Modules/Core/Transform/include/otbGenericRSTransform.h +++ b/Modules/Core/Transform/include/otbGenericRSTransform.h @@ -113,12 +113,6 @@ public: this->Modified(); } - void SetInputImageMetadata(const ImageMetadata imd) - { - m_InputImd = &imd; - this->Modified(); - } - const ImageMetadata* GetOutputImageMetadata() const { return m_OutputImd; @@ -130,12 +124,6 @@ public: this->Modified(); } - void SetOutputImageMetadata(const ImageMetadata imd) - { - m_OutputImd = &imd; - this->Modified(); - } - /** Set the origin of the vector data. * \sa GetOrigin() */ itkSetMacro(InputOrigin, OriginType); diff --git a/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.hxx b/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.hxx index e1d036521c..5cda8d8762 100644 --- a/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.hxx +++ b/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.hxx @@ -73,7 +73,7 @@ void ImageToGenericRSOutputParameters::Compute() template void ImageToGenericRSOutputParameters::UpdateTransform() { - m_Transform->SetOutputImageMetadata(this->GetInput()->GetImageMetadata()); + m_Transform->SetOutputImageMetadata(&(this->GetInput()->GetImageMetadata())); m_Transform->SetOutputProjectionRef(this->GetInput()->GetProjectionRef()); m_Transform->InstantiateTransform(); } diff --git a/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.hxx b/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.hxx index d5cc9e7edc..f64c770d8e 100644 --- a/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.hxx +++ b/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.hxx @@ -219,7 +219,7 @@ void GCPsToRPCSensorModelImageFilter::ComputeErrors() typedef GenericRSTransform RSTransformType; RSTransformType::Pointer rsTransform = RSTransformType::New(); - rsTransform->SetInputImageMetadata(this->GetOutput()->GetImageMetadata()); + rsTransform->SetInputImageMetadata(&(this->GetOutput()->GetImageMetadata())); rsTransform->InstantiateTransform(); ContinuousIndexType idFix, idOut; diff --git a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.h b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.h index 0d593297d4..8301515621 100644 --- a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.h +++ b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.h @@ -168,13 +168,7 @@ public: /** Set/Get Input ImageMetadata */ - void SetInputImageMetadata(ImageMetadata* imd) - { - m_Transform->SetOutputImageMetadata(imd); - this->Modified(); - } - - void SetInputImageMetadata(ImageMetadata imd) + void SetInputImageMetadata(const ImageMetadata* imd) { m_Transform->SetOutputImageMetadata(imd); this->Modified(); @@ -187,13 +181,7 @@ public: /** Set/Get Output ImageMetadata */ - void SetOutputImageMetadata(ImageMetadata* imd) - { - m_Transform->SetInputImageMetadata(imd); - this->Modified(); - } - - void SetOutputImageMetadata(ImageMetadata imd) + void SetOutputImageMetadata(const ImageMetadata* imd) { m_Transform->SetInputImageMetadata(imd); this->Modified(); diff --git a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx index b500e572ae..81e9b97191 100644 --- a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx +++ b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx @@ -128,7 +128,7 @@ void GenericRSResampleImageFilter::EstimateOutputRpcM m_OutputRpcEstimator->UpdateOutputInformation(); // Fill the transform with the right metadata - m_Transform->SetInputImageMetadata(m_OutputRpcEstimator->GetOutput()->GetImageMetadata()); + m_Transform->SetInputImageMetadata(&(m_OutputRpcEstimator->GetOutput()->GetImageMetadata())); } /** @@ -140,7 +140,7 @@ void GenericRSResampleImageFilter::UpdateTransform() { if (!m_EstimateInputRpcModel) { - m_Transform->SetOutputImageMetadata(this->GetInput()->GetImageMetadata()); + m_Transform->SetOutputImageMetadata(&(this->GetInput()->GetImageMetadata())); m_Transform->SetOutputProjectionRef(this->GetInput()->GetProjectionRef()); } m_Transform->InstantiateTransform(); @@ -177,7 +177,7 @@ void GenericRSResampleImageFilter::EstimateInputRpcMo m_InputRpcEstimator->UpdateOutputInformation(); // setup the transform with the estimated RPC model - m_Transform->SetOutputImageMetadata(m_InputRpcEstimator->GetOutput()->GetImageMetadata()); + m_Transform->SetOutputImageMetadata(&(m_InputRpcEstimator->GetOutput()->GetImageMetadata())); // Update the flag for input rpcEstimation in order to not compute // the rpc model for each stream diff --git a/Modules/Filtering/Projection/include/otbGroundSpacingImageFunction.hxx b/Modules/Filtering/Projection/include/otbGroundSpacingImageFunction.hxx index f0f4483821..89f317d768 100644 --- a/Modules/Filtering/Projection/include/otbGroundSpacingImageFunction.hxx +++ b/Modules/Filtering/Projection/include/otbGroundSpacingImageFunction.hxx @@ -116,7 +116,7 @@ GroundSpacingImageFunction::GetPixelLocation(const Index } TransformType::Pointer transform = TransformType::New(); - transform->SetOutputImageMetadata(this->GetInputImage()->GetImageMetadata()); + transform->SetOutputImageMetadata(&(this->GetInputImage()->GetImageMetadata())); transform->SetInputOrigin(this->GetInputImage()->GetOrigin()); transform->SetInputSpacing(this->GetInputImage()->GetSignedSpacing()); diff --git a/Modules/Filtering/Projection/include/otbImageToEnvelopeVectorDataFilter.hxx b/Modules/Filtering/Projection/include/otbImageToEnvelopeVectorDataFilter.hxx index 6267a11906..d0ad9de2f1 100644 --- a/Modules/Filtering/Projection/include/otbImageToEnvelopeVectorDataFilter.hxx +++ b/Modules/Filtering/Projection/include/otbImageToEnvelopeVectorDataFilter.hxx @@ -101,7 +101,7 @@ void ImageToEnvelopeVectorDataFilter::Instantiat m_Transform = InternalTransformType::New(); m_Transform->SetOutputProjectionRef(m_OutputProjectionRef); m_Transform->SetInputProjectionRef(inputPtr->GetProjectionRef()); - m_Transform->SetInputImageMetadata(inputPtr->GetImageMetadata()); + m_Transform->SetInputImageMetadata(&(inputPtr->GetImageMetadata())); m_Transform->InstantiateTransform(); } diff --git a/Modules/Filtering/Projection/include/otbPhysicalToRPCSensorModelImageFilter.hxx b/Modules/Filtering/Projection/include/otbPhysicalToRPCSensorModelImageFilter.hxx index 6ef55ef81d..b2237b444f 100644 --- a/Modules/Filtering/Projection/include/otbPhysicalToRPCSensorModelImageFilter.hxx +++ b/Modules/Filtering/Projection/include/otbPhysicalToRPCSensorModelImageFilter.hxx @@ -65,7 +65,7 @@ void PhysicalToRPCSensorModelImageFilter::GenerateOutputInformation() // Build the grid // Generate GCPs from physical sensor model RSTransformPointerType rsTransform = RSTransformType::New(); - rsTransform->SetInputImageMetadata(input->GetImageMetadata()); + rsTransform->SetInputImageMetadata(&(input->GetImageMetadata())); rsTransform->InstantiateTransform(); // Compute the size of the grid diff --git a/Modules/Filtering/Projection/test/otbGenericRSTransformFromImage.cxx b/Modules/Filtering/Projection/test/otbGenericRSTransformFromImage.cxx index 7634b846ae..7bdfb1ad02 100644 --- a/Modules/Filtering/Projection/test/otbGenericRSTransformFromImage.cxx +++ b/Modules/Filtering/Projection/test/otbGenericRSTransformFromImage.cxx @@ -65,13 +65,13 @@ int otbGenericRSTransformFromImage(int itkNotUsed(argc), char* argv[]) TransformType::Pointer wgs2img = TransformType::New(); wgs2img->SetInputProjectionRef(wgsRef); wgs2img->SetOutputProjectionRef(reader->GetOutput()->GetProjectionRef()); - wgs2img->SetOutputImageMetadata(reader->GetOutput()->GetImageMetadata()); + wgs2img->SetOutputImageMetadata(&(reader->GetOutput()->GetImageMetadata())); wgs2img->InstantiateTransform(); // Instantiate Image->WGS transform TransformType::Pointer img2wgs = TransformType::New(); img2wgs->SetInputProjectionRef(reader->GetOutput()->GetProjectionRef()); - img2wgs->SetInputImageMetadata(reader->GetOutput()->GetImageMetadata()); + img2wgs->SetInputImageMetadata(&(reader->GetOutput()->GetImageMetadata())); img2wgs->SetOutputProjectionRef(wgsRef); img2wgs->InstantiateTransform(); @@ -126,13 +126,13 @@ int otbGenericRSTransformImageAndMNTToWGS84ConversionChecking(int itkNotUsed(arg TransformType::Pointer wgs2img = TransformType::New(); wgs2img->SetInputProjectionRef(wgsRef); wgs2img->SetOutputProjectionRef(reader->GetOutput()->GetProjectionRef()); - wgs2img->SetOutputImageMetadata(reader->GetOutput()->GetImageMetadata()); + wgs2img->SetOutputImageMetadata(&(reader->GetOutput()->GetImageMetadata())); wgs2img->InstantiateTransform(); // Instantiate Image->WGS transform TransformType::Pointer img2wgs = TransformType::New(); img2wgs->SetInputProjectionRef(reader->GetOutput()->GetProjectionRef()); - img2wgs->SetInputImageMetadata(reader->GetOutput()->GetImageMetadata()); + img2wgs->SetInputImageMetadata(&(reader->GetOutput()->GetImageMetadata())); img2wgs->SetOutputProjectionRef(wgsRef); img2wgs->InstantiateTransform(); @@ -141,13 +141,13 @@ int otbGenericRSTransformImageAndMNTToWGS84ConversionChecking(int itkNotUsed(arg Transform3DType::Pointer wgs2img3d = Transform3DType::New(); wgs2img3d->SetInputProjectionRef(wgsRef); wgs2img3d->SetOutputProjectionRef(reader->GetOutput()->GetProjectionRef()); - wgs2img3d->SetOutputImageMetadata(reader->GetOutput()->GetImageMetadata()); + wgs2img3d->SetOutputImageMetadata(&(reader->GetOutput()->GetImageMetadata())); wgs2img3d->InstantiateTransform(); // Instantiate Image->WGS transform 3D Transform3DType::Pointer img2wgs3d = Transform3DType::New(); img2wgs3d->SetInputProjectionRef(reader->GetOutput()->GetProjectionRef()); - img2wgs3d->SetInputImageMetadata(reader->GetOutput()->GetImageMetadata()); + img2wgs3d->SetInputImageMetadata(&(reader->GetOutput()->GetImageMetadata())); img2wgs3d->SetOutputProjectionRef(wgsRef); img2wgs3d->InstantiateTransform(); diff --git a/Modules/Filtering/Projection/test/otbGenericRSTransformGenericTest.cxx b/Modules/Filtering/Projection/test/otbGenericRSTransformGenericTest.cxx index 8f25727f35..b7b393d153 100644 --- a/Modules/Filtering/Projection/test/otbGenericRSTransformGenericTest.cxx +++ b/Modules/Filtering/Projection/test/otbGenericRSTransformGenericTest.cxx @@ -75,7 +75,7 @@ int otbGenericRSTransformGenericTest(int argc, char* argv[]) reader->UpdateOutputInformation(); transform->SetInputProjectionRef(reader->GetOutput()->GetProjectionRef()); - transform->SetInputImageMetadata(reader->GetOutput()->GetImageMetadata()); + transform->SetInputImageMetadata(&(reader->GetOutput()->GetImageMetadata())); std::cout << "Input projection read from image: " << argv[6] << std::endl; } @@ -111,7 +111,7 @@ int otbGenericRSTransformGenericTest(int argc, char* argv[]) reader->UpdateOutputInformation(); transform->SetOutputProjectionRef(reader->GetOutput()->GetProjectionRef()); - transform->SetOutputImageMetadata(reader->GetOutput()->GetImageMetadata()); + transform->SetOutputImageMetadata(&(reader->GetOutput()->GetImageMetadata())); std::cout << "Output projection read from image: " << argv[8] << std::endl; } diff --git a/Modules/Filtering/Projection/test/otbTileImageFilterRSTransformTest.cxx b/Modules/Filtering/Projection/test/otbTileImageFilterRSTransformTest.cxx index e3670b10f6..d27c56848c 100644 --- a/Modules/Filtering/Projection/test/otbTileImageFilterRSTransformTest.cxx +++ b/Modules/Filtering/Projection/test/otbTileImageFilterRSTransformTest.cxx @@ -75,7 +75,7 @@ int otbTileImageFilterRSTransformTest(int argc, char* argv[]) // Set-up transform RSTransformType::Pointer rsTransform = RSTransformType::New(); - rsTransform->SetInputImageMetadata(reader->GetOutput()->GetImageMetadata()); + rsTransform->SetInputImageMetadata(&(reader->GetOutput()->GetImageMetadata())); rsTransform->InstantiateTransform(); transforms.push_back(rsTransform); @@ -86,7 +86,7 @@ int otbTileImageFilterRSTransformTest(int argc, char* argv[]) // Build RS transform for tiled image RSTransformType::Pointer mosaicRsTransform = RSTransformType::New(); - mosaicRsTransform->SetInputImageMetadata(tileFilter->GetOutput()->GetImageMetadata()); + mosaicRsTransform->SetInputImageMetadata(&(tileFilter->GetOutput()->GetImageMetadata())); mosaicRsTransform->InstantiateTransform(); // Check that individual RSTransform gives the same result as tiled diff --git a/Modules/IO/Carto/include/otbImageToOSMVectorDataGenerator.hxx b/Modules/IO/Carto/include/otbImageToOSMVectorDataGenerator.hxx index 0131440668..17e9a56c7f 100644 --- a/Modules/IO/Carto/include/otbImageToOSMVectorDataGenerator.hxx +++ b/Modules/IO/Carto/include/otbImageToOSMVectorDataGenerator.hxx @@ -84,7 +84,7 @@ void ImageToOSMVectorDataGenerator::EstimateImageExtent() // Local generic RS Transform to project the 4 corners to WGS84 typedef otb::GenericRSTransform<> TransformType; typename TransformType::Pointer transform = TransformType::New(); - transform->SetInputImageMetadata(input->GetImageMetadata()); + transform->SetInputImageMetadata(&(input->GetImageMetadata())); transform->SetInputProjectionRef(input->GetProjectionRef()); transform->SetOutputProjectionRef(otb::SpatialReference::FromWGS84().ToWkt()); transform->InstantiateTransform(); diff --git a/Modules/IO/ImageIO/include/otbImageFileReader.hxx b/Modules/IO/ImageIO/include/otbImageFileReader.hxx index 4e48e8a882..a4e5577ad1 100644 --- a/Modules/IO/ImageIO/include/otbImageFileReader.hxx +++ b/Modules/IO/ImageIO/include/otbImageFileReader.hxx @@ -494,7 +494,6 @@ void ImageFileReader::GenerateOutputInformatio GeomMetadataSupplier geomSupplier(attachedGeom); UpdateImdWithImiAndMds(imd, &geomSupplier); geomSupplier.FetchRPC(imd); - auto toto = imd[MDGeom::RPC]; } // Case 3: tags in file else diff --git a/Modules/IO/KMZWriter/include/otbKmzProductWriter.hxx b/Modules/IO/KMZWriter/include/otbKmzProductWriter.hxx index 59f7ba4719..2e6227c6d2 100644 --- a/Modules/IO/KMZWriter/include/otbKmzProductWriter.hxx +++ b/Modules/IO/KMZWriter/include/otbKmzProductWriter.hxx @@ -415,7 +415,7 @@ void KmzProductWriter::Tiling() /** TODO : Generate KML for this tile */ // Search Lat/Lon box m_Transform = TransformType::New(); - m_Transform->SetInputImageMetadata(m_ResampleVectorImage->GetImageMetadata()); + m_Transform->SetInputImageMetadata(&(m_ResampleVectorImage->GetImageMetadata())); m_Transform->SetInputProjectionRef(m_VectorImage->GetProjectionRef()); m_Transform->SetOutputProjectionRef(wgsRef); m_Transform->InstantiateTransform(); diff --git a/Modules/Registration/DisparityMap/include/otbDisparityMapToDEMFilter.hxx b/Modules/Registration/DisparityMap/include/otbDisparityMapToDEMFilter.hxx index aa2055d810..762de49fa2 100644 --- a/Modules/Registration/DisparityMap/include/otbDisparityMapToDEMFilter.hxx +++ b/Modules/Registration/DisparityMap/include/otbDisparityMapToDEMFilter.hxx @@ -211,11 +211,11 @@ void DisparityMapToDEMFilter RSTransform2DType; RSTransform2DType::Pointer leftToGroundTransform = RSTransform2DType::New(); - leftToGroundTransform->SetInputImageMetadata(leftImgPtr->GetImageMetadata()); + leftToGroundTransform->SetInputImageMetadata(&(leftImgPtr->GetImageMetadata())); leftToGroundTransform->InstantiateTransform(); RSTransform2DType::Pointer rightToGroundTransform = RSTransform2DType::New(); - rightToGroundTransform->SetInputImageMetadata(rightImgPtr->GetImageMetadata()); + rightToGroundTransform->SetInputImageMetadata(&(rightImgPtr->GetImageMetadata())); rightToGroundTransform->InstantiateTransform(); // left image @@ -335,7 +335,7 @@ void DisparityMapToDEMFilterGetSignedSpacing(); RSTransformType::Pointer groundToLeftTransform = RSTransformType::New(); - groundToLeftTransform->SetOutputImageMetadata(leftSensor->GetImageMetadata()); + groundToLeftTransform->SetOutputImageMetadata(&(leftSensor->GetImageMetadata())); groundToLeftTransform->InstantiateTransform(); // For the disparity maps and mask @@ -591,8 +591,8 @@ void DisparityMapToDEMFilterSetInputImageMetadata(leftSensor->GetImageMetadata()); - m_RightToGroundTransform->SetInputImageMetadata(rightSensor->GetImageMetadata()); + m_LeftToGroundTransform->SetInputImageMetadata(&(leftSensor->GetImageMetadata())); + m_RightToGroundTransform->SetInputImageMetadata(&(rightSensor->GetImageMetadata())); m_LeftToGroundTransform->InstantiateTransform(); m_RightToGroundTransform->InstantiateTransform(); diff --git a/Modules/Registration/Stereo/include/otbMulti3DMapToDEMFilter.hxx b/Modules/Registration/Stereo/include/otbMulti3DMapToDEMFilter.hxx index 06643f40fe..8826e2faa9 100644 --- a/Modules/Registration/Stereo/include/otbMulti3DMapToDEMFilter.hxx +++ b/Modules/Registration/Stereo/include/otbMulti3DMapToDEMFilter.hxx @@ -175,7 +175,7 @@ void Multi3DMapToDEMFilter::SetOutputPara T3DImage* imgPtr = const_cast(this->Get3DMapInput(k)); RSTransform2DType::Pointer mapToGroundTransform = RSTransform2DType::New(); - mapToGroundTransform->SetInputImageMetadata(imgPtr->GetImageMetadata()); + mapToGroundTransform->SetInputImageMetadata(&(imgPtr->GetImageMetadata())); /*if(!m_ProjectionRef.empty()) { @@ -389,7 +389,7 @@ void Multi3DMapToDEMFilter::GenerateInput // groundToSensorTransform->SetInputSpacing(outputDEM->GetSignedSpacing()); groundToSensorTransform->SetInputProjectionRef(m_ProjectionRef); - groundToSensorTransform->SetOutputImageMetadata(imgPtr->GetImageMetadata()); + groundToSensorTransform->SetOutputImageMetadata(&(imgPtr->GetImageMetadata())); groundToSensorTransform->SetOutputOrigin(imgPtr->GetOrigin()); groundToSensorTransform->SetOutputSpacing(imgPtr->GetSignedSpacing()); groundToSensorTransform->InstantiateTransform(); diff --git a/Modules/Registration/Stereo/include/otbStereoSensorModelToElevationMapFilter.hxx b/Modules/Registration/Stereo/include/otbStereoSensorModelToElevationMapFilter.hxx index 6dc3e98dcd..90327236d5 100644 --- a/Modules/Registration/Stereo/include/otbStereoSensorModelToElevationMapFilter.hxx +++ b/Modules/Registration/Stereo/include/otbStereoSensorModelToElevationMapFilter.hxx @@ -146,8 +146,8 @@ void StereoSensorModelToElevationFilter::GenerateInp // Build the transform to switch from the master to the slave image typename GenericRSTransformType::Pointer transform = GenericRSTransformType::New(); - transform->SetInputImageMetadata(masterPtr->GetImageMetadata()); - transform->SetOutputImageMetadata(slavePtr->GetImageMetadata()); + transform->SetInputImageMetadata(&(masterPtr->GetImageMetadata())); + transform->SetOutputImageMetadata(&(slavePtr->GetImageMetadata())); transform->InstantiateTransform(); @@ -266,7 +266,7 @@ void StereoSensorModelToElevationFilter::BeforeThrea OutputImageType* outputPtr = this->GetOutput(); typename GenericRSTransformType::Pointer rsTransform = GenericRSTransformType::New(); - rsTransform->SetInputImageMetadata(outputPtr->GetImageMetadata()); + rsTransform->SetInputImageMetadata(&(outputPtr->GetImageMetadata())); rsTransform->InstantiateTransform(); // Fill output @@ -288,8 +288,8 @@ void StereoSensorModelToElevationFilter::BeforeThrea // Set-up the forward-inverse sensor model transform m_MasterToSlave = GenericRSTransform3DType::New(); - m_MasterToSlave->SetInputImageMetadata(masterPtr->GetImageMetadata()); - m_MasterToSlave->SetOutputImageMetadata(slavePtr->GetImageMetadata()); + m_MasterToSlave->SetInputImageMetadata(&(masterPtr->GetImageMetadata())); + m_MasterToSlave->SetOutputImageMetadata(&(slavePtr->GetImageMetadata())); m_MasterToSlave->InstantiateTransform(); } diff --git a/Modules/Registration/Stereo/include/otbStereorectificationDisplacementFieldSource.hxx b/Modules/Registration/Stereo/include/otbStereorectificationDisplacementFieldSource.hxx index 541998403e..66105d6392 100644 --- a/Modules/Registration/Stereo/include/otbStereorectificationDisplacementFieldSource.hxx +++ b/Modules/Registration/Stereo/include/otbStereorectificationDisplacementFieldSource.hxx @@ -124,7 +124,7 @@ void StereorectificationDisplacementFieldSource::Gene // Set-up a transform to use the DEMHandler typedef otb::GenericRSTransform<> RSTransform2DType; RSTransform2DType::Pointer leftToGroundTransform = RSTransform2DType::New(); - leftToGroundTransform->SetInputImageMetadata(m_LeftImage->GetImageMetadata()); + leftToGroundTransform->SetInputImageMetadata(&(m_LeftImage->GetImageMetadata())); leftToGroundTransform->InstantiateTransform(); @@ -133,12 +133,12 @@ void StereorectificationDisplacementFieldSource::Gene OutputImageType* rightDFPtr = this->GetRightDisplacementFieldOutput(); // Set up the RS transforms - m_LeftToRightTransform->SetInputImageMetadata(m_LeftImage->GetImageMetadata()); - m_LeftToRightTransform->SetOutputImageMetadata(m_RightImage->GetImageMetadata()); + m_LeftToRightTransform->SetInputImageMetadata(&(m_LeftImage->GetImageMetadata())); + m_LeftToRightTransform->SetOutputImageMetadata(&(m_RightImage->GetImageMetadata())); m_LeftToRightTransform->InstantiateTransform(); - m_RightToLeftTransform->SetInputImageMetadata(m_RightImage->GetImageMetadata()); - m_RightToLeftTransform->SetOutputImageMetadata(m_LeftImage->GetImageMetadata()); + m_RightToLeftTransform->SetInputImageMetadata(&(m_RightImage->GetImageMetadata())); + m_RightToLeftTransform->SetOutputImageMetadata(&(m_LeftImage->GetImageMetadata())); m_RightToLeftTransform->InstantiateTransform(); // Now, we must determine the optimized size, spacing and origin of the @@ -301,7 +301,7 @@ void StereorectificationDisplacementFieldSource::Gene typedef otb::GenericRSTransform<> RSTransform2DType; RSTransform2DType::Pointer leftToGroundTransform = RSTransform2DType::New(); - leftToGroundTransform->SetInputImageMetadata(m_LeftImage->GetImageMetadata()); + leftToGroundTransform->SetInputImageMetadata(&(m_LeftImage->GetImageMetadata())); leftToGroundTransform->InstantiateTransform(); diff --git a/Modules/Visualization/Ice/src/otbGlImageActor.cxx b/Modules/Visualization/Ice/src/otbGlImageActor.cxx index fd415c7a5a..2df1a4d5d0 100644 --- a/Modules/Visualization/Ice/src/otbGlImageActor.cxx +++ b/Modules/Visualization/Ice/src/otbGlImageActor.cxx @@ -1134,13 +1134,13 @@ void GlImageActor::UpdateTransforms() //TODO OSSIM: Replace KeywordList by ImageMetadata in the settings object //m_ViewportToImageTransform->SetInputKeywordList(settings->GetKeywordList()); m_ViewportToImageTransform->SetOutputProjectionRef(m_FileReader->GetOutput()->GetProjectionRef()); - m_ViewportToImageTransform->SetOutputImageMetadata(m_FileReader->GetOutput()->GetImageMetadata()); + m_ViewportToImageTransform->SetOutputImageMetadata(&(m_FileReader->GetOutput()->GetImageMetadata())); m_ImageToViewportTransform->SetOutputProjectionRef(settings->GetWkt()); //TODO OSSIM: Replace KeywordList by ImageMetadata in the settings object //m_ImageToViewportTransform->SetOutputKeywordList(settings->GetKeywordList()); m_ImageToViewportTransform->SetInputProjectionRef(m_FileReader->GetOutput()->GetProjectionRef()); - m_ImageToViewportTransform->SetInputImageMetadata(m_FileReader->GetOutput()->GetImageMetadata()); + m_ImageToViewportTransform->SetInputImageMetadata(&(m_FileReader->GetOutput()->GetImageMetadata())); hasChanged = true; } diff --git a/Modules/Visualization/MonteverdiCore/src/mvdVectorImageModel.cxx b/Modules/Visualization/MonteverdiCore/src/mvdVectorImageModel.cxx index a29d126b15..ab2a67e58c 100644 --- a/Modules/Visualization/MonteverdiCore/src/mvdVectorImageModel.cxx +++ b/Modules/Visualization/MonteverdiCore/src/mvdVectorImageModel.cxx @@ -121,7 +121,7 @@ void VectorImageModel::SetFilename(const QString& filename, int w, int h) // Setup GenericRSTransform m_ToWgs84 = otb::GenericRSTransform<>::New(); - m_ToWgs84->SetInputImageMetadata(m_ImageFileReader->GetOutput()->GetImageMetadata()); + m_ToWgs84->SetInputImageMetadata(&(m_ImageFileReader->GetOutput()->GetImageMetadata())); m_ToWgs84->SetOutputProjectionRef(otb::SpatialReference::FromWGS84().ToWkt()); m_ToWgs84->InstantiateTransform(); -- GitLab From b2a6483ad84042267b91e26ed036a5cd2f83b8a5 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Fri, 13 Nov 2020 16:22:45 +0100 Subject: [PATCH 045/123] REFACT: Correct GIT_TAG for DiapOTB --- Modules/Remote/diapotb.remote.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Remote/diapotb.remote.cmake b/Modules/Remote/diapotb.remote.cmake index 7e2de0cb18..945b7cb321 100644 --- a/Modules/Remote/diapotb.remote.cmake +++ b/Modules/Remote/diapotb.remote.cmake @@ -22,5 +22,5 @@ otb_fetch_module(DiapOTBModule "OTB module for SAR processing in Diapason." GIT_REPOSITORY https://gitlab.orfeo-toolbox.org/remote_modules/diapotb.git - GIT_TAG 9119c2eb062012f7d1c00047d4ca0df24163d61d + GIT_TAG 8f6b3a9d1efc1ee99e619d5c408f72a2dfe31753 ) -- GitLab From 7332f153a3944e6cd52fe830c4cf6c70a0af369b Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Fri, 13 Nov 2020 16:34:31 +0100 Subject: [PATCH 046/123] ENH: Improve GDALRPCTransformer API --- .../GdalAdapters/include/otbGDALRPCTransformer.h | 9 ++------- .../GdalAdapters/src/otbGDALRPCTransformer.cxx | 16 +++++++--------- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h b/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h index d9f67e3fbd..e0d514038a 100644 --- a/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h +++ b/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h @@ -22,12 +22,7 @@ #include "OTBGdalAdaptersExport.h" #include "itkPoint.h" - -#include -#include - #include "gdal_alg.h" -#include "cpl_string.h" namespace otb { @@ -66,8 +61,8 @@ public: * */ GDALRPCTransformer(double LineOffset, double SampleOffset, double LatOffset, double LonOffset, double HeightOffset, - double LineScale, double SampleScale, double LatScale, double LonScale, double HeightScale, - const double LineNum[20], const double LineDen[20], const double SampleNum[20], const double SampleDen[20]); + double LineScale, double SampleScale, double LatScale, double LonScale, double HeightScale, + const double (&LineNum)[20], const double (&LineDen)[20], const double (&SampleNum)[20], const double (&SampleDen)[20]); /** * Set additional options to the transformer diff --git a/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx b/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx index d80a8d8999..0f6f37ddf9 100644 --- a/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx +++ b/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx @@ -20,12 +20,13 @@ #include "otbGDALRPCTransformer.h" #include +#include "cpl_string.h" namespace otb { GDALRPCTransformer::GDALRPCTransformer(double LineOffset, double SampleOffset, double LatOffset, double LonOffset, double HeightOffset, - double LineScale, double SampleScale, double LatScale, double LonScale, double HeightScale, - const double LineNum[20], const double LineDen[20], const double SampleNum[20], const double SampleDen[20]) + double LineScale, double SampleScale, double LatScale, double LonScale, double HeightScale, + const double (&LineNum)[20], const double (&LineDen)[20], const double (&SampleNum)[20], const double (&SampleDen)[20]) { // Offsets this->m_GDALRPCInfo.dfLINE_OFF = LineOffset; @@ -40,13 +41,10 @@ GDALRPCTransformer::GDALRPCTransformer(double LineOffset, double SampleOffset, d this->m_GDALRPCInfo.dfLONG_SCALE = LonScale; this->m_GDALRPCInfo.dfHEIGHT_SCALE = HeightScale; // Coefficients - for (unsigned int i = 0 ; i < 20 ; ++i) - { - this->m_GDALRPCInfo.adfLINE_NUM_COEFF[i] = LineNum[i]; - this->m_GDALRPCInfo.adfLINE_DEN_COEFF[i] = LineDen[i]; - this->m_GDALRPCInfo.adfSAMP_NUM_COEFF[i] = SampleNum[i]; - this->m_GDALRPCInfo.adfSAMP_DEN_COEFF[i] = SampleDen[i]; - } + std::copy_n(LineNum, 20, this->m_GDALRPCInfo.adfLINE_NUM_COEFF); + std::copy_n(LineDen, 20, this->m_GDALRPCInfo.adfLINE_DEN_COEFF); + std::copy_n(SampleNum, 20, this->m_GDALRPCInfo.adfSAMP_NUM_COEFF); + std::copy_n(SampleDen, 20, this->m_GDALRPCInfo.adfSAMP_DEN_COEFF); } void GDALRPCTransformer::SetOption(const std::string& Name, const std::string& Value) -- GitLab From 571aa06caa901c51d105bfc1ecac5c438a477077 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Fri, 13 Nov 2020 16:36:58 +0100 Subject: [PATCH 047/123] ENH: Use default copy-constructor and copy-assignment --- .../Metadata/include/otbGeometryMetadata.h | 4 +- .../Core/Metadata/src/otbGeometryMetadata.cxx | 43 ------------------- 2 files changed, 2 insertions(+), 45 deletions(-) diff --git a/Modules/Core/Metadata/include/otbGeometryMetadata.h b/Modules/Core/Metadata/include/otbGeometryMetadata.h index cf2b68017d..8810fda7a6 100644 --- a/Modules/Core/Metadata/include/otbGeometryMetadata.h +++ b/Modules/Core/Metadata/include/otbGeometryMetadata.h @@ -118,8 +118,8 @@ struct OTBMetadata_EXPORT RPCParam { // Constructors RPCParam() = default; - RPCParam( const RPCParam & ); // CopyConstructible required for boost::any - RPCParam& operator=(RPCParam); //CopyAssignment optional for boost::any + RPCParam(const RPCParam &) = default; // CopyConstructible required for boost::any + RPCParam& operator=(RPCParam &) = default; //CopyAssignment optional for boost::any // Offsets double LineOffset = 0.0; diff --git a/Modules/Core/Metadata/src/otbGeometryMetadata.cxx b/Modules/Core/Metadata/src/otbGeometryMetadata.cxx index dcb21155b2..0dadc355c4 100644 --- a/Modules/Core/Metadata/src/otbGeometryMetadata.cxx +++ b/Modules/Core/Metadata/src/otbGeometryMetadata.cxx @@ -77,49 +77,6 @@ std::string GCPParam::ToJSON(bool multiline) const return oss.str(); } -RPCParam::RPCParam( const RPCParam & other ) - : LineOffset(other.LineOffset), - SampleOffset(other.SampleOffset), - LatOffset(other.LatOffset), - LonOffset(other.LonOffset), - HeightOffset(other.HeightOffset), - LineScale(other.LineScale), - SampleScale(other.SampleScale), - LatScale(other.LatScale), - LonScale(other.LonScale), - HeightScale(other.HeightScale) -{ - for(int i = 0 ; i < 20 ; ++i) - { - LineNum[i] = other.LineNum[i]; - LineDen[i] = other.LineDen[i]; - SampleNum[i] = other.SampleNum[i]; - SampleDen[i] = other.SampleDen[i]; - } -} - -RPCParam& RPCParam::operator=(RPCParam other) -{ - LineOffset = other.LineOffset; - SampleOffset = other.SampleOffset; - LatOffset = other.LatOffset; - LonOffset = other.LonOffset; - HeightOffset = other.HeightOffset; - LineScale = other.LineScale; - SampleScale = other.SampleScale; - LatScale = other.LatScale; - LonScale = other.LonScale; - HeightScale = other.HeightScale; - for(int i = 0 ; i < 20 ; ++i) - { - LineNum[i] = other.LineNum[i]; - LineDen[i] = other.LineDen[i]; - SampleNum[i] = other.SampleNum[i]; - SampleDen[i] = other.SampleDen[i]; - } - return *this; -} - std::string RPCParam::ToJSON(bool multiline) const { std::ostringstream oss; -- GitLab From 8f47da8365d4e2df7c376836c31944cd0b278d17 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Fri, 13 Nov 2020 16:38:09 +0100 Subject: [PATCH 048/123] ENH: Remove useless intermediary step --- Modules/Core/Metadata/src/otbGeomMetadataSupplier.cxx | 3 +-- Modules/Core/Metadata/src/otbImageMetadataInterfaceBase.cxx | 5 +++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/Core/Metadata/src/otbGeomMetadataSupplier.cxx b/Modules/Core/Metadata/src/otbGeomMetadataSupplier.cxx index 10b53fa17f..bf381f467a 100644 --- a/Modules/Core/Metadata/src/otbGeomMetadataSupplier.cxx +++ b/Modules/Core/Metadata/src/otbGeomMetadataSupplier.cxx @@ -123,8 +123,7 @@ bool GeomMetadataSupplier::FetchRPC(ImageMetadata & imd) coeff = this->GetAs(path.str()); } - boost::any to_append = rpcStruct; - imd.Add(MDGeom::RPC, to_append); + imd.Add(MDGeom::RPC, rpcStruct); assert(imd.Has(MDGeom::RPC)); assert(rpcStruct == boost::any_cast(imd[MDGeom::RPC])); return true; diff --git a/Modules/Core/Metadata/src/otbImageMetadataInterfaceBase.cxx b/Modules/Core/Metadata/src/otbImageMetadataInterfaceBase.cxx index 46dc8588a3..6a2fec964b 100644 --- a/Modules/Core/Metadata/src/otbImageMetadataInterfaceBase.cxx +++ b/Modules/Core/Metadata/src/otbImageMetadataInterfaceBase.cxx @@ -749,8 +749,9 @@ const boost::any& ImageMetadataInterfaceBase::FetchRPC( coeffs = mds.GetAsVector("RPC/SAMP_DEN_COEFF",' ',20); std::copy(coeffs.begin(), coeffs.end(), rpcStruct.SampleDen); - boost::any to_append = rpcStruct; - m_Imd.Add(MDGeom::RPC, to_append); + m_Imd.Add(MDGeom::RPC, rpcStruct); + assert(m_Imd.Has(MDGeom::RPC)); + assert(rpcStruct == boost::any_cast(m_Imd[MDGeom::RPC])); return m_Imd[MDGeom::RPC]; } -- GitLab From 1bc033b289a3c111d54ae6566b577a34508852c8 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Fri, 13 Nov 2020 20:53:54 +0100 Subject: [PATCH 049/123] REFACT: Correct GIT_TAG for DiapOTB --- Modules/Remote/diapotb.remote.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Remote/diapotb.remote.cmake b/Modules/Remote/diapotb.remote.cmake index 945b7cb321..d9edc8c0c7 100644 --- a/Modules/Remote/diapotb.remote.cmake +++ b/Modules/Remote/diapotb.remote.cmake @@ -22,5 +22,5 @@ otb_fetch_module(DiapOTBModule "OTB module for SAR processing in Diapason." GIT_REPOSITORY https://gitlab.orfeo-toolbox.org/remote_modules/diapotb.git - GIT_TAG 8f6b3a9d1efc1ee99e619d5c408f72a2dfe31753 + GIT_TAG 69bc3588a51b9a52291e415f0822dadd8a8951fc ) -- GitLab From 11105e84acd1e92bdfad9513798a94a02ab2d847 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Mon, 16 Nov 2020 14:45:58 +0100 Subject: [PATCH 050/123] FIX: Remove dangling pointers in GeometriesProjectionFilter --- .../GeometriesProjectionExample.cxx | 2 +- .../app/otbPolygonClassStatistics.cxx | 2 +- .../app/otbSampleSelection.cxx | 2 +- .../app/otbVectorDataReprojection.cxx | 4 +-- .../include/otbGeometriesProjectionFilter.h | 28 +++++++++++++------ .../include/otbGeometriesProjectionFilter.hxx | 24 ---------------- ...metriesProjectionFilterFromMapToSensor.cxx | 2 +- 7 files changed, 26 insertions(+), 38 deletions(-) diff --git a/Examples/Projections/GeometriesProjectionExample.cxx b/Examples/Projections/GeometriesProjectionExample.cxx index 3232d03cc7..64e45b9241 100644 --- a/Examples/Projections/GeometriesProjectionExample.cxx +++ b/Examples/Projections/GeometriesProjectionExample.cxx @@ -84,7 +84,7 @@ int main(int argc, char* argv[]) // the image: // necessary for sensors - filter->SetOutputImageMetadata(imageReader->GetOutput()->GetImageMetadata()); + filter->SetOutputImageMetadata(&(imageReader->GetOutput()->GetImageMetadata())); // necessary for sensors filter->SetOutputOrigin(imageReader->GetOutput()->GetOrigin()); // necessary for sensors diff --git a/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx b/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx index 715d2522b3..82ca93f274 100644 --- a/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx +++ b/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx @@ -209,7 +209,7 @@ private: geometriesProjFilter->SetInput(inputGeomSet); if (imageProjectionRef.empty()) { - geometriesProjFilter->SetOutputImageMetadata(inputImg->GetImageMetadata()); + geometriesProjFilter->SetOutputImageMetadata(&(inputImg->GetImageMetadata())); } geometriesProjFilter->SetOutputProjectionRef(imageProjectionRef); geometriesProjFilter->SetOutput(outputGeomSet); diff --git a/Modules/Applications/AppClassification/app/otbSampleSelection.cxx b/Modules/Applications/AppClassification/app/otbSampleSelection.cxx index da0bb94dff..8395ce5461 100644 --- a/Modules/Applications/AppClassification/app/otbSampleSelection.cxx +++ b/Modules/Applications/AppClassification/app/otbSampleSelection.cxx @@ -375,7 +375,7 @@ private: geometriesProjFilter->SetInput(inputGeomSet); if (imageProjectionRef.empty()) { - geometriesProjFilter->SetOutputImageMetadata(inputImg->GetImageMetadata()); + geometriesProjFilter->SetOutputImageMetadata(&(inputImg->GetImageMetadata())); } geometriesProjFilter->SetOutputProjectionRef(imageProjectionRef); geometriesProjFilter->SetOutput(outputGeomSet); diff --git a/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx b/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx index 312b8d20f2..c433582b63 100644 --- a/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx +++ b/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx @@ -134,7 +134,7 @@ private: if (HasValue("in.kwl")) { FloatVectorImageType::Pointer inImage = GetParameterFloatVectorImage("in.kwl"); - m_GeometriesProjFilter->SetInputImageMetadata(inImage->GetImageMetadata()); + m_GeometriesProjFilter->SetInputImageMetadata(&(inImage->GetImageMetadata())); // otbAppLogINFO(<<"kwl."<GetProjectionRef(); // ~ wkt if (m_OutputProjectionRef.empty()) { - m_GeometriesProjFilter->SetOutputImageMetadata(outImage->GetImageMetadata()); + m_GeometriesProjFilter->SetOutputImageMetadata(&(outImage->GetImageMetadata())); } } else diff --git a/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.h b/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.h index c7b688e3df..4fa76d35f2 100644 --- a/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.h +++ b/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.h @@ -256,13 +256,25 @@ public: /**\name ImageMetadata accessors and mutators */ //@{ - itkGetMacro(InputImageMetadata, ImageMetadata*); - void SetInputImageMetadata(ImageMetadata* imd); - void SetInputImageMetadata(ImageMetadata imd); + const ImageMetadata* GetInputImageMetadata() const + { + return m_InputImageMetadata; + } + void SetInputImageMetadata(const ImageMetadata* imd) + { + m_InputImageMetadata = imd; + this->Modified(); + } - itkGetMacro(OutputImageMetadata, ImageMetadata*); - void SetOutputImageMetadata(ImageMetadata* imd); - void SetOutputImageMetadata(ImageMetadata imd); + const ImageMetadata* GetOutputImageMetadata() const + { + return m_OutputImageMetadata; + } + void SetOutputImageMetadata(const ImageMetadata* imd) + { + m_OutputImageMetadata = imd; + this->Modified(); + } //@} /**\name Projection references accessors and mutators @@ -300,8 +312,8 @@ private: //@} std::string m_OutputProjectionRef; // in WKT format! - ImageMetadata* m_InputImageMetadata = nullptr; - ImageMetadata* m_OutputImageMetadata = nullptr; + const ImageMetadata* m_InputImageMetadata = nullptr; + const ImageMetadata* m_OutputImageMetadata = nullptr; }; } // end namespace otb diff --git a/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.hxx b/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.hxx index 6c4757f1fd..818f5b6893 100644 --- a/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.hxx +++ b/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.hxx @@ -79,28 +79,4 @@ inline void otb::GeometriesProjectionFilter::SetOutputOrigin(ImageReference::Ori m_OutputImageReference.SetOrigin(origin); } -inline void otb::GeometriesProjectionFilter::SetInputImageMetadata(ImageMetadata* imd) -{ - this->m_InputImageMetadata = imd; - this->Modified(); -} - -inline void otb::GeometriesProjectionFilter::SetInputImageMetadata(ImageMetadata imd) -{ - this->m_InputImageMetadata = &imd; - this->Modified(); -} - -inline void otb::GeometriesProjectionFilter::SetOutputImageMetadata(ImageMetadata* imd) -{ - this->m_OutputImageMetadata = imd; - this->Modified(); -} - -inline void otb::GeometriesProjectionFilter::SetOutputImageMetadata(ImageMetadata imd) -{ - this->m_OutputImageMetadata = &imd; - this->Modified(); -} - #endif diff --git a/Modules/Filtering/Projection/test/otbGeometriesProjectionFilterFromMapToSensor.cxx b/Modules/Filtering/Projection/test/otbGeometriesProjectionFilterFromMapToSensor.cxx index 7595e52004..c8044ea2f6 100644 --- a/Modules/Filtering/Projection/test/otbGeometriesProjectionFilterFromMapToSensor.cxx +++ b/Modules/Filtering/Projection/test/otbGeometriesProjectionFilterFromMapToSensor.cxx @@ -61,7 +61,7 @@ int otbGeometriesProjectionFilterFromMapToSensor(int argc, char* argv[]) GeometriesFilterType::Pointer filter = GeometriesFilterType::New(); filter->SetInput(in_set); filter->SetOutput(out_set); - filter->SetOutputImageMetadata(imageReader->GetOutput()->GetImageMetadata()); + filter->SetOutputImageMetadata(&(imageReader->GetOutput()->GetImageMetadata())); filter->SetOutputOrigin(imageReader->GetOutput()->GetOrigin()); filter->SetOutputSpacing(imageReader->GetOutput()->GetSignedSpacing()); -- GitLab From ff24eacd62461f6104d568af75983bd99089e7b4 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Mon, 16 Nov 2020 17:18:39 +0100 Subject: [PATCH 051/123] REFACT: Remove Keywordlist related get/set in DEMToImageGenerator --- .../include/otbGDALRPCTransformer.h | 1 + .../src/otbGDALRPCTransformer.cxx | 8 +++++ .../otbStereoRectificationGridGenerator.cxx | 2 +- .../DEM/include/otbDEMToImageGenerator.h | 29 ++----------------- .../DEM/include/otbDEMToImageGenerator.hxx | 3 +- 5 files changed, 15 insertions(+), 28 deletions(-) diff --git a/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h b/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h index e0d514038a..ec57bfd9e6 100644 --- a/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h +++ b/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h @@ -63,6 +63,7 @@ public: GDALRPCTransformer(double LineOffset, double SampleOffset, double LatOffset, double LonOffset, double HeightOffset, double LineScale, double SampleScale, double LatScale, double LonScale, double HeightScale, const double (&LineNum)[20], const double (&LineDen)[20], const double (&SampleNum)[20], const double (&SampleDen)[20]); + ~GDALRPCTransformer(); /** * Set additional options to the transformer diff --git a/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx b/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx index 0f6f37ddf9..5c6ca96ad1 100644 --- a/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx +++ b/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx @@ -47,6 +47,12 @@ GDALRPCTransformer::GDALRPCTransformer(double LineOffset, double SampleOffset, d std::copy_n(SampleDen, 20, this->m_GDALRPCInfo.adfSAMP_DEN_COEFF); } +GDALRPCTransformer::~GDALRPCTransformer() +{ + if(m_TransformArg != nullptr) + GDALDestroyTransformer(m_TransformArg); +} + void GDALRPCTransformer::SetOption(const std::string& Name, const std::string& Value) { this->m_Options = CSLSetNameValue(this->m_Options, Name.c_str(), Value.c_str()); @@ -61,6 +67,8 @@ void GDALRPCTransformer::SetPixErrThreshold(double PixErrThreshold) void GDALRPCTransformer::Update() { + if(m_TransformArg != nullptr) + GDALDestroyTransformer(m_TransformArg); this->m_TransformArg = GDALCreateRPCTransformer(&this->m_GDALRPCInfo, false, this->m_PixErrThreshold, this->m_Options); this->m_Modified = false; } diff --git a/Modules/Applications/AppStereo/app/otbStereoRectificationGridGenerator.cxx b/Modules/Applications/AppStereo/app/otbStereoRectificationGridGenerator.cxx index 6a995450df..d069c8d9fc 100644 --- a/Modules/Applications/AppStereo/app/otbStereoRectificationGridGenerator.cxx +++ b/Modules/Applications/AppStereo/app/otbStereoRectificationGridGenerator.cxx @@ -303,7 +303,7 @@ private: m_DEMToImageGenerator->SetOutputSize(size); m_DEMToImageGenerator->SetOutputSpacing(spacing); m_DEMToImageGenerator->SetOutputProjectionRef(GetParameterImage("io.inleft")->GetProjectionRef()); - m_DEMToImageGenerator->SetOutputKeywordList(GetParameterImage("io.inleft")->GetImageKeywordlist()); + m_DEMToImageGenerator->SetOutputImageMetadata(&(GetParameterImage("io.inleft")->GetImageMetadata())); m_DEMToImageGenerator->AboveEllipsoidOn(); m_StatisticsFilter->SetInput(m_DEMToImageGenerator->GetOutput()); diff --git a/Modules/Filtering/DEM/include/otbDEMToImageGenerator.h b/Modules/Filtering/DEM/include/otbDEMToImageGenerator.h index 3af777766f..65e89e2126 100644 --- a/Modules/Filtering/DEM/include/otbDEMToImageGenerator.h +++ b/Modules/Filtering/DEM/include/otbDEMToImageGenerator.h @@ -137,34 +137,12 @@ public: return m_Transform->GetInputProjectionRef(); } - /** Set/Get Input Keywordlist - * \deprecated - */ - void SetInputKeywordList(const ImageKeywordlist& kwl) - { - } - const ImageKeywordlist GetInputKeywordList() - { - } - - /** Set/Get output Keywordlist - * \deprecated - */ - void SetOutputKeywordList(const ImageKeywordlist& kwl) - { - } - - const ImageKeywordlist GetOutputKeywordList() - { - } - /** Set/Get ImageMetadata*/ const ImageMetadata* GetInputImageMetadata() const { return m_Transform->GetInputImageMetadata(); } - - void SetInputImageMetadata(ImageMetadata* imd) + void SetInputImageMetadata(const ImageMetadata* imd) { m_Transform->SetInputImageMetadata(imd); this->Modified(); @@ -174,8 +152,7 @@ public: { return m_Transform->GetOutputImageMetadata(); } - - void SetOutputImageMetadata(ImageMetadata* imd) + void SetOutputImageMetadata(const ImageMetadata* imd) { m_Transform->SetOutputImageMetadata(imd); this->Modified(); @@ -190,7 +167,7 @@ public: // this->SetOutputStartIndex ( image->GetLargestPossibleRegion().GetIndex() ); this->SetOutputSize(image->GetLargestPossibleRegion().GetSize()); this->SetOutputProjectionRef(image->GetProjectionRef()); - this->SetOutputKeywordList(image->GetImageKeywordlist()); + this->SetOutputImageMetadata(&(image->GetImageMetadata())); InstantiateTransform(); } diff --git a/Modules/Filtering/DEM/include/otbDEMToImageGenerator.hxx b/Modules/Filtering/DEM/include/otbDEMToImageGenerator.hxx index d790f18a76..47c7a418c9 100644 --- a/Modules/Filtering/DEM/include/otbDEMToImageGenerator.hxx +++ b/Modules/Filtering/DEM/include/otbDEMToImageGenerator.hxx @@ -65,7 +65,8 @@ void DEMToImageGenerator::GenerateOutputInformation() // Add the metadata set by the user to the output output->m_Imd.Add(MDGeom::ProjectionProj, m_Transform->GetInputProjectionRef()); - output->m_Imd.Merge(*m_Transform->GetInputImageMetadata()); + if (m_Transform->GetInputImageMetadata() != nullptr) + output->m_Imd.Merge(*m_Transform->GetInputImageMetadata()); } // InstantiateTransform method -- GitLab From f4fc7de035bcbbe210b49a4ef2f58226fc4c425a Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Tue, 17 Nov 2020 10:13:37 +0100 Subject: [PATCH 052/123] FIX: Set ProjectionProj as std::string before storing as boost::any --- Modules/Filtering/DEM/include/otbDEMToImageGenerator.hxx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Modules/Filtering/DEM/include/otbDEMToImageGenerator.hxx b/Modules/Filtering/DEM/include/otbDEMToImageGenerator.hxx index 47c7a418c9..1d865fa83b 100644 --- a/Modules/Filtering/DEM/include/otbDEMToImageGenerator.hxx +++ b/Modules/Filtering/DEM/include/otbDEMToImageGenerator.hxx @@ -47,8 +47,7 @@ DEMToImageGenerator::DEMToImageGenerator() template void DEMToImageGenerator::GenerateOutputInformation() { - DEMImageType* output; - output = this->GetOutput(0); + DEMImageType* output = this->GetOutput(0); IndexType start; start[0] = 0; @@ -64,7 +63,7 @@ void DEMToImageGenerator::GenerateOutputInformation() output->SetOrigin(m_OutputOrigin); // Add the metadata set by the user to the output - output->m_Imd.Add(MDGeom::ProjectionProj, m_Transform->GetInputProjectionRef()); + output->m_Imd.Add(MDGeom::ProjectionProj, std::string(m_Transform->GetInputProjectionRef())); if (m_Transform->GetInputImageMetadata() != nullptr) output->m_Imd.Merge(*m_Transform->GetInputImageMetadata()); } -- GitLab From 1e29d56ddc9bb9cab1f48d9c999922af9c80f54c Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Tue, 17 Nov 2020 14:19:59 +0100 Subject: [PATCH 053/123] ENH: Remove unused import --- .../Filtering/Projection/include/otbGeometriesProjectionFilter.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.h b/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.h index 4fa76d35f2..a6667df9dd 100644 --- a/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.h +++ b/Modules/Filtering/Projection/include/otbGeometriesProjectionFilter.h @@ -27,7 +27,6 @@ #include "itkTransform.h" #include "otbGenericRSTransform.h" #include "otbImageMetadata.h" -#include "otbImageKeywordlist.h" #include "OTBProjectionExport.h" #include -- GitLab From ff449eecd65d9b894a38b6f712c4ee6e4ce7e166 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 18 Nov 2020 13:34:13 +0100 Subject: [PATCH 054/123] FIX: Correct class name in itkTypeMacro --- Modules/Core/Transform/include/otbGenericRSTransform.hxx | 1 - Modules/Core/Transform/include/otbRPCForwardTransform.h | 2 +- Modules/Core/Transform/include/otbRPCInverseTransform.h | 2 +- Modules/Core/Transform/include/otbRPCTransformBase.h | 2 +- Modules/Core/Transform/include/otbRPCTransformBase.hxx | 2 +- 5 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Modules/Core/Transform/include/otbGenericRSTransform.hxx b/Modules/Core/Transform/include/otbGenericRSTransform.hxx index 023276370a..af0e53080b 100644 --- a/Modules/Core/Transform/include/otbGenericRSTransform.hxx +++ b/Modules/Core/Transform/include/otbGenericRSTransform.hxx @@ -23,7 +23,6 @@ #include "otbGenericRSTransform.h" #include "otbMacro.h" -#include "otbMetaDataKey.h" #include "otbRPCForwardTransform.h" #include "otbRPCInverseTransform.h" diff --git a/Modules/Core/Transform/include/otbRPCForwardTransform.h b/Modules/Core/Transform/include/otbRPCForwardTransform.h index 3a6386ef92..05b058fd2f 100644 --- a/Modules/Core/Transform/include/otbRPCForwardTransform.h +++ b/Modules/Core/Transform/include/otbRPCForwardTransform.h @@ -54,7 +54,7 @@ public: itkNewMacro(Self); /** Run-time type information (and related methods). */ - itkTypeMacro(Self, Superclass); + itkTypeMacro(RPCForwardTransform, RPCTransformBase); itkStaticConstMacro(InputSpaceDimension, unsigned int, NInputDimensions); itkStaticConstMacro(OutputSpaceDimension, unsigned int, NOutputDimensions); diff --git a/Modules/Core/Transform/include/otbRPCInverseTransform.h b/Modules/Core/Transform/include/otbRPCInverseTransform.h index b1cd85bde5..c05ea1b32c 100644 --- a/Modules/Core/Transform/include/otbRPCInverseTransform.h +++ b/Modules/Core/Transform/include/otbRPCInverseTransform.h @@ -54,7 +54,7 @@ public: itkNewMacro(Self); /** Run-time type information (and related methods). */ - itkTypeMacro(Self, Superclass); + itkTypeMacro(RPCInverseTransform, RPCTransformBase); itkStaticConstMacro(InputSpaceDimension, unsigned int, NInputDimensions); itkStaticConstMacro(OutputSpaceDimension, unsigned int, NOutputDimensions); diff --git a/Modules/Core/Transform/include/otbRPCTransformBase.h b/Modules/Core/Transform/include/otbRPCTransformBase.h index 2611744e07..a54e5d4c07 100644 --- a/Modules/Core/Transform/include/otbRPCTransformBase.h +++ b/Modules/Core/Transform/include/otbRPCTransformBase.h @@ -58,7 +58,7 @@ public: //@} /** Run-time type information (and related methods). */ - itkTypeMacro(Self, Superclass); + itkTypeMacro(RPCTransformBase, SensorTransformBase); itkStaticConstMacro(InputSpaceDimension, unsigned int, NInputDimensions); itkStaticConstMacro(OutputSpaceDimension, unsigned int, NOutputDimensions); diff --git a/Modules/Core/Transform/include/otbRPCTransformBase.hxx b/Modules/Core/Transform/include/otbRPCTransformBase.hxx index 1c04f39c66..762bc494eb 100644 --- a/Modules/Core/Transform/include/otbRPCTransformBase.hxx +++ b/Modules/Core/Transform/include/otbRPCTransformBase.hxx @@ -63,7 +63,7 @@ template ::PrintSelf(std::ostream& os, itk::Indent indent) const { Superclass::PrintSelf(os, indent); - os << indent << "RPC Model: " << this->m_RPCParam.get() << std::endl; + os << indent << "RPC Model: " << this->m_RPCParam.get()->ToJSON() << std::endl; } } -- GitLab From c27782182686712884525647c1a75ad115f26071 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 18 Nov 2020 15:00:57 +0100 Subject: [PATCH 055/123] FIX: Write projection in output file --- Modules/Core/Metadata/include/otbImageMetadata.h | 1 + Modules/Core/Metadata/src/otbImageMetadata.cxx | 13 +++++++++++++ Modules/IO/IOGDAL/src/otbGDALImageIO.cxx | 9 +++++++-- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Modules/Core/Metadata/include/otbImageMetadata.h b/Modules/Core/Metadata/include/otbImageMetadata.h index 687d76fa56..ac29da5767 100644 --- a/Modules/Core/Metadata/include/otbImageMetadata.h +++ b/Modules/Core/Metadata/include/otbImageMetadata.h @@ -117,6 +117,7 @@ public: const Projection::GCPParam & GetGCPParam() const; std::string GetProjectionWKT() const; + std::string GetProjectionProj() const; // -------------------- Geom utility function ---------------------------- diff --git a/Modules/Core/Metadata/src/otbImageMetadata.cxx b/Modules/Core/Metadata/src/otbImageMetadata.cxx index 7a6b1692e6..82ee5498cc 100644 --- a/Modules/Core/Metadata/src/otbImageMetadata.cxx +++ b/Modules/Core/Metadata/src/otbImageMetadata.cxx @@ -81,6 +81,19 @@ std::string ImageMetadataBase::GetProjectionWKT() const } } +std::string ImageMetadataBase::GetProjectionProj() const +{ + auto proj = GeometryKeys.find(MDGeom::ProjectionProj); + if (proj != GeometryKeys.end()) + { + return boost::any_cast(proj->second); + } + else + { + return ""; + } +} + // -------------------- Geom utility function ---------------------------- const boost::any & ImageMetadataBase::operator[](const MDGeom& key) const { diff --git a/Modules/IO/IOGDAL/src/otbGDALImageIO.cxx b/Modules/IO/IOGDAL/src/otbGDALImageIO.cxx index eed293374b..9388469de9 100644 --- a/Modules/IO/IOGDAL/src/otbGDALImageIO.cxx +++ b/Modules/IO/IOGDAL/src/otbGDALImageIO.cxx @@ -1504,6 +1504,11 @@ void GDALImageIO::InternalWriteImageInformation(const void* buffer) std::string projectionRef( m_Imd.GetProjectionWKT() ); dataset->SetProjection(projectionRef.c_str()); } + else if (m_Imd.Has(MDGeom::ProjectionProj)) + { + std::string projectionRef( m_Imd.GetProjectionProj() ); + dataset->SetProjection(projectionRef.c_str()); + } /* -------------------------------------------------------------------- */ /* Case 2: Sensor geometry */ /* -------------------------------------------------------------------- */ @@ -1946,9 +1951,9 @@ void GDALImageIO::KeywordlistToMetadata(ImageMetadataBase::Keywordlist kwl, int { // GCPs have already been exported (see InternalWriteImageInformation) } - else if (kv.first == MetaData::MDGeomNames.left.at(MDGeom::ProjectionWKT)) + else if ((kv.first == MetaData::MDGeomNames.left.at(MDGeom::ProjectionWKT)) || (kv.first == MetaData::MDGeomNames.left.at(MDGeom::ProjectionProj))) { - // WKT projection have already been exported (see InternalWriteImageInformation) + // Projection have already been exported (see InternalWriteImageInformation) } else SetMetadataValue(kv.first.c_str(), kv.second.c_str(), band); -- GitLab From 5389d9e52dc8f55b9c8b0210bb557f18b6e12095 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 18 Nov 2020 18:06:33 +0100 Subject: [PATCH 056/123] ENH: Move GDALRPCTransformer to IO/IOGDAL so it can interact with DEMHandler --- Modules/Adapters/GdalAdapters/src/CMakeLists.txt | 1 - Modules/Adapters/GdalAdapters/test/CMakeLists.txt | 7 ------- .../GdalAdapters/test/otbGdalAdaptersTestDriver.cxx | 1 - .../IOGDAL}/include/otbGDALRPCTransformer.h | 0 Modules/IO/IOGDAL/src/CMakeLists.txt | 3 ++- .../IOGDAL}/src/otbGDALRPCTransformer.cxx | 5 +++++ Modules/IO/IOGDAL/test/CMakeLists.txt | 7 +++++++ .../IOGDAL}/test/otbGDALRPCTransformerTest.cxx | 0 Modules/IO/IOGDAL/test/otbIOGDALTestDriver.cxx | 1 + 9 files changed, 15 insertions(+), 10 deletions(-) rename Modules/{Adapters/GdalAdapters => IO/IOGDAL}/include/otbGDALRPCTransformer.h (100%) rename Modules/{Adapters/GdalAdapters => IO/IOGDAL}/src/otbGDALRPCTransformer.cxx (95%) rename Modules/{Adapters/GdalAdapters => IO/IOGDAL}/test/otbGDALRPCTransformerTest.cxx (100%) diff --git a/Modules/Adapters/GdalAdapters/src/CMakeLists.txt b/Modules/Adapters/GdalAdapters/src/CMakeLists.txt index 2d6d9341f5..01ef351268 100644 --- a/Modules/Adapters/GdalAdapters/src/CMakeLists.txt +++ b/Modules/Adapters/GdalAdapters/src/CMakeLists.txt @@ -32,7 +32,6 @@ set(OTBGdalAdapters_SRC otbOGRExtendedFilenameToOptions.cxx otbSpatialReference.cxx otbCoordinateTransformation.cxx - otbGDALRPCTransformer.cxx ) add_library(OTBGdalAdapters ${OTBGdalAdapters_SRC}) diff --git a/Modules/Adapters/GdalAdapters/test/CMakeLists.txt b/Modules/Adapters/GdalAdapters/test/CMakeLists.txt index 548c17738f..75a50079d1 100644 --- a/Modules/Adapters/GdalAdapters/test/CMakeLists.txt +++ b/Modules/Adapters/GdalAdapters/test/CMakeLists.txt @@ -86,7 +86,6 @@ add_executable(otbGdalAdaptersTestDriver otbGdalAdaptersTestDriver.cxx otbSpatialReferenceTest.cxx otbCoordinateTransformationTest.cxx - otbGDALRPCTransformerTest.cxx ) target_link_libraries(otbGdalAdaptersTestDriver ${OTBGdalAdapters-Test_LIBRARIES}) @@ -98,9 +97,3 @@ otb_add_test(NAME TuSpatialReferenceTest otb_add_test(NAME TuOCoordinateTransformationTest COMMAND otbGdalAdaptersTestDriver otbCoordinateTransformationTest) - -otb_add_test(NAME TuGDALRPCTransformerTest - COMMAND otbGdalAdaptersTestDriver - otbGDALRPCTransformerTest - ${INPUTDATA}/TuGDALRPCTransformerTest_DEM.tif - ) diff --git a/Modules/Adapters/GdalAdapters/test/otbGdalAdaptersTestDriver.cxx b/Modules/Adapters/GdalAdapters/test/otbGdalAdaptersTestDriver.cxx index 634126fa03..7857c16636 100644 --- a/Modules/Adapters/GdalAdapters/test/otbGdalAdaptersTestDriver.cxx +++ b/Modules/Adapters/GdalAdapters/test/otbGdalAdaptersTestDriver.cxx @@ -24,5 +24,4 @@ void RegisterTests() { REGISTER_TEST(otbSpatialReferenceTest); REGISTER_TEST(otbCoordinateTransformationTest); - REGISTER_TEST(otbGDALRPCTransformerTest); } diff --git a/Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h b/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h similarity index 100% rename from Modules/Adapters/GdalAdapters/include/otbGDALRPCTransformer.h rename to Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h diff --git a/Modules/IO/IOGDAL/src/CMakeLists.txt b/Modules/IO/IOGDAL/src/CMakeLists.txt index 4ccae4de9d..c18da2d8cc 100644 --- a/Modules/IO/IOGDAL/src/CMakeLists.txt +++ b/Modules/IO/IOGDAL/src/CMakeLists.txt @@ -29,6 +29,7 @@ set(OTBIOGDAL_SRC otbOGRVectorDataIOFactory.cxx otbDEMHandler.cxx otbGDALImageMetadataInterface.cxx + otbGDALRPCTransformer.cxx ) add_library(OTBIOGDAL ${OTBIOGDAL_SRC}) @@ -41,7 +42,7 @@ target_link_libraries(OTBIOGDAL ${OTBGDAL_LIBRARIES} ${OTBBoost_LIBRARIES} ${OTBOSSIMAdapters_LIBRARIES} - ${Boost_LIBRARIES} + ${Boost_LIBRARIES} ) otb_module_target(OTBIOGDAL) diff --git a/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx b/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx similarity index 95% rename from Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx rename to Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx index 5c6ca96ad1..8c9e62272c 100644 --- a/Modules/Adapters/GdalAdapters/src/otbGDALRPCTransformer.cxx +++ b/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx @@ -21,6 +21,7 @@ #include "otbGDALRPCTransformer.h" #include #include "cpl_string.h" +#include "otbDEMHandler.h" namespace otb { @@ -45,6 +46,10 @@ GDALRPCTransformer::GDALRPCTransformer(double LineOffset, double SampleOffset, d std::copy_n(LineDen, 20, this->m_GDALRPCInfo.adfLINE_DEN_COEFF); std::copy_n(SampleNum, 20, this->m_GDALRPCInfo.adfSAMP_NUM_COEFF); std::copy_n(SampleDen, 20, this->m_GDALRPCInfo.adfSAMP_DEN_COEFF); + + auto & demHandler = otb::DEMHandler::GetInstance(); + if (demHandler.GetDEMCount() > 0) + this->SetOption("RPC_DEM", demHandler.DEM_DATASET_PATH); } GDALRPCTransformer::~GDALRPCTransformer() diff --git a/Modules/IO/IOGDAL/test/CMakeLists.txt b/Modules/IO/IOGDAL/test/CMakeLists.txt index 9c239d2514..ee3bd5e4bd 100644 --- a/Modules/IO/IOGDAL/test/CMakeLists.txt +++ b/Modules/IO/IOGDAL/test/CMakeLists.txt @@ -32,6 +32,7 @@ otbGDALImageIOTestCanRead.cxx otbMultiDatasetReadingInfo.cxx otbOGRVectorDataIOCanRead.cxx otbGDALImageIOImportExportMetadata.cxx +otbGDALRPCTransformerTest.cxx ) add_executable(otbIOGDALTestDriver ${OTBIOGDALTests}) @@ -260,3 +261,9 @@ foreach(INPUTFILE_PIXELTYPE ${INPUTFILE_PIXELTYPES_LIST}) 1 5 10 2) #old file hdr sans extensions endforeach() + +otb_add_test(NAME TuGDALRPCTransformerTest + COMMAND otbGdalAdaptersTestDriver + otbGDALRPCTransformerTest + ${INPUTDATA}/TuGDALRPCTransformerTest_DEM.tif + ) diff --git a/Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx b/Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest.cxx similarity index 100% rename from Modules/Adapters/GdalAdapters/test/otbGDALRPCTransformerTest.cxx rename to Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest.cxx diff --git a/Modules/IO/IOGDAL/test/otbIOGDALTestDriver.cxx b/Modules/IO/IOGDAL/test/otbIOGDALTestDriver.cxx index 5458ac35a6..b29c95d4e6 100644 --- a/Modules/IO/IOGDAL/test/otbIOGDALTestDriver.cxx +++ b/Modules/IO/IOGDAL/test/otbIOGDALTestDriver.cxx @@ -34,4 +34,5 @@ void RegisterTests() REGISTER_TEST(otbMultiDatasetReadingInfo); REGISTER_TEST(otbOGRVectorDataIOTestCanRead); REGISTER_TEST(otbGDALImageIOImportExportMetadata); + REGISTER_TEST(otbGDALRPCTransformerTest); } -- GitLab From 8f85f3d2dc7406b226537ae707fc38c8f6f7a4d0 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Thu, 19 Nov 2020 08:59:29 +0100 Subject: [PATCH 057/123] FIX: Move GDALRPCTransformer to IO/IOGDAL so it can interact with DEMHandler --- .../Projection/include/otbGenericRSResampleImageFilter.hxx | 1 - Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h | 5 ++--- Modules/IO/IOGDAL/test/CMakeLists.txt | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx index 81e9b97191..30c089d829 100644 --- a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx +++ b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx @@ -24,7 +24,6 @@ #include "otbGenericRSResampleImageFilter.h" #include "itkMetaDataObject.h" -#include "otbMetaDataKey.h" #include "itkProgressAccumulator.h" diff --git a/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h b/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h index ec57bfd9e6..6dcd2eb26e 100644 --- a/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h +++ b/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h @@ -20,7 +20,6 @@ #ifndef otbGDALRPCTransformer_h #define otbGDALRPCTransformer_h -#include "OTBGdalAdaptersExport.h" #include "itkPoint.h" #include "gdal_alg.h" @@ -42,10 +41,10 @@ namespace otb * RPCParam structure defined in the otbGeometryMetadata.h file. They * are quite similar to what can be found in GDALRPCInfo. * - * \ingroup OTBGdalAdapters + * \ingroup OTBIOGDAL */ -class OTBGdalAdapters_EXPORT GDALRPCTransformer +class GDALRPCTransformer { public: diff --git a/Modules/IO/IOGDAL/test/CMakeLists.txt b/Modules/IO/IOGDAL/test/CMakeLists.txt index ee3bd5e4bd..bc78528aae 100644 --- a/Modules/IO/IOGDAL/test/CMakeLists.txt +++ b/Modules/IO/IOGDAL/test/CMakeLists.txt @@ -263,7 +263,7 @@ foreach(INPUTFILE_PIXELTYPE ${INPUTFILE_PIXELTYPES_LIST}) endforeach() otb_add_test(NAME TuGDALRPCTransformerTest - COMMAND otbGdalAdaptersTestDriver + COMMAND otbIOGDALTestDriver otbGDALRPCTransformerTest ${INPUTDATA}/TuGDALRPCTransformerTest_DEM.tif ) -- GitLab From 0e723e704ad17a75e1123780cdd5ae3d98434e65 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Fri, 20 Nov 2020 14:33:11 +0100 Subject: [PATCH 058/123] FIX: Encapsulate output metadata in GenericRSResampleImageFilter --- Modules/Core/Metadata/src/otbImageMetadata.cxx | 2 +- .../include/otbGenericRSResampleImageFilter.hxx | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Modules/Core/Metadata/src/otbImageMetadata.cxx b/Modules/Core/Metadata/src/otbImageMetadata.cxx index 82ee5498cc..da84e636b2 100644 --- a/Modules/Core/Metadata/src/otbImageMetadata.cxx +++ b/Modules/Core/Metadata/src/otbImageMetadata.cxx @@ -481,7 +481,7 @@ void ImageMetadata::Merge(const ImageMetadata& imd) { ImageMetadataBase::Fuse(imd); - for (unsigned int i = 0; i < std::min(Bands.size(), imd.Bands.size()); i++) + for (unsigned int i = 0; i < std::min(Bands.size(), imd.Bands.size()); ++i) { Bands[i].Fuse(imd.Bands[i]); } diff --git a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx index 30c089d829..8959ec2fa9 100644 --- a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx +++ b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx @@ -99,8 +99,10 @@ void GenericRSResampleImageFilter::GenerateOutputInfo m_Resampler->UpdateOutputInformation(); this->GraftOutput(m_Resampler->GetOutput()); - // Encapsulate output projRef - this->GetOutput()->m_Imd.Add(MDGeom::ProjectionProj, this->GetOutputProjectionRef()); + // Encapsulate output projRef and metadata + if (this->GetOutputImageMetadata() != nullptr) + this->GetOutput()->m_Imd.Merge(*(this->GetOutputImageMetadata())); + this->GetOutput()->m_Imd.Add(MDGeom::ProjectionWKT, this->GetOutputProjectionRef()); } /** @@ -119,8 +121,8 @@ void GenericRSResampleImageFilter::EstimateOutputRpcM tempPtr->SetRegions(region); // Encapsulate the output metadata in the temp image + tempPtr->m_Imd.Add(MDGeom::ProjectionWKT, this->GetOutputProjectionRef()); tempPtr->SetImageMetadata(*(this->GetOutputImageMetadata())); - tempPtr->m_Imd.Add(MDGeom::ProjectionProj, this->GetOutputProjectionRef()); // Estimate the rpc model from the temp image m_OutputRpcEstimator->SetInput(tempPtr); -- GitLab From 0b87f0b5449bef3bff06f3d7fc0fa04f3aac2713 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Mon, 23 Nov 2020 10:57:07 +0100 Subject: [PATCH 059/123] FIX: Add Getters for projection metadata 3 keys are available to store projection metadata: Proj, WKT and EPSG. This getters allow to trtrieve the projetion as a Proj or WKT without having to worry about witch key hold the metadata. This getters are used by GenericRSTransform --- .../include/otbCosmoImageMetadataInterface.h | 2 +- .../Core/Metadata/include/otbImageMetadata.h | 32 ++++---- .../otbSentinel1ImageMetadataInterface.h | 1 + Modules/Core/Metadata/otb-module.cmake | 1 + Modules/Core/Metadata/src/CMakeLists.txt | 2 +- .../Core/Metadata/src/otbImageMetadata.cxx | 77 ++++++++++++------- .../otbRadarsat2ImageMetadataInterface.cxx | 3 +- .../src/otbTerraSarImageMetadataInterface.cxx | 2 +- .../include/otbGenericRSTransform.hxx | 4 +- .../otbGenericRSResampleImageFilter.hxx | 4 +- ...bSimpleRcsPanSharpeningFusionImageFilter.h | 2 +- 11 files changed, 74 insertions(+), 56 deletions(-) diff --git a/Modules/Core/Metadata/include/otbCosmoImageMetadataInterface.h b/Modules/Core/Metadata/include/otbCosmoImageMetadataInterface.h index e82987bc21..f68225fe95 100644 --- a/Modules/Core/Metadata/include/otbCosmoImageMetadataInterface.h +++ b/Modules/Core/Metadata/include/otbCosmoImageMetadataInterface.h @@ -22,7 +22,7 @@ #define otbCosmoImageMetadataInterface_h #include "otbSarImageMetadataInterface.h" - +#include "otbSARMetadata.h" namespace otb { diff --git a/Modules/Core/Metadata/include/otbImageMetadata.h b/Modules/Core/Metadata/include/otbImageMetadata.h index ac29da5767..a54bbca7f3 100644 --- a/Modules/Core/Metadata/include/otbImageMetadata.h +++ b/Modules/Core/Metadata/include/otbImageMetadata.h @@ -22,20 +22,15 @@ #define otbImageMetadata_h #include "otbGeometryMetadata.h" -#include "otbSARMetadata.h" #include "otbMetaDataKey.h" #include "OTBMetadataExport.h" #include "otbMacro.h" -#include "itkMath.h" #include #include #include -#include -#include #include #include -//~ #include namespace otb { @@ -104,35 +99,36 @@ public: DictType timeKeys, DictType extraKeys); - // TODO : iterators ? - - bool HasSensorGeometry() const; - - bool HasProjectedGeometry() const; - - size_t RemoveSensorGeometry(); + // -------------------- Geom utility function ---------------------------- - size_t RemoveProjectedGeometry(); + /** Read-only accessor to geometric keys */ + const boost::any & operator[](const MDGeom& key) const; const Projection::GCPParam & GetGCPParam() const; + std::string GetProjectedGeometry() const; + std::string GetProjectionWKT() const; - std::string GetProjectionProj() const; - // -------------------- Geom utility function ---------------------------- - - /** Read-only accessor to geometric keys */ - const boost::any & operator[](const MDGeom& key) const; + std::string GetProjectionProj() const; /** Setter for geometric keys */ void Add(const MDGeom& key, const boost::any &value); /** Remove a key from the dictionary (even if the key is already missing) */ size_t Remove(const MDGeom& key); + + size_t RemoveSensorGeometry(); + + size_t RemoveProjectedGeometry(); /** Test if a key is available */ bool Has(const MDGeom& key) const; + bool HasSensorGeometry() const; + + bool HasProjectedGeometry() const; + // -------------------- Double utility function ---------------------------- /** Read-only accessor to numeric keys */ diff --git a/Modules/Core/Metadata/include/otbSentinel1ImageMetadataInterface.h b/Modules/Core/Metadata/include/otbSentinel1ImageMetadataInterface.h index cf182bd279..27420d84b7 100644 --- a/Modules/Core/Metadata/include/otbSentinel1ImageMetadataInterface.h +++ b/Modules/Core/Metadata/include/otbSentinel1ImageMetadataInterface.h @@ -23,6 +23,7 @@ #include "otbSarImageMetadataInterface.h" #include "otbXMLMetadataSupplier.h" +#include "otbSARMetadata.h" namespace otb { diff --git a/Modules/Core/Metadata/otb-module.cmake b/Modules/Core/Metadata/otb-module.cmake index 326c7532ff..759ad454aa 100644 --- a/Modules/Core/Metadata/otb-module.cmake +++ b/Modules/Core/Metadata/otb-module.cmake @@ -30,6 +30,7 @@ ENABLE_SHARED OTBITK OTBOSSIMAdapters OTBCommon + OTBGdalAdapters TEST_DEPENDS OTBTestKernel diff --git a/Modules/Core/Metadata/src/CMakeLists.txt b/Modules/Core/Metadata/src/CMakeLists.txt index e25cc1adfb..7c10ac7ebe 100644 --- a/Modules/Core/Metadata/src/CMakeLists.txt +++ b/Modules/Core/Metadata/src/CMakeLists.txt @@ -85,7 +85,7 @@ target_link_libraries(OTBMetadata ${OTBCommon_LIBRARIES} ${OTBOSSIMAdapters_LIBRARIES} ${Boost_LIBRARIES} - + ${OTBGdalAdapters_LIBRARIES} ) otb_module_target(OTBMetadata) diff --git a/Modules/Core/Metadata/src/otbImageMetadata.cxx b/Modules/Core/Metadata/src/otbImageMetadata.cxx index da84e636b2..a4717806d2 100644 --- a/Modules/Core/Metadata/src/otbImageMetadata.cxx +++ b/Modules/Core/Metadata/src/otbImageMetadata.cxx @@ -19,6 +19,8 @@ */ #include "otbImageMetadata.h" +#include "otbSpatialReference.h" + namespace otb { // ---------------------- [ImageMetadataBase] ------------------------------ @@ -43,24 +45,10 @@ ImageMetadataBase::ImageMetadataBase(DictType geometryKeys, ExtraKeys(std::move(extraKeys)) {} -bool ImageMetadataBase::HasSensorGeometry() const -{ - return Has(MDGeom::RPC) || Has(MDGeom::SAR) || Has(MDGeom::SensorGeometry); -} - -bool ImageMetadataBase::HasProjectedGeometry() const -{ - return Has(MDGeom::ProjectionWKT) || Has(MDGeom::ProjectionEPSG) || Has(MDGeom::ProjectionProj); -} - -size_t ImageMetadataBase::RemoveSensorGeometry() -{ - return Remove(MDGeom::RPC) + Remove(MDGeom::SAR) + Remove(MDGeom::SensorGeometry); -} - -size_t ImageMetadataBase::RemoveProjectedGeometry() +// -------------------- Geom utility function ---------------------------- +const boost::any & ImageMetadataBase::operator[](const MDGeom& key) const { - return Remove(MDGeom::ProjectionWKT) + Remove(MDGeom::ProjectionEPSG) + Remove(MDGeom::ProjectionProj); + return GeometryKeys.at(key); } const Projection::GCPParam & ImageMetadataBase::GetGCPParam() const @@ -68,17 +56,34 @@ const Projection::GCPParam & ImageMetadataBase::GetGCPParam() const return boost::any_cast(GeometryKeys.at(MDGeom::GCP)); } -std::string ImageMetadataBase::GetProjectionWKT() const +std::string ImageMetadataBase::GetProjectedGeometry() const { - auto projWKT = GeometryKeys.find(MDGeom::ProjectionWKT); - if (projWKT != GeometryKeys.end()) + if (this->Has(MDGeom::ProjectionWKT)) { - return boost::any_cast(projWKT->second); + // MDGeom::ProjectionWKT is a std::string stored as a boost::any + return boost::any_cast(GeometryKeys.at(MDGeom::ProjectionWKT)); } - else + else if (this->Has(MDGeom::ProjectionEPSG)) { - return ""; + // MDGeom::ProjectionEPSG is an integer stored as a boost::any + return std::to_string(boost::any_cast(GeometryKeys.at(MDGeom::ProjectionEPSG))); + } + else if (this->Has(MDGeom::ProjectionProj)) + { + // MDGeom::ProjectionProj is a std::string stored as a boost::any + return boost::any_cast(GeometryKeys.at(MDGeom::ProjectionProj)); } + else + return ""; +} + +std::string ImageMetadataBase::GetProjectionWKT() const +{ + auto theProj = this->GetProjectedGeometry(); + if (theProj.empty()) + return ""; + else + return SpatialReference::FromDescription(theProj).ToWkt(); } std::string ImageMetadataBase::GetProjectionProj() const @@ -94,12 +99,6 @@ std::string ImageMetadataBase::GetProjectionProj() const } } -// -------------------- Geom utility function ---------------------------- -const boost::any & ImageMetadataBase::operator[](const MDGeom& key) const -{ - return GeometryKeys.at(key); -} - void ImageMetadataBase::Add(const MDGeom& key, const boost::any &value) { GeometryKeys[key] = value; @@ -110,11 +109,31 @@ size_t ImageMetadataBase::Remove(const MDGeom& key) return GeometryKeys.erase(key); } +size_t ImageMetadataBase::RemoveSensorGeometry() +{ + return Remove(MDGeom::RPC) + Remove(MDGeom::SAR) + Remove(MDGeom::SensorGeometry); +} + +size_t ImageMetadataBase::RemoveProjectedGeometry() +{ + return Remove(MDGeom::ProjectionWKT) + Remove(MDGeom::ProjectionEPSG) + Remove(MDGeom::ProjectionProj); +} + bool ImageMetadataBase::Has(const MDGeom& key) const { return (GeometryKeys.find(key) != GeometryKeys.end()); } +bool ImageMetadataBase::HasSensorGeometry() const +{ + return Has(MDGeom::RPC) || Has(MDGeom::SAR) || Has(MDGeom::SensorGeometry); +} + +bool ImageMetadataBase::HasProjectedGeometry() const +{ + return Has(MDGeom::ProjectionWKT) || Has(MDGeom::ProjectionEPSG) || Has(MDGeom::ProjectionProj); +} + // -------------------- Double utility function ---------------------------- const double & ImageMetadataBase::operator[](const MDNum& key) const diff --git a/Modules/Core/Metadata/src/otbRadarsat2ImageMetadataInterface.cxx b/Modules/Core/Metadata/src/otbRadarsat2ImageMetadataInterface.cxx index 4b6454dc7a..95c6493b6e 100644 --- a/Modules/Core/Metadata/src/otbRadarsat2ImageMetadataInterface.cxx +++ b/Modules/Core/Metadata/src/otbRadarsat2ImageMetadataInterface.cxx @@ -21,6 +21,7 @@ #include "otbSarImageMetadataInterface.h" #include "otbRadarsat2ImageMetadataInterface.h" +#include "otbSARMetadata.h" #include "otbMacro.h" #include "itkMetaDataObject.h" @@ -294,4 +295,4 @@ void Radarsat2ImageMetadataInterface::Parse(const MetadataSupplierInterface & md } -} // end namespace otb \ No newline at end of file +} // end namespace otb diff --git a/Modules/Core/Metadata/src/otbTerraSarImageMetadataInterface.cxx b/Modules/Core/Metadata/src/otbTerraSarImageMetadataInterface.cxx index 753694d875..3990bbdba4 100644 --- a/Modules/Core/Metadata/src/otbTerraSarImageMetadataInterface.cxx +++ b/Modules/Core/Metadata/src/otbTerraSarImageMetadataInterface.cxx @@ -27,7 +27,7 @@ #include "itkMetaDataObject.h" #include "otbImageKeywordlist.h" #include "otbXMLMetadataSupplier.h" - +#include "otbSARMetadata.h" #include diff --git a/Modules/Core/Transform/include/otbGenericRSTransform.hxx b/Modules/Core/Transform/include/otbGenericRSTransform.hxx index af0e53080b..cdbd9ccd36 100644 --- a/Modules/Core/Transform/include/otbGenericRSTransform.hxx +++ b/Modules/Core/Transform/include/otbGenericRSTransform.hxx @@ -73,9 +73,9 @@ void GenericRSTransform::Insta { m_Transform = TransformType::New(); - if (m_InputProjectionRef.empty() && m_InputImd != nullptr && m_InputImd->Has(MDGeom::ProjectionProj)) + if (m_InputProjectionRef.empty() && m_InputImd != nullptr && m_InputImd->HasProjectedGeometry()) { - m_InputProjectionRef = boost::any_cast(m_InputImd->operator[](MDGeom::ProjectionProj)); + m_InputProjectionRef = m_InputImd->GetProjectionWKT(); } otbMsgDevMacro(<< "Information to instantiate transform: "); diff --git a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx index 8959ec2fa9..7ad6281fb1 100644 --- a/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx +++ b/Modules/Filtering/Projection/include/otbGenericRSResampleImageFilter.hxx @@ -199,7 +199,7 @@ void GenericRSResampleImageFilter::SetOutputParameter this->SetOutputStartIndex(src->GetLargestPossibleRegion().GetIndex()); this->SetOutputSize(src->GetLargestPossibleRegion().GetSize()); this->SetOutputProjectionRef(src->GetProjectionRef()); - this->GetOutput()->SetImageMetadata(src->GetImageKeywordlist()); + this->GetOutput()->SetImageMetadata(src->GetImageMetadata()); } /** @@ -215,7 +215,7 @@ void GenericRSResampleImageFilter::SetOutputParameter this->SetOutputStartIndex(image->GetLargestPossibleRegion().GetIndex()); this->SetOutputSize(image->GetLargestPossibleRegion().GetSize()); this->SetOutputProjectionRef(image->GetProjectionRef()); - this->GetOutput()->SetImageMetadata(image->GetImageKeywordlist()); + this->GetOutput()->SetImageMetadata(image->GetImageMetadata()); } /** diff --git a/Modules/Fusion/PanSharpening/include/otbSimpleRcsPanSharpeningFusionImageFilter.h b/Modules/Fusion/PanSharpening/include/otbSimpleRcsPanSharpeningFusionImageFilter.h index 56eedfdcbf..d3d3fb8a81 100644 --- a/Modules/Fusion/PanSharpening/include/otbSimpleRcsPanSharpeningFusionImageFilter.h +++ b/Modules/Fusion/PanSharpening/include/otbSimpleRcsPanSharpeningFusionImageFilter.h @@ -209,7 +209,7 @@ private: } private: - /** No data flags and values for APN image */ + /** No data flags and values for PAN image */ bool m_NoDataValuePanAvailable; typename TPanImageType::InternalPixelType m_NoDataValuePan; -- GitLab From ef228db6e00f299bed93a7377d5dbd7fa1bd3431 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Tue, 24 Nov 2020 14:44:42 +0100 Subject: [PATCH 060/123] TEST: Remove old unused test --- .../Core/Transform/test/SensorModelBorder.cxx | 244 ------------------ 1 file changed, 244 deletions(-) delete mode 100644 Modules/Core/Transform/test/SensorModelBorder.cxx diff --git a/Modules/Core/Transform/test/SensorModelBorder.cxx b/Modules/Core/Transform/test/SensorModelBorder.cxx deleted file mode 100644 index 3ce1e07783..0000000000 --- a/Modules/Core/Transform/test/SensorModelBorder.cxx +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include -#include - -#include "otbVectorImage.h" -#include "otbImageFileReader.h" -#include "otbForwardSensorModel.h" -#include "otbInverseSensorModel.h" - -// Exercise the Spot5 sensor model on the image border -int main(int argc, char* argv[]) -{ - if (argc != 3) - { - std::cout << argv[0] << " " << std::endl; - - return EXIT_FAILURE; - } - - char* filename = argv[1]; - char* outFilename = argv[2]; - - - typedef otb::VectorImage ImageType; - typedef otb::ImageFileReader ReaderType; - - otb::DEMHandler::Instance()->SetDefaultHeightAboveEllipsoid(16.19688987731934); - - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(filename); - reader->UpdateOutputInformation(); - - ImageType::Pointer image = reader->GetOutput(); - ImageType::RegionType region = image->GetLargestPossibleRegion(); - - typedef otb::ForwardSensorModel ForwardSensorModelType; - ForwardSensorModelType::Pointer forwardSensorModel = ForwardSensorModelType::New(); - forwardSensorModel->SetImageGeometry(reader->GetOutput()->GetImageKeywordlist()); - if (forwardSensorModel->IsValidSensorModel() == false) - { - std::cout << "Invalid Model pointer m_Model == NULL!\n The ossim keywordlist is invalid!" << std::endl; - return EXIT_FAILURE; - } - - typedef otb::InverseSensorModel InverseSensorModelType; - InverseSensorModelType::Pointer inverseSensorModel = InverseSensorModelType::New(); - inverseSensorModel->SetImageGeometry(reader->GetOutput()->GetImageKeywordlist()); - if (inverseSensorModel->IsValidSensorModel() == false) - { - std::cout << "Invalid Model pointer m_Model == NULL!\n The ossim keywordlist is invalid!" << std::endl; - return EXIT_FAILURE; - } - - const int radius = 10; - const double gridstep = 0.1; - - itk::Point imagePoint; - - // Test upper left corner - std::cout << " --- upper left corner ---" << std::endl; - for (imagePoint[0] = region.GetIndex(0) - radius; imagePoint[0] < region.GetIndex(0) + radius; imagePoint[0] += gridstep) - { - - for (imagePoint[1] = region.GetIndex(1) - radius; imagePoint[1] < region.GetIndex(1) + radius; imagePoint[1] += gridstep) - { - - itk::Point geoPoint; - geoPoint = forwardSensorModel->TransformPoint(imagePoint); - std::cout << "Image to geo: " << imagePoint << " -> " << geoPoint << "\n"; - - if (vnl_math_isnan(geoPoint[0]) || vnl_math_isnan(geoPoint[1])) - { - return EXIT_FAILURE; - } - - itk::Point reversedImagePoint; - reversedImagePoint = inverseSensorModel->TransformPoint(geoPoint); - - std::cout << "Geo to image: " << geoPoint << " -> " << reversedImagePoint << "\n"; - - if (vnl_math_isnan(reversedImagePoint[0]) || vnl_math_isnan(reversedImagePoint[1])) - { - return EXIT_FAILURE; - } - } - } - - // Test lower left corner - std::cout << " --- lower left corner ---" << std::endl; - for (imagePoint[0] = region.GetIndex(0) - radius; imagePoint[0] < region.GetIndex(0) + radius; imagePoint[0] += gridstep) - { - for (imagePoint[1] = region.GetIndex(1) + region.GetSize(1) - radius; imagePoint[1] < region.GetIndex(1) + region.GetSize(1) + radius; - imagePoint[1] += gridstep) - { - - itk::Point geoPoint; - geoPoint = forwardSensorModel->TransformPoint(imagePoint); - std::cout << "Image to geo: " << imagePoint << " -> " << geoPoint << "\n"; - - if (vnl_math_isnan(geoPoint[0]) || vnl_math_isnan(geoPoint[1])) - { - return EXIT_FAILURE; - } - - itk::Point reversedImagePoint; - reversedImagePoint = inverseSensorModel->TransformPoint(geoPoint); - - std::cout << "Geo to image: " << geoPoint << " -> " << reversedImagePoint << "\n"; - - if (vnl_math_isnan(reversedImagePoint[0]) || vnl_math_isnan(reversedImagePoint[1])) - { - return EXIT_FAILURE; - } - } - } - - // Test lower right corner - std::cout << " --- lower right corner ---" << std::endl; - for (imagePoint[0] = region.GetIndex(0) + region.GetSize(0) - radius; imagePoint[0] < region.GetIndex(0) + region.GetSize(0) + radius; - imagePoint[0] += gridstep) - { - for (imagePoint[1] = region.GetIndex(1) + region.GetSize(1) - radius; imagePoint[1] < region.GetIndex(1) + region.GetSize(1) + radius; - imagePoint[1] += gridstep) - { - - itk::Point geoPoint; - geoPoint = forwardSensorModel->TransformPoint(imagePoint); - std::cout << "Image to geo: " << imagePoint << " -> " << geoPoint << "\n"; - - if (vnl_math_isnan(geoPoint[0]) || vnl_math_isnan(geoPoint[1])) - { - return EXIT_FAILURE; - } - - itk::Point reversedImagePoint; - reversedImagePoint = inverseSensorModel->TransformPoint(geoPoint); - - std::cout << "Geo to image: " << geoPoint << " -> " << reversedImagePoint << "\n"; - - if (vnl_math_isnan(reversedImagePoint[0]) || vnl_math_isnan(reversedImagePoint[1])) - { - return EXIT_FAILURE; - } - } - } - - // Test upper right corner - std::cout << " --- upper right corner ---" << std::endl; - for (imagePoint[0] = region.GetIndex(0) + region.GetSize(0) - radius; imagePoint[0] < region.GetIndex(0) + region.GetSize(0) + radius; - imagePoint[0] += gridstep) - { - for (imagePoint[1] = region.GetIndex(1) - radius; imagePoint[1] < region.GetIndex(1) + radius; imagePoint[1] += gridstep) - { - - itk::Point geoPoint; - geoPoint = forwardSensorModel->TransformPoint(imagePoint); - std::cout << "Image to geo: " << imagePoint << " -> " << geoPoint << "\n"; - - if (vnl_math_isnan(geoPoint[0]) || vnl_math_isnan(geoPoint[1])) - { - return EXIT_FAILURE; - } - - itk::Point reversedImagePoint; - reversedImagePoint = inverseSensorModel->TransformPoint(geoPoint); - - std::cout << "Geo to image: " << geoPoint << " -> " << reversedImagePoint << "\n"; - - if (vnl_math_isnan(reversedImagePoint[0]) || vnl_math_isnan(reversedImagePoint[1])) - { - return EXIT_FAILURE; - } - } - } - - - // generat the output value along a segment crossing the lower image border - // at the center position - itk::Point imagePoint1; - imagePoint1[0] = region.GetIndex(0) + region.GetSize(0) / 2; - imagePoint1[1] = region.GetIndex(1) + region.GetSize(1) - radius; - - itk::Point imagePoint2; - imagePoint2[0] = region.GetIndex(0) + region.GetSize(0) / 2; - imagePoint2[1] = region.GetIndex(1) + region.GetSize(1) + radius; - - itk::Point geoPoint1, geoPoint2; - geoPoint1 = forwardSensorModel->TransformPoint(imagePoint1); - geoPoint2 = forwardSensorModel->TransformPoint(imagePoint2); - - itk::Vector geoDir; - geoDir[0] = geoPoint2[0] - geoPoint1[0]; - geoDir[1] = geoPoint2[1] - geoPoint1[1]; - - const int nbStep = 50; - itk::Vector geoStep = geoDir / nbStep; - - std::ofstream file; - file.open(outFilename); - - file << "# image_x image_y geo_x geo_y reversed_image_x reversed_image_y" << std::endl; - file << std::setprecision(15); - - for (int i = 0; i < nbStep; ++i) - { - itk::Point geoPoint; - geoPoint[0] = geoPoint1[0] + geoStep[0] * i; - geoPoint[1] = geoPoint1[1] + geoStep[1] * i; - - itk::Point reversedImagePoint; - reversedImagePoint = inverseSensorModel->TransformPoint(geoPoint); - - file << geoPoint[0] << "\t" << geoPoint[1] << "\t" << reversedImagePoint[0] << "\t" << reversedImagePoint[1] << std::endl; - - if (vnl_math_isnan(geoPoint[0]) || vnl_math_isnan(geoPoint[1])) - { - return EXIT_FAILURE; - } - } - - file.close(); - - return EXIT_SUCCESS; -} -- GitLab From 13bc27e87b39620a4077bd124331bfd8dd7fe72c Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Tue, 24 Nov 2020 14:51:15 +0100 Subject: [PATCH 061/123] TEST: Remove test related to OSSIM --- Modules/Core/Transform/test/CMakeLists.txt | 11 -- .../test/otbCreateProjectionWithOSSIM.cxx | 104 ------------------ 2 files changed, 115 deletions(-) delete mode 100644 Modules/Core/Transform/test/otbCreateProjectionWithOSSIM.cxx diff --git a/Modules/Core/Transform/test/CMakeLists.txt b/Modules/Core/Transform/test/CMakeLists.txt index 4ea81e2bf7..62f59b84af 100644 --- a/Modules/Core/Transform/test/CMakeLists.txt +++ b/Modules/Core/Transform/test/CMakeLists.txt @@ -24,7 +24,6 @@ set(OTBTransformTests otbTransformTestDriver.cxx otbGenericRSTransformWithSRID.cxx otbCreateInverseForwardSensorModel.cxx -#otbCreateProjectionWithOSSIM.cxx otbLogPolarTransformResample.cxx otbLogPolarTransform.cxx otbGeocentricTransform.cxx @@ -72,16 +71,6 @@ otb_add_test(NAME prTvTestCreateInverseForwardSensorModel_Toulouse COMMAND otbTr LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF} ) -#otb_add_test(NAME prTvTestCreateProjectionWithOSSIM_Cevennes COMMAND otbTransformTestDriver -# otbCreateProjectionWithOSSIM -# LARGEINPUT{QUICKBIRD/CEVENNES/06FEB12104912-P1BS-005533998070_01_P001.TIF} -# ) - -#otb_add_test(NAME prTvTestCreateProjectionWithOSSIM_Toulouse COMMAND otbTransformTestDriver -# otbCreateProjectionWithOSSIM -# LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF} -# ) - otb_add_test(NAME bfTvLogPolarTransformResample COMMAND otbTransformTestDriver --compare-image ${EPSILON_7} ${BASELINE}/bfLogPolarTransformResampleOutput.tif ${TEMP}/bfLogPolarTransformResampleOutput.tif diff --git a/Modules/Core/Transform/test/otbCreateProjectionWithOSSIM.cxx b/Modules/Core/Transform/test/otbCreateProjectionWithOSSIM.cxx deleted file mode 100644 index 640e6b93cc..0000000000 --- a/Modules/Core/Transform/test/otbCreateProjectionWithOSSIM.cxx +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -/*! - * - * PURPOSE: - * - * Application pour projeter une region d'une image en coordonnees geographiques - * en utilisant un Interpolator+regionextractor et un Iterator. - * - */ - -// iostream is used for general output -#include -#include -#include - -#include "otbImage.h" -#include "otbImageFileReader.h" -#include "otbImageFileWriter.h" -#include "otbImageFileWriter.h" - -#include "itkUnaryFunctorImageFilter.h" -#include "itkExtractImageFilter.h" -#include "itkRescaleIntensityImageFilter.h" -#include "itkImageRegionIteratorWithIndex.h" -#include "itkLinearInterpolateImageFunction.h" - -#include "otbInverseSensorModel.h" - -#include "otb_ossim.h" - -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-parameter" -#pragma GCC diagnostic ignored "-Woverloaded-virtual" -#pragma GCC diagnostic ignored "-Wshadow" -#include "ossim/imaging/ossimImageHandler.h" -#include "ossim/base/ossimKeywordlist.h" -#include "ossim/imaging/ossimImageHandlerRegistry.h" -#include "ossim/projection/ossimProjectionFactoryRegistry.h" -#pragma GCC diagnostic pop -#else -#include "ossim/imaging/ossimImageHandler.h" -#include "ossim/base/ossimKeywordlist.h" -#include "ossim/imaging/ossimImageHandlerRegistry.h" -#include "ossim/projection/ossimProjectionFactoryRegistry.h" -#endif - -int otbCreateProjectionWithOSSIM(int argc, char* argv[]) -{ - if (argc != 2) - { - std::cout << argv[0] << " " << std::endl; - return EXIT_FAILURE; - } - - otbGenericMsgDebugMacro(<< "Creating handler..."); - ossimImageHandler* handler = ossimImageHandlerRegistry::instance()->open(ossimFilename(argv[1])); - if (!handler) - { - itkGenericExceptionMacro(<< "Unable to open input image " << argv[1]); - } - - ossimKeywordlist geom; - otbGenericMsgDebugMacro(<< "Read ossim Keywordlist..."); - handler->getImageGeometry()->getProjection()->saveState(geom); - ossimGpt ossimGPoint(0, 0); - ossimDpt ossimDPoint; - otbGenericMsgDebugMacro(<< "Creating projection..."); - ossimProjection* model = nullptr; - model = ossimProjectionFactoryRegistry::instance()->createProjection(geom); - if (model == nullptr) - { - itkGenericExceptionMacro(<< "Invalid Model * == NULL !"); - } - - otbGenericMsgDebugMacro(<< "Creating RefPtr of projection..."); - ossimRefPtr ptrmodel = model; - if (ptrmodel.valid() == false) - { - itkGenericExceptionMacro(<< "Invalid Model pointer .valid() == false !"); - } - - return EXIT_SUCCESS; -} -- GitLab From 5fe80bc718318204626c204010b8a21d7a2b570c Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 25 Nov 2020 16:50:09 +0100 Subject: [PATCH 062/123] TEST: KO! Update the test with new RPC framework. --- .../test/otbCreateInverseForwardSensorModel.cxx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Modules/Core/Transform/test/otbCreateInverseForwardSensorModel.cxx b/Modules/Core/Transform/test/otbCreateInverseForwardSensorModel.cxx index ecc8e24fd9..792e732e03 100644 --- a/Modules/Core/Transform/test/otbCreateInverseForwardSensorModel.cxx +++ b/Modules/Core/Transform/test/otbCreateInverseForwardSensorModel.cxx @@ -42,8 +42,8 @@ int otbCreateInverseForwardSensorModel(int argc, char* argv[]) typedef otb::Image ImageType; typedef otb::ImageFileReader ReaderType; - typedef otb::RPCInverseTransform InverseRPCModelType; - typedef otb::RPCForwardTransform ForwardRPCModelType; + typedef otb::RPCInverseTransform InverseRPCModelType; + typedef otb::RPCForwardTransform ForwardRPCModelType; // Allocate pointer InverseRPCModelType::Pointer inverse_rpc_model = InverseRPCModelType::New(); @@ -84,16 +84,16 @@ int otbCreateInverseForwardSensorModel(int argc, char* argv[]) std::ofstream ofs(argv[2], std::ofstream::out); ofs.precision(8); - InverseModelType::InputPointType geoPoint; + InverseRPCModelType::InputPointType geoPoint; geoPoint[0] = atof(argv[3]); geoPoint[1] = atof(argv[4]); ofs << "Testing geopoint: " << geoPoint << "\n\n"; - auto indexPoint = inverse_model->TransformPoint(geoPoint); + auto indexPoint = inverse_rpc_model->TransformPoint(geoPoint); ofs << "Testing InverseSensorModel: " << geoPoint << " -> " << indexPoint << "\n"; - auto newGeoPoint = forward_model->TransformPoint(indexPoint); + auto newGeoPoint = forward_rpc_model->TransformPoint(indexPoint); ofs << "Testing ForwardSensorModel: " << indexPoint << " -> " << newGeoPoint << "\n"; return EXIT_SUCCESS; -- GitLab From 0758a0eb261b84c2d7d0057cdaea0008e195701b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Wed, 25 Nov 2020 18:32:00 +0100 Subject: [PATCH 063/123] BUG: add default value for DEM height when constructing RPC transforms --- Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx b/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx index 8c9e62272c..ec6a8f3531 100644 --- a/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx +++ b/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx @@ -49,7 +49,10 @@ GDALRPCTransformer::GDALRPCTransformer(double LineOffset, double SampleOffset, d auto & demHandler = otb::DEMHandler::GetInstance(); if (demHandler.GetDEMCount() > 0) + { this->SetOption("RPC_DEM", demHandler.DEM_DATASET_PATH); + this->SetOption("RPC_DEM_MISSING_VALUE", std::to_string(demHandler.GetDefaultHeightAboveEllipsoid())); + } } GDALRPCTransformer::~GDALRPCTransformer() -- GitLab From 3ba538d4f5ce4c68f767df26b6d9d3e06d8065fa Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Thu, 26 Nov 2020 11:22:02 +0100 Subject: [PATCH 064/123] FIX: Correct usage of GDALRPCTransform in RPCForward/InverseTransform --- .../prTvTestCreateInverseForwardSensorModel_Cevennes.txt | 6 +++--- .../prTvTestCreateInverseForwardSensorModel_Toulouse.txt | 6 +++--- .../Core/Transform/include/otbRPCForwardTransform.hxx | 2 +- .../Core/Transform/include/otbRPCInverseTransform.hxx | 2 +- Modules/Core/Transform/include/otbRPCTransformBase.hxx | 9 ++++----- .../test/otbCreateInverseForwardSensorModel.cxx | 3 ++- Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h | 3 ++- Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx | 3 ++- 8 files changed, 18 insertions(+), 16 deletions(-) diff --git a/Data/Baseline/OTB/Files/prTvTestCreateInverseForwardSensorModel_Cevennes.txt b/Data/Baseline/OTB/Files/prTvTestCreateInverseForwardSensorModel_Cevennes.txt index f6912a7e01..dc4ff01dc2 100644 --- a/Data/Baseline/OTB/Files/prTvTestCreateInverseForwardSensorModel_Cevennes.txt +++ b/Data/Baseline/OTB/Files/prTvTestCreateInverseForwardSensorModel_Cevennes.txt @@ -1,4 +1,4 @@ -Testing geopoint: [3.740934, 44.107956] +Testing geopoint: [3.740934, 44.107956, 0] -Testing InverseSensorModel: [3.740934, 44.107956] -> [14190.558, 13591.703] -Testing ForwardSensorModel: [14190.558, 13591.703] -> [3.7409338, 44.107956] +Testing InverseSensorModel: [3.740934, 44.107956, 0] -> [14190.558, 13591.703] +Testing ForwardSensorModel: [14190.558, 13591.703] -> [3.740934, 44.107956, 0] diff --git a/Data/Baseline/OTB/Files/prTvTestCreateInverseForwardSensorModel_Toulouse.txt b/Data/Baseline/OTB/Files/prTvTestCreateInverseForwardSensorModel_Toulouse.txt index be467ecf20..b0e52fdfa4 100644 --- a/Data/Baseline/OTB/Files/prTvTestCreateInverseForwardSensorModel_Toulouse.txt +++ b/Data/Baseline/OTB/Files/prTvTestCreateInverseForwardSensorModel_Toulouse.txt @@ -1,4 +1,4 @@ -Testing geopoint: [1.4434869, 43.604688] +Testing geopoint: [1.4434869, 43.604688, 0] -Testing InverseSensorModel: [1.4434869, 43.604688] -> [11234.662, 8124.3911] -Testing ForwardSensorModel: [11234.662, 8124.3911] -> [1.4434869, 43.604688] +Testing InverseSensorModel: [1.4434869, 43.604688, 0] -> [11234.662, 8124.3911] +Testing ForwardSensorModel: [11234.662, 8124.3911] -> [1.4434869, 43.604688, 0] diff --git a/Modules/Core/Transform/include/otbRPCForwardTransform.hxx b/Modules/Core/Transform/include/otbRPCForwardTransform.hxx index f073757f02..19da6831f7 100644 --- a/Modules/Core/Transform/include/otbRPCForwardTransform.hxx +++ b/Modules/Core/Transform/include/otbRPCForwardTransform.hxx @@ -35,7 +35,7 @@ RPCForwardTransform::Transform zePoint[1] = static_cast(point[1]); zePoint[2] = 0.0; - this->m_Transformer->ForwardTransform(zePoint); + zePoint = this->m_Transformer->ForwardTransform(zePoint); OutputPointType pOut; pOut[0] = static_cast(zePoint[0]); diff --git a/Modules/Core/Transform/include/otbRPCInverseTransform.hxx b/Modules/Core/Transform/include/otbRPCInverseTransform.hxx index 438467c97e..34efa5c6b1 100644 --- a/Modules/Core/Transform/include/otbRPCInverseTransform.hxx +++ b/Modules/Core/Transform/include/otbRPCInverseTransform.hxx @@ -36,7 +36,7 @@ RPCInverseTransform::Transform if (NInputDimensions > 2) zePoint[2] = static_cast(point[2]); - this->m_Transformer->InverseTransform(zePoint); + zePoint = this->m_Transformer->InverseTransform(zePoint); OutputPointType pOut; pOut[0] = static_cast(zePoint[0]); diff --git a/Modules/Core/Transform/include/otbRPCTransformBase.hxx b/Modules/Core/Transform/include/otbRPCTransformBase.hxx index 762bc494eb..43f481b67d 100644 --- a/Modules/Core/Transform/include/otbRPCTransformBase.hxx +++ b/Modules/Core/Transform/include/otbRPCTransformBase.hxx @@ -31,13 +31,12 @@ bool RPCTransformBase::SetMeta { if (!imd.Has(MDGeom::RPC)) return false; + const boost::any any_rpc = imd[MDGeom::RPC]; + if (any_rpc.empty()) + return false; try { - const boost::any any_rpc = imd[MDGeom::RPC]; //TODO: Segfault here. - if (any_rpc.empty()) - return false; - Projection::RPCParam newParam = boost::any_cast(imd[MDGeom::RPC]); - this->m_RPCParam = std::make_unique(newParam); + this->m_RPCParam = std::make_unique(boost::any_cast(imd[MDGeom::RPC])); } catch (boost::bad_any_cast) { diff --git a/Modules/Core/Transform/test/otbCreateInverseForwardSensorModel.cxx b/Modules/Core/Transform/test/otbCreateInverseForwardSensorModel.cxx index 792e732e03..5fb8ac950f 100644 --- a/Modules/Core/Transform/test/otbCreateInverseForwardSensorModel.cxx +++ b/Modules/Core/Transform/test/otbCreateInverseForwardSensorModel.cxx @@ -87,7 +87,8 @@ int otbCreateInverseForwardSensorModel(int argc, char* argv[]) InverseRPCModelType::InputPointType geoPoint; geoPoint[0] = atof(argv[3]); geoPoint[1] = atof(argv[4]); - + geoPoint[2] = 0.0; + ofs << "Testing geopoint: " << geoPoint << "\n\n"; auto indexPoint = inverse_rpc_model->TransformPoint(geoPoint); diff --git a/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h b/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h index 6dcd2eb26e..ba6206a02b 100644 --- a/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h +++ b/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h @@ -22,6 +22,7 @@ #include "itkPoint.h" #include "gdal_alg.h" +#include "cpl_string.h" namespace otb { @@ -206,7 +207,7 @@ private: /** The RPC model */ GDALRPCInfo m_GDALRPCInfo; /** The options */ - char ** m_Options = nullptr; + CPLStringList m_Options; /** The error allowed in the iterative solution */ double m_PixErrThreshold = 0.1; /** The transformer arguments */ diff --git a/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx b/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx index ec6a8f3531..44fda38334 100644 --- a/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx +++ b/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx @@ -59,11 +59,12 @@ GDALRPCTransformer::~GDALRPCTransformer() { if(m_TransformArg != nullptr) GDALDestroyTransformer(m_TransformArg); + CSLDestroy(m_Options); } void GDALRPCTransformer::SetOption(const std::string& Name, const std::string& Value) { - this->m_Options = CSLSetNameValue(this->m_Options, Name.c_str(), Value.c_str()); + this->m_Options = CSLSetNameValue(m_Options, Name.c_str(), Value.c_str()); this->m_Modified = true; } -- GitLab From bada974c937681dd3602e2c6a83ba39ea4be06af Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Thu, 26 Nov 2020 13:26:54 +0100 Subject: [PATCH 065/123] FIX: use char** instead of CPLStringList --- Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h b/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h index ba6206a02b..6dcd2eb26e 100644 --- a/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h +++ b/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h @@ -22,7 +22,6 @@ #include "itkPoint.h" #include "gdal_alg.h" -#include "cpl_string.h" namespace otb { @@ -207,7 +206,7 @@ private: /** The RPC model */ GDALRPCInfo m_GDALRPCInfo; /** The options */ - CPLStringList m_Options; + char ** m_Options = nullptr; /** The error allowed in the iterative solution */ double m_PixErrThreshold = 0.1; /** The transformer arguments */ -- GitLab From 0ff8a6a7c420aabe167dfcd544414a59b0dd0d21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Thu, 26 Nov 2020 17:40:24 +0100 Subject: [PATCH 066/123] BUG: initialize altitude in RPCInverseTransform --- Modules/Core/Transform/include/otbRPCInverseTransform.hxx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Modules/Core/Transform/include/otbRPCInverseTransform.hxx b/Modules/Core/Transform/include/otbRPCInverseTransform.hxx index 34efa5c6b1..470b0703e4 100644 --- a/Modules/Core/Transform/include/otbRPCInverseTransform.hxx +++ b/Modules/Core/Transform/include/otbRPCInverseTransform.hxx @@ -35,6 +35,8 @@ RPCInverseTransform::Transform zePoint[1] = static_cast(point[1]); if (NInputDimensions > 2) zePoint[2] = static_cast(point[2]); + else + zePoint[2] = 0.; zePoint = this->m_Transformer->InverseTransform(zePoint); -- GitLab From af839aff43b03b51df24d6699efea291fb3cd245 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Thu, 26 Nov 2020 17:41:22 +0100 Subject: [PATCH 067/123] BUG: use default height above ellipsoid when no DEM is set in GDALRPCTransformer --- Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx b/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx index 44fda38334..d33b5b788e 100644 --- a/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx +++ b/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx @@ -53,6 +53,10 @@ GDALRPCTransformer::GDALRPCTransformer(double LineOffset, double SampleOffset, d this->SetOption("RPC_DEM", demHandler.DEM_DATASET_PATH); this->SetOption("RPC_DEM_MISSING_VALUE", std::to_string(demHandler.GetDefaultHeightAboveEllipsoid())); } + else + { + this->SetOption("RPC_HEIGHT", std::to_string(demHandler.GetDefaultHeightAboveEllipsoid())); + } } GDALRPCTransformer::~GDALRPCTransformer() -- GitLab From a7d0bba369c0c500e3741ea2c3770294ed459dc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Fri, 27 Nov 2020 15:49:54 +0100 Subject: [PATCH 068/123] BUG: make the effective bandwidth metadata optional in WorldView2ImageMetadataInterface as it might not be present --- .../Core/Metadata/src/otbWorldView2ImageMetadataInterface.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Core/Metadata/src/otbWorldView2ImageMetadataInterface.cxx b/Modules/Core/Metadata/src/otbWorldView2ImageMetadataInterface.cxx index 96b884379a..e692dbf462 100644 --- a/Modules/Core/Metadata/src/otbWorldView2ImageMetadataInterface.cxx +++ b/Modules/Core/Metadata/src/otbWorldView2ImageMetadataInterface.cxx @@ -2202,7 +2202,7 @@ namespace // In previous version of OTB the effective bandwith was tabulated // because Ossim did not read this specific metadata. - outMetadata.effectiveBandwidth[bandName] = mds.GetAs(prefix + "effectiveBandwidth"); + outMetadata.effectiveBandwidth[bandName] = mds.GetAs(0., prefix + "effectiveBandwidth"); outMetadata.absCalFactor[bandName] = mds.GetAs(prefix + "absCalFactor"); -- GitLab From 340cfd5633e8b877db4efb2e04060016e49513e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Fri, 27 Nov 2020 15:51:00 +0100 Subject: [PATCH 069/123] BUG: set default values for uninitialized variables in GDALRPCInfo structure (min/max for longitude and latitude) --- Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx b/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx index d33b5b788e..babe2fe9d1 100644 --- a/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx +++ b/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx @@ -47,6 +47,12 @@ GDALRPCTransformer::GDALRPCTransformer(double LineOffset, double SampleOffset, d std::copy_n(SampleNum, 20, this->m_GDALRPCInfo.adfSAMP_NUM_COEFF); std::copy_n(SampleDen, 20, this->m_GDALRPCInfo.adfSAMP_DEN_COEFF); + // min/max longitude and latitude (default values) + this->m_GDALRPCInfo.dfMIN_LONG = -180.0; + this->m_GDALRPCInfo.dfMIN_LAT = -90.0; + this->m_GDALRPCInfo.dfMAX_LONG = 180.0; + this->m_GDALRPCInfo.dfMAX_LAT = 90.0; + auto & demHandler = otb::DEMHandler::GetInstance(); if (demHandler.GetDEMCount() > 0) { @@ -55,6 +61,7 @@ GDALRPCTransformer::GDALRPCTransformer(double LineOffset, double SampleOffset, d } else { + // RPC height is used as a constant height offset applied to all points in case no DEM is set. this->SetOption("RPC_HEIGHT", std::to_string(demHandler.GetDefaultHeightAboveEllipsoid())); } } -- GitLab From 34238c431c06b86cbf834f6b2ee22b0595e66f13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Sun, 29 Nov 2020 21:36:29 +0100 Subject: [PATCH 070/123] REFAC: use ImageMetadata in VectorDataProjectionFilter --- .../VectorDataProjectionExample.cxx | 2 +- .../AppEdge/app/otbLineSegmentDetection.cxx | 2 +- .../app/otbConnectedComponentSegmentation.cxx | 2 +- .../app/otbVectorDataTransform.cxx | 4 +- ...otbVectorDataIntoImageProjectionFilter.hxx | 2 +- .../include/otbVectorDataProjectionFilter.h | 41 +++++++++++-------- .../include/otbVectorDataProjectionFilter.hxx | 18 ++++---- ...ectorDataIntoImageProjectionFilterTest.cxx | 2 +- ...torDataProjectionFilterFromMapToSensor.cxx | 2 +- .../test/otbVectorDataTransformFilter.cxx | 4 +- 10 files changed, 43 insertions(+), 36 deletions(-) diff --git a/Examples/Projections/VectorDataProjectionExample.cxx b/Examples/Projections/VectorDataProjectionExample.cxx index ea8c3c99f8..06aab6e110 100644 --- a/Examples/Projections/VectorDataProjectionExample.cxx +++ b/Examples/Projections/VectorDataProjectionExample.cxx @@ -92,7 +92,7 @@ int main(int argc, char* argv[]) // Information about the target projection is retrieved directly from // the image: - vectorDataProjection->SetOutputKeywordList(imageReader->GetOutput()->GetImageKeywordlist()); + vectorDataProjection->SetOutputImageMetadata(&imageReader->GetOutput()->GetImageMetadata()); vectorDataProjection->SetOutputOrigin(imageReader->GetOutput()->GetOrigin()); vectorDataProjection->SetOutputSpacing(imageReader->GetOutput()->GetSignedSpacing()); vectorDataProjection->SetOutputProjectionRef(imageReader->GetOutput()->GetProjectionRef()); diff --git a/Modules/Applications/AppEdge/app/otbLineSegmentDetection.cxx b/Modules/Applications/AppEdge/app/otbLineSegmentDetection.cxx index 53914202da..56c3d6b629 100644 --- a/Modules/Applications/AppEdge/app/otbLineSegmentDetection.cxx +++ b/Modules/Applications/AppEdge/app/otbLineSegmentDetection.cxx @@ -172,7 +172,7 @@ private: VectorDataProjectionFilterType::Pointer vproj = VectorDataProjectionFilterType::New(); vproj->SetInput(vd); - vproj->SetInputKeywordList(GetParameterImage("in")->GetImageKeywordlist()); + vproj->SetInputImageMetadata(&GetParameterImage("in")->GetImageMetadata()); // vproj->SetInputOrigin(GetParameterImage("in")->GetOrigin()); // vproj->SetInputSpacing(GetParameterImage("in")->GetSignedSpacing()); diff --git a/Modules/Applications/AppSegmentation/app/otbConnectedComponentSegmentation.cxx b/Modules/Applications/AppSegmentation/app/otbConnectedComponentSegmentation.cxx index b11319eda7..4e6f531626 100644 --- a/Modules/Applications/AppSegmentation/app/otbConnectedComponentSegmentation.cxx +++ b/Modules/Applications/AppSegmentation/app/otbConnectedComponentSegmentation.cxx @@ -176,7 +176,7 @@ private: // Reproject VectorData in image projection m_Vproj = VectorDataProjectionFilterType::New(); m_Vproj->SetInput(m_Connected->GetFilter()->GetOutputVectorData()); - m_Vproj->SetInputKeywordList(inputImage->GetImageKeywordlist()); + m_Vproj->SetInputImageMetadata(&inputImage->GetImageMetadata()); // m_Vproj->SetInputOrigin(inputImage->GetOrigin()); // m_Vproj->SetInputSpacing(inputImage->GetSignedSpacing()); diff --git a/Modules/Applications/AppVectorUtils/app/otbVectorDataTransform.cxx b/Modules/Applications/AppVectorUtils/app/otbVectorDataTransform.cxx index 272b526252..79e45cb57b 100644 --- a/Modules/Applications/AppVectorUtils/app/otbVectorDataTransform.cxx +++ b/Modules/Applications/AppVectorUtils/app/otbVectorDataTransform.cxx @@ -148,7 +148,7 @@ private: m_VectorDataProj = VectorDataProjectionFilterType::New(); m_VectorDataProj->SetInput(vd); m_VectorDataProj->SetInputProjectionRef(vd->GetProjectionRef()); - m_VectorDataProj->SetOutputKeywordList(inImage->GetImageKeywordlist()); + m_VectorDataProj->SetOutputImageMetadata(&inImage->GetImageMetadata()); m_VectorDataProj->SetOutputProjectionRef(inImage->GetProjectionRef()); // Set up the transform @@ -174,7 +174,7 @@ private: m_ReverseVectorDataProj = VectorDataProjectionFilterType::New(); m_ReverseVectorDataProj->SetInput(m_TransformFilter->GetOutput()); m_ReverseVectorDataProj->SetOutputProjectionRef(vd->GetProjectionRef()); - m_ReverseVectorDataProj->SetInputKeywordList(inImage->GetImageKeywordlist()); + m_ReverseVectorDataProj->SetInputImageMetadata(&inImage->GetImageMetadata()); m_ReverseVectorDataProj->SetInputProjectionRef(inImage->GetProjectionRef()); // Set the output image diff --git a/Modules/Filtering/Projection/include/otbVectorDataIntoImageProjectionFilter.hxx b/Modules/Filtering/Projection/include/otbVectorDataIntoImageProjectionFilter.hxx index 7dc369726b..a69ff68198 100644 --- a/Modules/Filtering/Projection/include/otbVectorDataIntoImageProjectionFilter.hxx +++ b/Modules/Filtering/Projection/include/otbVectorDataIntoImageProjectionFilter.hxx @@ -176,7 +176,7 @@ void VectorDataIntoImageProjectionFilter::Generat if (m_InputImage->GetProjectionRef().empty() || boost::algorithm::istarts_with(m_InputImage->GetProjectionRef(), "LOCAL_CS")) { - m_VdProjFilter->SetOutputKeywordList(m_InputImage->GetImageKeywordlist()); + m_VdProjFilter->SetOutputImageMetadata(&m_InputImage->GetImageMetadata()); } else { diff --git a/Modules/Filtering/Projection/include/otbVectorDataProjectionFilter.h b/Modules/Filtering/Projection/include/otbVectorDataProjectionFilter.h index e1ef3df954..79cf867c4e 100644 --- a/Modules/Filtering/Projection/include/otbVectorDataProjectionFilter.h +++ b/Modules/Filtering/Projection/include/otbVectorDataProjectionFilter.h @@ -127,20 +127,6 @@ public: itkSetStringMacro(OutputProjectionRef); itkGetStringMacro(OutputProjectionRef); - itkGetMacro(InputKeywordList, ImageKeywordlist); - void SetInputKeywordList(const ImageKeywordlist& kwl) - { - this->m_InputKeywordList = kwl; - this->Modified(); - } - - itkGetMacro(OutputKeywordList, ImageKeywordlist); - void SetOutputKeywordList(const ImageKeywordlist& kwl) - { - this->m_OutputKeywordList = kwl; - this->Modified(); - } - /** Set the origin of the vector data. * \sa GetOrigin() */ itkSetMacro(InputOrigin, OriginType); @@ -173,6 +159,29 @@ public: itkGetConstReferenceMacro(OutputSpacing, SpacingType); + /**\name ImageMetadata accessors and mutators */ + //@{ + const ImageMetadata* GetInputImageMetadata() const + { + return m_InputImageMetadata; + } + void SetInputImageMetadata(const ImageMetadata* imd) + { + m_InputImageMetadata = imd; + this->Modified(); + } + + const ImageMetadata* GetOutputImageMetadata() const + { + return m_OutputImageMetadata; + } + void SetOutputImageMetadata(const ImageMetadata* imd) + { + m_OutputImageMetadata = imd; + this->Modified(); + } + //@} + protected: VectorDataProjectionFilter(); ~VectorDataProjectionFilter() override @@ -196,8 +205,8 @@ private: InternalTransformPointerType m_Transform; std::string m_InputProjectionRef; std::string m_OutputProjectionRef; - ImageKeywordlist m_InputKeywordList; - ImageKeywordlist m_OutputKeywordList; + const ImageMetadata* m_InputImageMetadata = nullptr; + const ImageMetadata* m_OutputImageMetadata = nullptr; SpacingType m_InputSpacing; OriginType m_InputOrigin; diff --git a/Modules/Filtering/Projection/include/otbVectorDataProjectionFilter.hxx b/Modules/Filtering/Projection/include/otbVectorDataProjectionFilter.hxx index 7297fcfad2..1153ca2d4c 100644 --- a/Modules/Filtering/Projection/include/otbVectorDataProjectionFilter.hxx +++ b/Modules/Filtering/Projection/include/otbVectorDataProjectionFilter.hxx @@ -37,8 +37,6 @@ VectorDataProjectionFilter::VectorDataProje { m_InputProjectionRef.clear(); m_OutputProjectionRef.clear(); - m_InputKeywordList.Clear(); - m_OutputKeywordList.Clear(); m_InputSpacing.Fill(1); m_InputOrigin.Fill(0); m_OutputSpacing.Fill(1); @@ -244,13 +242,18 @@ void VectorDataProjectionFilter::Instantiat m_Transform = InternalTransformType::New(); InputVectorDataPointer input = this->GetInput(); - // TODO: ImageMetadata& inputImageMetadata = input->GetImageMetadata(); + const itk::MetaDataDictionary& inputDict = input->GetMetaDataDictionary(); OutputVectorDataPointer output = this->GetOutput(); itk::MetaDataDictionary& outputDict = output->GetMetaDataDictionary(); - // TODO: m_Transform->SetInputImageMetadata(&inputImageMetadata); - // TODO: m_Transform->SetOutputImageMetadata(&(output->GetImageMetadata())); + m_Transform->SetInputImageMetadata(m_InputImageMetadata); + m_Transform->SetOutputImageMetadata(m_OutputImageMetadata); + + if (m_InputProjectionRef.empty()) + { + itk::ExposeMetaData(inputDict, MetaDataKey::ProjectionRefKey, m_InputProjectionRef); + } m_Transform->SetInputProjectionRef(m_InputProjectionRef); m_Transform->SetOutputProjectionRef(m_OutputProjectionRef); @@ -266,11 +269,6 @@ void VectorDataProjectionFilter::Instantiat m_OutputProjectionRef = m_Transform->GetOutputProjectionRef(); // If the projection information for the output is provided, propagate it - - if (m_OutputKeywordList.GetSize() != 0) - { - itk::EncapsulateMetaData(outputDict, MetaDataKey::OSSIMKeywordlistKey, m_OutputKeywordList); - } if (!m_OutputProjectionRef.empty()) { itk::EncapsulateMetaData(outputDict, MetaDataKey::ProjectionRefKey, m_OutputProjectionRef); diff --git a/Modules/Filtering/Projection/test/otbVectorDataIntoImageProjectionFilterTest.cxx b/Modules/Filtering/Projection/test/otbVectorDataIntoImageProjectionFilterTest.cxx index 36a3335abf..f37e0e15a0 100644 --- a/Modules/Filtering/Projection/test/otbVectorDataIntoImageProjectionFilterTest.cxx +++ b/Modules/Filtering/Projection/test/otbVectorDataIntoImageProjectionFilterTest.cxx @@ -221,7 +221,7 @@ int otbVectorDataIntoImageProjectionFilterCompareImplTest(int itkNotUsed(argc), vproj = VectorDataProjectionFilterType::New(); vproj->SetInput(vdextract->GetOutput()); vproj->SetInputProjectionRef(vdReader->GetOutput()->GetProjectionRef()); - vproj->SetOutputKeywordList(reader->GetOutput()->GetImageKeywordlist()); + vproj->SetOutputImageMetadata(&reader->GetOutput()->GetImageMetadata()); vproj->SetOutputProjectionRef(reader->GetOutput()->GetProjectionRef()); vproj->SetOutputOrigin(reader->GetOutput()->GetOrigin()); vproj->SetOutputSpacing(reader->GetOutput()->GetSignedSpacing()); diff --git a/Modules/Filtering/Projection/test/otbVectorDataProjectionFilterFromMapToSensor.cxx b/Modules/Filtering/Projection/test/otbVectorDataProjectionFilterFromMapToSensor.cxx index 5a77d94b12..c58269157c 100644 --- a/Modules/Filtering/Projection/test/otbVectorDataProjectionFilterFromMapToSensor.cxx +++ b/Modules/Filtering/Projection/test/otbVectorDataProjectionFilterFromMapToSensor.cxx @@ -58,7 +58,7 @@ int otbVectorDataProjectionFilterFromMapToSensor(int argc, char* argv[]) vectorDataProjection->SetInput(reader->GetOutput()); - vectorDataProjection->SetOutputKeywordList(imageReader->GetOutput()->GetImageKeywordlist()); + vectorDataProjection->SetOutputImageMetadata(&imageReader->GetOutput()->GetImageMetadata()); vectorDataProjection->SetOutputOrigin(imageReader->GetOutput()->GetOrigin()); vectorDataProjection->SetOutputSpacing(imageReader->GetOutput()->GetSignedSpacing()); diff --git a/Modules/Filtering/Projection/test/otbVectorDataTransformFilter.cxx b/Modules/Filtering/Projection/test/otbVectorDataTransformFilter.cxx index f2790fe9a6..94c0b6ce8b 100644 --- a/Modules/Filtering/Projection/test/otbVectorDataTransformFilter.cxx +++ b/Modules/Filtering/Projection/test/otbVectorDataTransformFilter.cxx @@ -56,7 +56,7 @@ int otbVectorDataTransformFilter(int itkNotUsed(argc), char* argv[]) VDProjectionFilterType::Pointer vdproj = VDProjectionFilterType::New(); vdproj->SetInput(vdreader->GetOutput()); vdproj->SetInputProjectionRef(vdreader->GetOutput()->GetProjectionRef()); - vdproj->SetOutputKeywordList(reader->GetOutput()->GetImageKeywordlist()); + vdproj->SetOutputImageMetadata(&reader->GetOutput()->GetImageMetadata()); vdproj->SetOutputProjectionRef(reader->GetOutput()->GetProjectionRef()); // Test the translation using the ApplyTransformTo @@ -78,7 +78,7 @@ int otbVectorDataTransformFilter(int itkNotUsed(argc), char* argv[]) VDProjectionFilterType::Pointer reverseVdProj = VDProjectionFilterType::New(); reverseVdProj->SetInput(transformFilter->GetOutput()); reverseVdProj->SetOutputProjectionRef(vdreader->GetOutput()->GetProjectionRef()); - reverseVdProj->SetInputKeywordList(reader->GetOutput()->GetImageKeywordlist()); + reverseVdProj->SetInputImageMetadata(&reader->GetOutput()->GetImageMetadata()); reverseVdProj->SetInputProjectionRef(reader->GetOutput()->GetProjectionRef()); // Write the vectordata -- GitLab From 0b12d5110ff40bde49d67f6b91f0dda4e14cfdd2 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Mon, 30 Nov 2020 09:59:23 +0100 Subject: [PATCH 071/123] TEST: Comment tests for RPCSolverAdapter --- .../OSSIMAdapters/test/CMakeLists.txt | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt b/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt index 711553b7f8..5d240997cf 100644 --- a/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt +++ b/Modules/Adapters/OSSIMAdapters/test/CMakeLists.txt @@ -417,32 +417,32 @@ otb_add_test(NAME uaTvDEMHandler_AboveEllipsoid_SRTM_NoGeoid_NoData COMMAND otbO 0.001 ) -otb_add_test(NAME uaTvRPCSolverAdapterNoDEMValidationTest COMMAND otbOSSIMAdaptersTestDriver - otbRPCSolverAdapterTest - LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF} - 10 0.25 0.35 - no - no - ) - -otb_add_test(NAME uaTvRPCSolverAdapterNotEnoughPointsForElevationTest COMMAND otbOSSIMAdaptersTestDriver - otbRPCSolverAdapterTest - LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF} - 5 0.25 0.35 - no - no - ) - -otb_add_test(NAME uaTvRPCSolverAdapterNotEnoughPointsTest COMMAND otbOSSIMAdaptersTestDriver - otbRPCSolverAdapterTest - LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF} - 4 0.25 0.35 - ${INPUTDATA}/DEM/srtm_directory/ - ${INPUTDATA}/DEM/egm96.grd - ) -if (OTB_DATA_USE_LARGEINPUT) - set_property(TEST uaTvRPCSolverAdapterNotEnoughPointsTest PROPERTY WILL_FAIL TRUE) -endif() +# otb_add_test(NAME uaTvRPCSolverAdapterNoDEMValidationTest COMMAND otbOSSIMAdaptersTestDriver +# otbRPCSolverAdapterTest +# LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF} +# 10 0.25 0.35 +# no +# no +# ) + +# otb_add_test(NAME uaTvRPCSolverAdapterNotEnoughPointsForElevationTest COMMAND otbOSSIMAdaptersTestDriver +# otbRPCSolverAdapterTest +# LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF} +# 5 0.25 0.35 +# no +# no +# ) + +# otb_add_test(NAME uaTvRPCSolverAdapterNotEnoughPointsTest COMMAND otbOSSIMAdaptersTestDriver +# otbRPCSolverAdapterTest +# LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF} +# 4 0.25 0.35 +# ${INPUTDATA}/DEM/srtm_directory/ +# ${INPUTDATA}/DEM/egm96.grd +# ) +# if (OTB_DATA_USE_LARGEINPUT) +# set_property(TEST uaTvRPCSolverAdapterNotEnoughPointsTest PROPERTY WILL_FAIL TRUE) +# endif() #otb_add_test(NAME uaTvRPCSolverAdapterOutGeomTest COMMAND otbOSSIMAdaptersTestDriver #--compare-ascii ${EPSILON_9} @@ -456,11 +456,11 @@ endif() #${TEMP}/uaTvRPCSolverAdapterOutGeomTest.geom #) -otb_add_test(NAME uaTvRPCSolverAdapterValidationTest COMMAND otbOSSIMAdaptersTestDriver - otbRPCSolverAdapterTest - LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF} - 10 0.25 0.35 - ${INPUTDATA}/DEM/srtm_directory/ - ${INPUTDATA}/DEM/egm96.grd - ) +# otb_add_test(NAME uaTvRPCSolverAdapterValidationTest COMMAND otbOSSIMAdaptersTestDriver +# otbRPCSolverAdapterTest +# LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF} +# 10 0.25 0.35 +# ${INPUTDATA}/DEM/srtm_directory/ +# ${INPUTDATA}/DEM/egm96.grd +# ) -- GitLab From 3dad572b8074303e8d21055f9511877bb2a597d1 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Mon, 30 Nov 2020 15:30:25 +0100 Subject: [PATCH 072/123] ENH: Remove TODO related to geom files reading in Sensor Model tests --- .../Filtering/Projection/test/otbSensorModel.cxx | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Modules/Filtering/Projection/test/otbSensorModel.cxx b/Modules/Filtering/Projection/test/otbSensorModel.cxx index b77cd3cc1f..c122b4eb04 100644 --- a/Modules/Filtering/Projection/test/otbSensorModel.cxx +++ b/Modules/Filtering/Projection/test/otbSensorModel.cxx @@ -35,6 +35,9 @@ #include "itkEuclideanDistanceMetric.h" #include "otbGeographicalDistance.h" #include "otbGenericRSTransform.h" +#include "otbImageMetadata.h" +#include "otbImageMetadataInterfaceFactory.h" +#include "otbGeomMetadataSupplier.h" #include "otbMacro.h" #if defined(__GNUC__) || defined(__clang__) @@ -178,7 +181,13 @@ int otbSensorModel(int argc, char* argv[]) // Some instantiations // ------------------- otb::ImageKeywordlist kwlist = otb::ReadGeometryFromGEOMFile(geomfilename); - otb::ImageMetadata imd; // TODO: Read metadata from GEOMFile + otb::ImageMetadata imd; + otb::GeomMetadataSupplier geomSupplier(geomfilename); + for (int loop = 0 ; loop < geomSupplier.GetNbBands() ; ++loop) + imd.Bands.emplace_back(); + otb::ImageMetadataInterfaceBase::Pointer imi = otb::ImageMetadataInterfaceFactory::CreateIMI(imd, geomSupplier); + imd = imi->GetImageMetadata(); + geomSupplier.FetchRPC(imd); if (!(kwlist.GetSize() > 0)) { @@ -188,7 +197,7 @@ int otbSensorModel(int argc, char* argv[]) if (writeBaseline) { - //TODO when reading geomfiles OK: return produceGCP(outFilename, kwlist); + return produceGCP(outFilename, imd); } typedef otb::ImageKeywordlist::KeywordlistMap KeywordlistMapType; @@ -342,7 +351,6 @@ int otbSensorModel(int argc, char* argv[]) pointsContainerType::iterator pointsIt = pointsContainer.begin(); geo3dPointsContainerType::iterator geo3dPointsIt = geo3dPointsContainer.begin(); - // for(; pointsIt!=pointsContainer.end(); ++pointsIt) while ((pointsIt != pointsContainer.end()) && (geo3dPointsIt != geo3dPointsContainer.end())) { imagePoint = *pointsIt; -- GitLab From a29012c9e1b9505931fe0106c7aea1565ec252a3 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Mon, 30 Nov 2020 15:52:30 +0100 Subject: [PATCH 073/123] TEST: Deactivate SatModel related tests until the new SarModel is implemented --- Modules/Filtering/Projection/test/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/Filtering/Projection/test/CMakeLists.txt b/Modules/Filtering/Projection/test/CMakeLists.txt index e06b1613f1..2b690e589a 100644 --- a/Modules/Filtering/Projection/test/CMakeLists.txt +++ b/Modules/Filtering/Projection/test/CMakeLists.txt @@ -65,7 +65,7 @@ set(GEOMGCP "QB/qb-1" #LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF} "ikonos/ikonos-1" #LARGEINPUT{IKONOS/BLOSSEVILLE/po_2619900_nir_0000000.tif} "rapideye/rapideye-1" #LARGEINPUT{RAPIDEYE/level1B/2008-12-25T005918_RE3_1B-NAC_397971_12345_band3.ntf} -"sentinel1/sentinel1-1" #LARGEINPUT{SENTINEL1/S1A_S6_SLC__1SSV_20150619T195043/measurement/s1a-s6-slc-vv-20150619t195043-20150619t195101-006447-00887d-001.tiff} +#"sentinel1/sentinel1-1" #LARGEINPUT{SENTINEL1/S1A_S6_SLC__1SSV_20150619T195043/measurement/s1a-s6-slc-vv-20150619t195043-20150619t195101-006447-00887d-001.tiff} TODO: Reactivate when new SARModel is implemented ) set(NEEDEDKW @@ -127,7 +127,7 @@ endforeach() #Other sensor : no keyword check set(GEOMGCP -"ers2/ers2-1" #LARGEINPUT{SAR_ERS2_SLCI_SCENE1/DAT_01.001} +#"ers2/ers2-1" #LARGEINPUT{SAR_ERS2_SLCI_SCENE1/DAT_01.001} TODO: Reactivate when new SARModel is implemented "spot5/spot5-1" #LARGEINPUT{SPOT5/TEHERAN/IMAGERY.TIF} "geoeye1/geoeye1-1" #LARGEINPUT{GEOEYE/MARCILLOLES/po_350134_bgrn_0000001.tif} ) -- GitLab From a7df51e723332490a3d0a61e17ffa1b028b977db Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Mon, 30 Nov 2020 16:05:05 +0100 Subject: [PATCH 074/123] ENH: Manage the case band_name_list not present in GEOM file --- .../Core/Metadata/src/otbGeomMetadataSupplier.cxx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Modules/Core/Metadata/src/otbGeomMetadataSupplier.cxx b/Modules/Core/Metadata/src/otbGeomMetadataSupplier.cxx index 466e69c70d..6616a15ad7 100644 --- a/Modules/Core/Metadata/src/otbGeomMetadataSupplier.cxx +++ b/Modules/Core/Metadata/src/otbGeomMetadataSupplier.cxx @@ -65,11 +65,14 @@ int GeomMetadataSupplier::GetNbBands() const ret = this->GetMetadataValue("support_data.band_name_list", hasValue); boost::algorithm::trim_if(ret, boost::algorithm::is_any_of("\" ")); - if (!hasValue) - otbGenericExceptionMacro(MissingMetadataException,<<"Missing metadata 'support_data.band_name_list'") - std::vector ret_vect; - otb::Utils::ConvertStringToVector(ret, ret_vect, "band name"); - return ret_vect.size(); + if (hasValue) + { + std::vector ret_vect; + otb::Utils::ConvertStringToVector(ret, ret_vect, "band name"); + return ret_vect.size(); + } + + return 0; } bool GeomMetadataSupplier::FetchRPC(ImageMetadata & imd) -- GitLab From c3700461f8229f04b4db46bca0a787262b863d33 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Tue, 1 Dec 2020 09:05:48 +0100 Subject: [PATCH 075/123] TEST: remove carriage returns in projection description --- .../Files/ioOtbVectorImageTestCOSMOSKYMED.txt | 22 +------------------ 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/Data/Baseline/OTB/Files/ioOtbVectorImageTestCOSMOSKYMED.txt b/Data/Baseline/OTB/Files/ioOtbVectorImageTestCOSMOSKYMED.txt index 4a92f40dd8..e3665544fb 100644 --- a/Data/Baseline/OTB/Files/ioOtbVectorImageTestCOSMOSKYMED.txt +++ b/Data/Baseline/OTB/Files/ioOtbVectorImageTestCOSMOSKYMED.txt @@ -1,27 +1,7 @@ ------ IMAGE -------- Spacing [1, 1] Origin [0.5, 0.5] -Projection REF PROJCS["Transverse_Mercator", - GEOGCS["WGS 84", - DATUM["WGS_1984", - SPHEROID["WGS 84",6378137,298.257223563, - AUTHORITY["EPSG","7030"]], - AUTHORITY["EPSG","6326"]], - PRIMEM["Greenwich",0, - AUTHORITY["EPSG","8901"]], - UNIT["degree",0.0174532925199433, - AUTHORITY["EPSG","9122"]], - AUTHORITY["EPSG","4326"]], - PROJECTION["Transverse_Mercator"], - PARAMETER["latitude_of_origin",0], - PARAMETER["central_meridian",3], - PARAMETER["scale_factor",0.9996], - PARAMETER["false_easting",500000], - PARAMETER["false_northing",0], - UNIT["metre",1, - AUTHORITY["EPSG","9001"]], - AXIS["Easting",EAST], - AXIS["Northing",NORTH]] +Projection REF PROJCS["Transverse_Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH]] GCP Projection GCP Count 0 Geo Transform -- GitLab From 32352dc35537e06723c9d4b8a367e755d3ba1a39 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Tue, 1 Dec 2020 17:34:24 +0100 Subject: [PATCH 076/123] TEXT: adapt baseline to new framework (3 coordinates instead of 2) --- .../Files/prTvTestCreateInverseForwardSensorModel_DEM.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Data/Baseline/OTB/Files/prTvTestCreateInverseForwardSensorModel_DEM.txt b/Data/Baseline/OTB/Files/prTvTestCreateInverseForwardSensorModel_DEM.txt index aea250dfdc..cc59fd57e3 100644 --- a/Data/Baseline/OTB/Files/prTvTestCreateInverseForwardSensorModel_DEM.txt +++ b/Data/Baseline/OTB/Files/prTvTestCreateInverseForwardSensorModel_DEM.txt @@ -1,4 +1,4 @@ -Testing geopoint: [1.4434869, 43.604688] +Testing geopoint: [1.4434869, 43.604688, 0] -Testing InverseSensorModel: [1.4434869, 43.604688] -> [11234.024, 8199.2289] -Testing ForwardSensorModel: [11234.024, 8199.2289] -> [1.4434838, 43.604235] +Testing InverseSensorModel: [1.4434869, 43.604688, 0] -> [11234.024, 8199.2289] +Testing ForwardSensorModel: [11234.024, 8199.2289] -> [1.4434838, 43.604235, 0] -- GitLab From fd4ce241090b2de011c2efa61fa1681371675d98 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 2 Dec 2020 11:43:20 +0100 Subject: [PATCH 077/123] TEST: Deactivate OrthoRect related tests until the new SarModel is implemented --- Modules/Filtering/Projection/test/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Filtering/Projection/test/CMakeLists.txt b/Modules/Filtering/Projection/test/CMakeLists.txt index 2b690e589a..b829994691 100644 --- a/Modules/Filtering/Projection/test/CMakeLists.txt +++ b/Modules/Filtering/Projection/test/CMakeLists.txt @@ -183,7 +183,7 @@ SPOT6/600143101-Primary-Bundle-JP2-LOSSLESS/PROD_SPOT6_001/VOL_SPOT6_001_A/IMG_S QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF IKONOS/BLOSSEVILLE/po_2619900_nir_0000000.tif RAPIDEYE/level1B/2008-12-25T005918_RE3_1B-NAC_397971_12345_band3.ntf -SENTINEL1/S1A_S6_SLC__1SSV_20150619T195043/measurement/s1a-s6-slc-vv-20150619t195043-20150619t195101-006447-00887d-001.tiff +#SENTINEL1/S1A_S6_SLC__1SSV_20150619T195043/measurement/s1a-s6-slc-vv-20150619t195043-20150619t195101-006447-00887d-001.tiff # TODO Reactivate when SARModel is implemented ) set(TOLERANCE_RATIO -- GitLab From 8f48f6bca588655bb20fb0ac073829648f4e568e Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 2 Dec 2020 14:06:26 +0100 Subject: [PATCH 078/123] ENH: Remove references to keyWordLists in otbImageToGenericRSOutputParameters --- .../otbImageToGenericRSOutputParameters.h | 2 +- .../otbImageToGenericRSOutputParameters.hxx | 2 +- .../otbImageToGenericRSOutputParameters.cxx | 33 +++++++------------ 3 files changed, 14 insertions(+), 23 deletions(-) diff --git a/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.h b/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.h index 4d8bd3450e..869ca3776a 100644 --- a/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.h +++ b/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.h @@ -23,7 +23,7 @@ #include "itkObject.h" #include "otbGenericRSTransform.h" -#include "otbImageKeywordlist.h" +#include "otbImageMetadata.h" #include namespace otb diff --git a/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.hxx b/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.hxx index 5cda8d8762..ffb61df68b 100644 --- a/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.hxx +++ b/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.hxx @@ -48,7 +48,7 @@ void ImageToGenericRSOutputParameters::Compute() if (m_Input.IsNull()) itkExceptionMacro(<< "The input is null , please set a non null input image"); - if (m_Input->GetProjectionRef().empty() && m_Input->GetImageKeywordlist().GetSize() == 0) + if (m_Input->GetProjectionRef().empty()) itkExceptionMacro(<< "No information in the metadata, please set an image with non empty metadata"); // First Call to UpdateTransform : Initialize with the input image diff --git a/Modules/Filtering/Projection/test/otbImageToGenericRSOutputParameters.cxx b/Modules/Filtering/Projection/test/otbImageToGenericRSOutputParameters.cxx index 7ad2438a90..2c34a5d33a 100644 --- a/Modules/Filtering/Projection/test/otbImageToGenericRSOutputParameters.cxx +++ b/Modules/Filtering/Projection/test/otbImageToGenericRSOutputParameters.cxx @@ -43,15 +43,6 @@ int otbImageToGenericRSOutputParameters(int itkNotUsed(argc), char* argv[]) reader->SetFileName(infname); reader->UpdateOutputInformation(); - // ForceSize - SizeType size; - size[0] = 400; - size[1] = 399; - - SpacingType spacing; - spacing[0] = 0.000006; - spacing[1] = -0.000006; - // Filter : Target SRS : WGS84 FilterType::Pointer filter = FilterType::New(); filter->SetInput(reader->GetOutput()); @@ -61,20 +52,20 @@ int otbImageToGenericRSOutputParameters(int itkNotUsed(argc), char* argv[]) // Output file std::ofstream outfile(outfname); - outfile << "Output Parameters for SRID : 4326 (WGS84)" << std::endl; - outfile << "Output Origin : " << filter->GetOutputOrigin() << std::endl; - outfile << "Output Spacing : " << filter->GetOutputSpacing() << std::endl; - outfile << "Output Size : " << filter->GetOutputSize() << std::endl; + outfile << "Output Parameters for SRID : 4326 (WGS84)\n"; + outfile << "Output Origin : " << filter->GetOutputOrigin() << "\n"; + outfile << "Output Spacing : " << filter->GetOutputSpacing() << "\n"; + outfile << "Output Size : " << filter->GetOutputSize() << "\n"; outfile << std::endl; // Target SRS : 32631 UTM 31 N filter->SetOutputProjectionRef("EPSG:32631"); // UTM 31 N filter->Compute(); - outfile << "Output Parameters for SRID : 32631 (UTM 31 N)" << std::endl; - outfile << "Output Origin : " << filter->GetOutputOrigin() << std::endl; - outfile << "Output Spacing : " << filter->GetOutputSpacing() << std::endl; - outfile << "Output Size : " << filter->GetOutputSize() << std::endl; + outfile << "Output Parameters for SRID : 32631 (UTM 31 N)\n"; + outfile << "Output Origin : " << filter->GetOutputOrigin() << "\n"; + outfile << "Output Spacing : " << filter->GetOutputSpacing() << "\n"; + outfile << "Output Size : " << filter->GetOutputSize() << "\n"; outfile << std::endl; // Target SRS : lambertII @@ -83,10 +74,10 @@ int otbImageToGenericRSOutputParameters(int itkNotUsed(argc), char* argv[]) filter->SetOutputProjectionRef(lambertRef); filter->Compute(); - outfile << "Output Parameters for SRS : Lambert II Etendu" << std::endl; - outfile << "Output Origin : " << filter->GetOutputOrigin() << std::endl; - outfile << "Output Spacing : " << filter->GetOutputSpacing() << std::endl; - outfile << "Output Size : " << filter->GetOutputSize() << std::endl; + outfile << "Output Parameters for SRS : Lambert II Etendu" << "\n"; + outfile << "Output Origin : " << filter->GetOutputOrigin() << "\n"; + outfile << "Output Spacing : " << filter->GetOutputSpacing() << "\n"; + outfile << "Output Size : " << filter->GetOutputSize() << "\n"; outfile << std::endl; -- GitLab From 0f5ec9a735c466eb854596c98284e97a50d25fb0 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 2 Dec 2020 15:28:07 +0100 Subject: [PATCH 079/123] FIX: Avoid default constructor for itk::Transform to remove a warning --- Modules/Core/Transform/include/otbSensorTransformBase.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Core/Transform/include/otbSensorTransformBase.h b/Modules/Core/Transform/include/otbSensorTransformBase.h index c53124530a..ca1607bba4 100644 --- a/Modules/Core/Transform/include/otbSensorTransformBase.h +++ b/Modules/Core/Transform/include/otbSensorTransformBase.h @@ -77,7 +77,7 @@ public: virtual bool IsValidSensorModel() const = 0; protected: - SensorTransformBase() = default; + SensorTransformBase() : Superclass(0) {} ~SensorTransformBase() = default; private: -- GitLab From 385daf67d720a1005cb05892a5aee00cace9c686 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Tue, 22 Dec 2020 14:06:45 +0100 Subject: [PATCH 080/123] BUG: increase precision of inverse RPC model --- Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx b/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx index babe2fe9d1..6a000b585f 100644 --- a/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx +++ b/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx @@ -64,6 +64,9 @@ GDALRPCTransformer::GDALRPCTransformer(double LineOffset, double SampleOffset, d // RPC height is used as a constant height offset applied to all points in case no DEM is set. this->SetOption("RPC_HEIGHT", std::to_string(demHandler.GetDefaultHeightAboveEllipsoid())); } + + this->SetOption("RPC_MAX_ITERATIONS", "40"); + this->SetOption("RPC_PIXEL_ERROR_THRESHOLD", "0.000001"); } GDALRPCTransformer::~GDALRPCTransformer() -- GitLab From 24ee6411031a40854df78de83b3bf600b7806289 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Fri, 8 Jan 2021 16:08:12 +0100 Subject: [PATCH 081/123] BUG: don't throw an exception in ImageToGenericRSOutputParameters if the input has sensor geometry --- .../Transform/include/otbImageToGenericRSOutputParameters.hxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.hxx b/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.hxx index ffb61df68b..caece7a40c 100644 --- a/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.hxx +++ b/Modules/Core/Transform/include/otbImageToGenericRSOutputParameters.hxx @@ -48,7 +48,7 @@ void ImageToGenericRSOutputParameters::Compute() if (m_Input.IsNull()) itkExceptionMacro(<< "The input is null , please set a non null input image"); - if (m_Input->GetProjectionRef().empty()) + if (!m_Input->GetImageMetadata().HasSensorGeometry() && !m_Input->GetImageMetadata().HasProjectedGeometry()) itkExceptionMacro(<< "No information in the metadata, please set an image with non empty metadata"); // First Call to UpdateTransform : Initialize with the input image -- GitLab From 21422090c14083b599c9e2ed3f67afff22ecabf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Wed, 13 Jan 2021 12:16:06 +0100 Subject: [PATCH 082/123] REFAC: use ImageMetadata in MultiDisparityMapTo3DFilter --- .../AppStereo/app/otbStereoFramework.cxx | 4 +- .../include/otbMultiDisparityMapTo3DFilter.h | 36 ++++++------ .../otbMultiDisparityMapTo3DFilter.hxx | 58 +++++++++---------- .../test/otbMultiDisparityMapTo3DFilter.cxx | 6 +- 4 files changed, 52 insertions(+), 52 deletions(-) diff --git a/Modules/Applications/AppStereo/app/otbStereoFramework.cxx b/Modules/Applications/AppStereo/app/otbStereoFramework.cxx index 6bd5d3377c..f033976303 100644 --- a/Modules/Applications/AppStereo/app/otbStereoFramework.cxx +++ b/Modules/Applications/AppStereo/app/otbStereoFramework.cxx @@ -1141,11 +1141,11 @@ private: } // transform disparity into 3D map - m_MultiDisparityTo3DFilterList[i]->SetReferenceKeywordList(inleft->GetImageKeywordlist()); + m_MultiDisparityTo3DFilterList[i]->SetReferenceImageMetadata(&(inleft->GetImageMetadata())); m_MultiDisparityTo3DFilterList[i]->SetNumberOfMovingImages(1); m_MultiDisparityTo3DFilterList[i]->SetHorizontalDisparityMapInput(0, hDispOutput2); m_MultiDisparityTo3DFilterList[i]->SetVerticalDisparityMapInput(0, vDispOutput2); - m_MultiDisparityTo3DFilterList[i]->SetMovingKeywordList(0, inright->GetImageKeywordlist()); + m_MultiDisparityTo3DFilterList[i]->SetMovingImageMetadata(0, &(inright->GetImageMetadata())); m_MultiDisparityTo3DFilterList[i]->SetDisparityMaskInput(0, translatedMaskImage); m_MultiDisparityTo3DFilterList[i]->UpdateOutputInformation(); diff --git a/Modules/Registration/DisparityMap/include/otbMultiDisparityMapTo3DFilter.h b/Modules/Registration/DisparityMap/include/otbMultiDisparityMapTo3DFilter.h index d56467748b..e73cce38a7 100644 --- a/Modules/Registration/DisparityMap/include/otbMultiDisparityMapTo3DFilter.h +++ b/Modules/Registration/DisparityMap/include/otbMultiDisparityMapTo3DFilter.h @@ -94,8 +94,6 @@ public: typedef typename PointSetType::PointsContainer PointsContainer; typedef typename PointSetType::PointDataContainer LabelContainer; - typedef otb::ImageKeywordlist ImageKeywordListType; - typedef std::map> DispMapIteratorList; typedef std::map> MaskIteratorList; @@ -126,24 +124,24 @@ public: const TResidueImage* GetResidueOutput() const; TResidueImage* GetResidueOutput(); - /** Set keywordlist of the reference image */ - void SetReferenceKeywordList(const ImageKeywordListType kwl) + /** Set ImageMetadata of the reference image */ + void SetReferenceImageMetadata(const ImageMetadata* imd) { - this->m_ReferenceKeywordList = kwl; + this->m_ReferenceImageMetadata = imd; this->Modified(); } - /** Get keywordlist of the reference image */ - const ImageKeywordListType& GetReferenceKeywordList() const + /** Get ImageMetadata of the reference image */ + const ImageMetadata* GetReferenceImageMetadata() const { - return this->m_ReferenceKeywordList; + return this->m_ReferenceImageMetadata; } - /** Set keywordlist of the moving image 'index' */ - void SetMovingKeywordList(unsigned int index, const ImageKeywordListType kwl); + /** Set ImageMetadata of the moving image 'index' */ + void SetMovingImageMetadata(unsigned int index, const ImageMetadata* imd); - /** Get keywordlist of the moving image 'index' */ - const ImageKeywordListType& GetMovingKeywordList(unsigned int index) const; + /** Get ImageMetadata of the moving image 'index' */ + const ImageMetadata* GetMovingImageMetadata(unsigned int index) const; protected: /** Constructor */ @@ -168,17 +166,19 @@ private: MultiDisparityMapTo3DFilter(const Self&) = delete; void operator=(const Self&) = delete; - /** Keywordlist of reference sensor image */ - ImageKeywordListType m_ReferenceKeywordList; - - /** Keywordlists of moving sensor images */ - std::vector m_MovingKeywordLists; - /** Reference sensor image transform */ RSTransformType::Pointer m_ReferenceToGroundTransform; /** Moving sensor image transforms */ std::vector m_MovingToGroundTransform; + + /** ImageMetadata of reference sensor image */ + const ImageMetadata* m_ReferenceImageMetadata = nullptr; + + /** ImageMetadata of moving sensor images */ + std::vector m_MovingImageMetadatas; + + }; } // end namespace otb diff --git a/Modules/Registration/DisparityMap/include/otbMultiDisparityMapTo3DFilter.hxx b/Modules/Registration/DisparityMap/include/otbMultiDisparityMapTo3DFilter.hxx index 54b6490eb8..c3139fc810 100644 --- a/Modules/Registration/DisparityMap/include/otbMultiDisparityMapTo3DFilter.hxx +++ b/Modules/Registration/DisparityMap/include/otbMultiDisparityMapTo3DFilter.hxx @@ -34,7 +34,7 @@ MultiDisparityMapTo3DFilter 3 inputs) this->SetNumberOfRequiredInputs(3); this->SetNumberOfRequiredInputs(1); - this->m_MovingKeywordLists.resize(1); + this->m_MovingImageMetadatas.resize(1); // Set the outputs this->SetNumberOfRequiredOutputs(2); @@ -53,14 +53,14 @@ void MultiDisparityMapTo3DFilter 0) { this->SetNumberOfRequiredInputs(3 * nb); - this->m_MovingKeywordLists.resize(nb); + this->m_MovingImageMetadatas.resize(nb); } } template unsigned int MultiDisparityMapTo3DFilter::GetNumberOfMovingImages() { - return this->m_MovingKeywordLists.size(); + return this->m_MovingImageMetadatas.size(); } template @@ -143,24 +143,24 @@ TResidueImage* MultiDisparityMapTo3DFilter -void MultiDisparityMapTo3DFilter::SetMovingKeywordList(unsigned int index, - const ImageKeywordListType kwl) +void MultiDisparityMapTo3DFilter::SetMovingImageMetadata(unsigned int index, + const ImageMetadata* imd) { - if (this->m_MovingKeywordLists.size() > index) + if (this->m_MovingImageMetadatas.size() > index) { - this->m_MovingKeywordLists[index] = kwl; + this->m_MovingImageMetadatas[index] = imd; } } template -const typename MultiDisparityMapTo3DFilter::ImageKeywordListType& -MultiDisparityMapTo3DFilter::GetMovingKeywordList(unsigned int index) const +const ImageMetadata* +MultiDisparityMapTo3DFilter::GetMovingImageMetadata(unsigned int index) const { - if (this->m_MovingKeywordLists.size() <= index) + if (this->m_MovingImageMetadatas.size() <= index) { - itkExceptionMacro(<< "Keywordlist index is outside the container"); + itkExceptionMacro(<< "ImageMetadata index is outside the container"); } - return this->m_MovingKeywordLists[index]; + return this->m_MovingImageMetadatas[index]; } template @@ -185,14 +185,17 @@ void MultiDisparityMapTo3DFilterSetOrigin(horizDisp->GetOrigin()); residuePtr->SetSignedSpacing(horizDisp->GetSignedSpacing()); - if (this->m_ReferenceKeywordList.GetSize() > 0) + if (this->m_ReferenceImageMetadata) { - itk::EncapsulateMetaData(outputPtr->GetMetaDataDictionary(), MetaDataKey::OSSIMKeywordlistKey, this->m_ReferenceKeywordList); - itk::EncapsulateMetaData(residuePtr->GetMetaDataDictionary(), MetaDataKey::OSSIMKeywordlistKey, this->m_ReferenceKeywordList); + auto outputmetadata = *m_ReferenceImageMetadata; + // Don't copy band metadata, as output bands are not related to input bands. + outputmetadata.Bands.clear(); + outputPtr->SetImageMetadata(outputmetadata); + residuePtr->SetImageMetadata(outputmetadata); } else { - itkExceptionMacro(<< "Reference keywordlist is missing"); + itkExceptionMacro(<< "Reference ImageMetadata is missing"); } } else @@ -264,12 +267,12 @@ void MultiDisparityMapTo3DFilterm_MovingKeywordLists.size(); ++k) + // Check moving ImageMetadata + for (unsigned int k = 0; k < this->m_MovingImageMetadatas.size(); ++k) { - if (this->m_MovingKeywordLists[k].GetSize() == 0) + if (!this->m_MovingImageMetadatas[k]) { - itkExceptionMacro(<< "Keywordlist of moving image at position " << k << " is empty"); + itkExceptionMacro(<< "ImageMetadata of moving image at position " << k << " is empty"); } } } @@ -279,16 +282,15 @@ void MultiDisparityMapTo3DFilterm_ReferenceToGroundTransform = RSTransformType::New(); - //TODO OSSIM: replace KeywordList by ImageMetadata - //this->m_ReferenceToGroundTransform->SetInputKeywordList(this->m_ReferenceKeywordList); + + this->m_ReferenceToGroundTransform->SetInputImageMetadata(this->m_ReferenceImageMetadata); this->m_ReferenceToGroundTransform->InstantiateTransform(); this->m_MovingToGroundTransform.clear(); - for (unsigned int k = 0; k < this->m_MovingKeywordLists.size(); ++k) + for (unsigned int k = 0; k < this->m_MovingImageMetadatas.size(); ++k) { RSTransformType::Pointer transfo = RSTransformType::New(); - //TODO OSSIM: replace KeywordList by ImageMetadata - //transfo->SetInputKeywordList(this->m_MovingKeywordLists[k]); + transfo->SetInputImageMetadata(this->m_MovingImageMetadatas[k]); transfo->InstantiateTransform(); this->m_MovingToGroundTransform.push_back(transfo); } @@ -310,7 +312,7 @@ void MultiDisparityMapTo3DFilterm_MovingKeywordLists.size(); ++k) + for (unsigned int k = 0; k < this->m_MovingImageMetadatas.size(); ++k) { // Iterators over horizontal disparity maps hDispIts[k] = itk::ImageRegionConstIterator(this->GetHorizontalDisparityMapInput(k), outputRegionForThread); @@ -369,7 +371,7 @@ void MultiDisparityMapTo3DFilterm_MovingKeywordLists.size(); ++k) + for (unsigned int k = 0; k < this->m_MovingImageMetadatas.size(); ++k) { // Compute the N moving lines of sight TDPointType pointAi, pointBi; @@ -388,10 +390,8 @@ void MultiDisparityMapTo3DFilterm_MovingToGroundTransform[k]->TransformPoint(currentPoint); - currentPoint[2] = altiMin; pointBi = this->m_MovingToGroundTransform[k]->TransformPoint(currentPoint); - pointSetA->SetPoint(nbPoints, pointAi); pointSetB->SetPoint(nbPoints, pointBi); pointSetA->SetPointData(nbPoints, k + 1); diff --git a/Modules/Registration/DisparityMap/test/otbMultiDisparityMapTo3DFilter.cxx b/Modules/Registration/DisparityMap/test/otbMultiDisparityMapTo3DFilter.cxx index 7524bc4387..7b3b62a24f 100644 --- a/Modules/Registration/DisparityMap/test/otbMultiDisparityMapTo3DFilter.cxx +++ b/Modules/Registration/DisparityMap/test/otbMultiDisparityMapTo3DFilter.cxx @@ -84,19 +84,19 @@ int otbMultiDisparityMapTo3DFilter(int argc, char* argv[]) vectorToListFilter2->UpdateOutputInformation(); Multi3DFilterType::Pointer multiFilter = Multi3DFilterType::New(); - multiFilter->SetReferenceKeywordList(masterReader->GetOutput()->GetImageKeywordlist()); + multiFilter->SetReferenceImageMetadata(&(masterReader->GetOutput()->GetImageMetadata())); multiFilter->SetNumberOfMovingImages(2); multiFilter->SetHorizontalDisparityMapInput(0, vectorToListFilter1->GetOutput()->GetNthElement(0)); multiFilter->SetVerticalDisparityMapInput(0, vectorToListFilter1->GetOutput()->GetNthElement(1)); multiFilter->SetDisparityMaskInput(0, mask1Reader->GetOutput()); - multiFilter->SetMovingKeywordList(0, slave1Reader->GetOutput()->GetImageKeywordlist()); + multiFilter->SetMovingImageMetadata(0, &(slave1Reader->GetOutput()->GetImageMetadata())); multiFilter->SetHorizontalDisparityMapInput(1, vectorToListFilter2->GetOutput()->GetNthElement(0)); multiFilter->SetVerticalDisparityMapInput(1, vectorToListFilter2->GetOutput()->GetNthElement(1)); multiFilter->SetDisparityMaskInput(1, mask2Reader->GetOutput()); - multiFilter->SetMovingKeywordList(1, slave2Reader->GetOutput()->GetImageKeywordlist()); + multiFilter->SetMovingImageMetadata(1, &(slave2Reader->GetOutput()->GetImageMetadata())); WriterType::Pointer writer = WriterType::New(); writer->SetInput(multiFilter->GetOutput()); -- GitLab From f651f0d9b07ef7a8a5f9487426ae890552aced08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Wed, 13 Jan 2021 12:17:47 +0100 Subject: [PATCH 083/123] BUG: use input altitudes in RPC transforms when available --- Modules/Core/Transform/include/otbRPCForwardTransform.hxx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Modules/Core/Transform/include/otbRPCForwardTransform.hxx b/Modules/Core/Transform/include/otbRPCForwardTransform.hxx index 19da6831f7..c780f2f835 100644 --- a/Modules/Core/Transform/include/otbRPCForwardTransform.hxx +++ b/Modules/Core/Transform/include/otbRPCForwardTransform.hxx @@ -33,7 +33,10 @@ RPCForwardTransform::Transform GDALRPCTransformer::PointType zePoint; zePoint[0] = static_cast(point[0]); zePoint[1] = static_cast(point[1]); - zePoint[2] = 0.0; + if (NInputDimensions > 2) + zePoint[2] = static_cast(point[2]); + else + zePoint[2] = 0.0; zePoint = this->m_Transformer->ForwardTransform(zePoint); -- GitLab From 09ea983e81772e16f32d44183af189125b69d0ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Wed, 13 Jan 2021 12:18:45 +0100 Subject: [PATCH 084/123] BUG: return output altitude in RPC transform when available --- Modules/Core/Transform/include/otbRPCInverseTransform.hxx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Modules/Core/Transform/include/otbRPCInverseTransform.hxx b/Modules/Core/Transform/include/otbRPCInverseTransform.hxx index 470b0703e4..0513c28a48 100644 --- a/Modules/Core/Transform/include/otbRPCInverseTransform.hxx +++ b/Modules/Core/Transform/include/otbRPCInverseTransform.hxx @@ -43,6 +43,10 @@ RPCInverseTransform::Transform OutputPointType pOut; pOut[0] = static_cast(zePoint[0]); pOut[1] = static_cast(zePoint[1]); + + if (NOutputDimensions > 2) + pOut[2] = static_cast(zePoint[2]); + return pOut; } -- GitLab From f3e847b5d816a29df869641217ad6ee741bfd3bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Wed, 13 Jan 2021 12:20:36 +0100 Subject: [PATCH 085/123] REFAC: create a in-memory vrt geoid+DEM file to manage elevation in GDALRPCtransformer --- Modules/IO/IOGDAL/include/otbDEMHandler.h | 10 +- Modules/IO/IOGDAL/src/otbDEMHandler.cxx | 117 +++++++++++++++++- .../IO/IOGDAL/src/otbGDALRPCTransformer.cxx | 11 +- 3 files changed, 134 insertions(+), 4 deletions(-) diff --git a/Modules/IO/IOGDAL/include/otbDEMHandler.h b/Modules/IO/IOGDAL/include/otbDEMHandler.h index 4fe01039a9..61b5d3992f 100644 --- a/Modules/IO/IOGDAL/include/otbDEMHandler.h +++ b/Modules/IO/IOGDAL/include/otbDEMHandler.h @@ -143,6 +143,8 @@ public: /** Path to the in-memory vrt */ const std::string DEM_DATASET_PATH = "/vsimem/otb_dem_dataset.vrt"; + const std::string DEM_WARPED_DATASET_PATH = "/vsimem/otb_dem_warped_dataset.vrt"; + const std::string DEM_SHIFTED_DATASET_PATH = "/vsimem/otb_dem_shifted_dataset.vrt"; protected: DEMHandler(); @@ -152,7 +154,10 @@ protected: private: DEMHandler(const Self&) = delete; - void operator=(const Self&) = delete; + void operator=(const Self&) = delete; + + void CreateShiftedDataset(); + /** List of RAII capsules on all opened DEM datasets for memory management */ std::vector m_DatasetList; @@ -162,6 +167,9 @@ private: /** Pointer to the geoid dataset */ GDALDataset* m_GeoidDS; + /** Pointer to the sifted dataset */ + GDALDataset* m_ShiftedDS; + /** Default height above elliposid, used when no DEM or geoid height is available. */ double m_DefaultHeightAboveEllipsoid; diff --git a/Modules/IO/IOGDAL/src/otbDEMHandler.cxx b/Modules/IO/IOGDAL/src/otbDEMHandler.cxx index ce049f51b6..ccb7af1a51 100644 --- a/Modules/IO/IOGDAL/src/otbDEMHandler.cxx +++ b/Modules/IO/IOGDAL/src/otbDEMHandler.cxx @@ -24,6 +24,10 @@ #include #include "gdal_utils.h" +//Warp utility +#include "gdalwarper.h" +#include "vrtdataset.h" + //TODO C++ 17 : use std::optional instead #include @@ -181,7 +185,10 @@ DEMHandler::~DEMHandler() } ClearDEMs(); + VSIUnlink(DEM_DATASET_PATH.c_str()); + VSIUnlink(DEM_WARPED_DATASET_PATH.c_str()); + VSIUnlink(DEM_SHIFTED_DATASET_PATH.c_str()); } void DEMHandler::OpenDEMFile(const std::string& path) @@ -198,7 +205,7 @@ void DEMHandler::OpenDEMFile(const std::string& path) } void DEMHandler::OpenDEMDirectory(const std::string& DEMDirectory) -{ +{ // TODO : RemoveOSSIM OssimDEMHandler::Instance()->OpenDEMDirectory(DEMDirectory); @@ -238,10 +245,15 @@ void DEMHandler::OpenDEMDirectory(const std::string& DEMDirectory) m_Dataset = static_cast(GDALOpen(DEM_DATASET_PATH.c_str(), GA_ReadOnly)); m_DEMDirectories.push_back(DEMDirectory); } + + if(m_GeoidDS) + { + CreateShiftedDataset(); + } } bool DEMHandler::OpenGeoidFile(const std::string& geoidFile) -{ +{ // TODO : RemoveOSSIM OssimDEMHandler::Instance()->OpenGeoidFile(geoidFile); @@ -260,9 +272,110 @@ bool DEMHandler::OpenGeoidFile(const std::string& geoidFile) m_GeoidFilename = geoidFile; } + if(m_Dataset) + { + CreateShiftedDataset(); + } + return pbError; } + +void DEMHandler::CreateShiftedDataset() +{ + + // WIP : no data is not handed at the moment + + double geoTransform[6]; + m_Dataset->GetGeoTransform(geoTransform); + + // Warp geoid dataset + auto warpOptions = GDALCreateWarpOptions();; + warpOptions->hSrcDS = m_GeoidDS; + //warpOptions->hDstDS = m_Dataset; + warpOptions->eResampleAlg = GRA_Bilinear; + warpOptions->eWorkingDataType = GDT_Float64; + warpOptions->nBandCount = 1; + warpOptions->panSrcBands = + (int *) CPLMalloc(sizeof(int) * warpOptions->nBandCount ); + warpOptions->panSrcBands[0] = 1; + warpOptions->panDstBands = + (int *) CPLMalloc(sizeof(int) * warpOptions->nBandCount ); + warpOptions->panDstBands[0] = 1; + + // Establish reprojection transformer. + warpOptions->pTransformerArg = + GDALCreateGenImgProjTransformer( m_GeoidDS, + GDALGetProjectionRef(m_GeoidDS), + m_Dataset, + GDALGetProjectionRef(m_Dataset), + FALSE, 0.0, 1 ); + warpOptions->pfnTransformer = GDALGenImgProjTransform; + + auto ds = static_cast (GDALCreateWarpedVRT(m_GeoidDS, + m_Dataset->GetRasterXSize(), + m_Dataset->GetRasterYSize(), + geoTransform, + warpOptions)); + +/* + auto warpedDataset = dynamic_cast(ds); + if(warpedDataset) + { + auto xmlWarpedDs= CPLSerializeXMLTree(warpedDataset->SerializeToXML(nullptr)); + std::cout << xmlWarpedDs << std::endl; + } +*/ + + ds->SetDescription(DEM_WARPED_DATASET_PATH.c_str()); + GDALClose(ds); + + GDALDriver *poDriver = (GDALDriver *) GDALGetDriverByName( "VRT" ); + GDALDataset *poVRTDS; + + poVRTDS = poDriver->Create( DEM_SHIFTED_DATASET_PATH.c_str(), m_Dataset->GetRasterXSize(), m_Dataset->GetRasterYSize(), 0, GDT_Float64, NULL ); + + poVRTDS->SetGeoTransform(geoTransform); + + poVRTDS->SetSpatialRef(m_Dataset->GetSpatialRef()); + + char** derivedBandOptions = NULL; + + derivedBandOptions = CSLAddNameValue(derivedBandOptions, "subclass", "VRTDerivedRasterBand"); + derivedBandOptions = CSLAddNameValue(derivedBandOptions, "PixelFunctionType", "sum"); + poVRTDS->AddBand(GDT_Float64, derivedBandOptions); + + GDALRasterBand *poBand = poVRTDS->GetRasterBand( 1 ); + +// TODO use std string (and boost format ?) or stream + char demVrtXml[10000]; + + sprintf( demVrtXml, + "" + " %s" + " 1" + "", + DEM_DATASET_PATH.c_str()); + + poBand->SetMetadataItem( "source_0", demVrtXml, "new_vrt_sources" ); + + + char geoidVrtXml[10000]; + + sprintf( geoidVrtXml, + "" + " %s" + " 1" + "", + DEM_WARPED_DATASET_PATH.c_str()); + + + poBand->SetMetadataItem( "source_1", geoidVrtXml, "new_vrt_sources" ); + + GDALClose(poVRTDS); +} + + double DEMHandler::GetHeightAboveEllipsoid(double lon, double lat) const { double result = 0.; diff --git a/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx b/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx index 6a000b585f..7452e165be 100644 --- a/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx +++ b/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx @@ -54,9 +54,18 @@ GDALRPCTransformer::GDALRPCTransformer(double LineOffset, double SampleOffset, d this->m_GDALRPCInfo.dfMAX_LAT = 90.0; auto & demHandler = otb::DEMHandler::GetInstance(); + if (demHandler.GetDEMCount() > 0) { - this->SetOption("RPC_DEM", demHandler.DEM_DATASET_PATH); + if (demHandler.GetGeoidFile().empty()) + { + this->SetOption("RPC_DEM", demHandler.DEM_DATASET_PATH); + } + else + { + this->SetOption("RPC_DEM", demHandler.DEM_SHIFTED_DATASET_PATH); + + } this->SetOption("RPC_DEM_MISSING_VALUE", std::to_string(demHandler.GetDefaultHeightAboveEllipsoid())); } else -- GitLab From 9df7bda1df5b8e09d236895cf133fc80c0b74cb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Wed, 13 Jan 2021 12:48:03 +0100 Subject: [PATCH 086/123] COMP: use spatial ref API compatible with GDAL 2 --- Modules/IO/IOGDAL/src/otbDEMHandler.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/IO/IOGDAL/src/otbDEMHandler.cxx b/Modules/IO/IOGDAL/src/otbDEMHandler.cxx index ccb7af1a51..64b9249ffb 100644 --- a/Modules/IO/IOGDAL/src/otbDEMHandler.cxx +++ b/Modules/IO/IOGDAL/src/otbDEMHandler.cxx @@ -337,7 +337,7 @@ void DEMHandler::CreateShiftedDataset() poVRTDS->SetGeoTransform(geoTransform); - poVRTDS->SetSpatialRef(m_Dataset->GetSpatialRef()); + poVRTDS->SetProjection(m_Dataset->GetProjectionRef()); char** derivedBandOptions = NULL; -- GitLab From 86f4a8a5f200d8a98dcbbbd99161a07ad98e0312 Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 13 Jan 2021 16:00:20 +0100 Subject: [PATCH 087/123] FIX: forgot to merge this --- Modules/Filtering/Projection/test/otbSensorModel.cxx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/Filtering/Projection/test/otbSensorModel.cxx b/Modules/Filtering/Projection/test/otbSensorModel.cxx index 62b0af1e6a..02ef9e8311 100644 --- a/Modules/Filtering/Projection/test/otbSensorModel.cxx +++ b/Modules/Filtering/Projection/test/otbSensorModel.cxx @@ -296,7 +296,8 @@ int otbSensorModel(int argc, char* argv[]) pointsContainerType::iterator pointsIt = pointsContainer.begin(); geo3dPointsContainerType::iterator geo3dPointsIt = geo3dPointsContainer.begin(); - while ((pointsIt != pointsContainer.end()) && (geo3dPointsIt != geo3dPointsContainer.end())) + pointsContainerType::iterator ossimIt = ossimContainer.begin(); + while ((pointsIt != pointsContainer.end()) && (geo3dPointsIt != geo3dPointsContainer.end()) && (ossimIt != ossimContainer.end())) { imagePoint = *pointsIt; geo3dPoint = *geo3dPointsIt; -- GitLab From c1f2bc0183782cae91caab0a1cba40bb608e2beb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Mon, 18 Jan 2021 09:23:14 +0100 Subject: [PATCH 088/123] ENH: implements an observer pattern to keep track of DEM configuration changes in GDALRPCTransformer --- Modules/IO/IOGDAL/include/otbDEMHandler.h | 42 ++++++++++++++++- .../IO/IOGDAL/include/otbGDALRPCTransformer.h | 16 ++++++- Modules/IO/IOGDAL/src/otbDEMHandler.cxx | 19 ++++++++ .../IO/IOGDAL/src/otbGDALRPCTransformer.cxx | 46 +++++++++++-------- 4 files changed, 100 insertions(+), 23 deletions(-) diff --git a/Modules/IO/IOGDAL/include/otbDEMHandler.h b/Modules/IO/IOGDAL/include/otbDEMHandler.h index 61b5d3992f..b77909b714 100644 --- a/Modules/IO/IOGDAL/include/otbDEMHandler.h +++ b/Modules/IO/IOGDAL/include/otbDEMHandler.h @@ -26,6 +26,34 @@ namespace otb { + + + +/** \class DEMObserverInterface + * + * \brief Observer design pattern to keep track of DEM configuration changes + * \ingroup OTBIOGDAL + */ +class DEMObserverInterface { + public: + virtual ~DEMObserverInterface() = default; + virtual void Update() = 0; +}; + +/** \class DEMSubjectInterface + * + * \brief Observer design pattern to keep track of DEM configuration changes + * \ingroup OTBIOGDAL + */ +class DEMSubjectInterface { + public: + virtual ~DEMSubjectInterface() = default; + virtual void AttachObserver(DEMObserverInterface *observer) = 0; + virtual void DetachObserver(DEMObserverInterface *observer) = 0; + virtual void Notify() const = 0; +}; + + /** \class DEMHandler * * \brief Single access point for DEM data retrieval @@ -67,7 +95,7 @@ namespace otb * * \ingroup OTBIOGDAL */ -class DEMHandler +class DEMHandler : public DEMSubjectInterface { public: using Self = DEMHandler; @@ -140,6 +168,16 @@ public: /** Clear the DEM list and close all DEM datasets */ void ClearDEMs(); + + /** Add an element to the current list of observers. The obsever will be updated whenever the DEM configuration + is modified*/ + void AttachObserver(DEMObserverInterface *observer) override {m_ObserverList.push_back(observer);}; + + /** Remove an element of the current list of observers. */ + void DetachObserver(DEMObserverInterface *observer) override {m_ObserverList.remove(observer);}; + + /** Update all observers */ + void Notify() const override; /** Path to the in-memory vrt */ const std::string DEM_DATASET_PATH = "/vsimem/otb_dem_dataset.vrt"; @@ -179,6 +217,8 @@ private: /** Filename of the current geoid */ std::string m_GeoidFilename; + /** Observers on the DEM */ + std::list m_ObserverList; }; } diff --git a/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h b/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h index 6dcd2eb26e..1c7357c9a5 100644 --- a/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h +++ b/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h @@ -23,6 +23,10 @@ #include "itkPoint.h" #include "gdal_alg.h" +#include "otbDEMHandler.h" + +#include + namespace otb { /** @@ -44,7 +48,7 @@ namespace otb * \ingroup OTBIOGDAL */ -class GDALRPCTransformer +class GDALRPCTransformer : public DEMObserverInterface { public: @@ -198,19 +202,27 @@ protected: * * Called when performing a transformation and some options were modified. */ - void Update(); + void Update() override; private: /** Used to know if Update is required after a change in the options */ bool m_Modified = true; + /** The RPC model */ GDALRPCInfo m_GDALRPCInfo; + /** The options */ char ** m_Options = nullptr; + /** The error allowed in the iterative solution */ double m_PixErrThreshold = 0.1; + /** The transformer arguments */ void * m_TransformArg = nullptr; + + /** Lock threads when instantiating the GDAL RPC transformer */ + std::mutex m_Mutex; + }; } #endif diff --git a/Modules/IO/IOGDAL/src/otbDEMHandler.cxx b/Modules/IO/IOGDAL/src/otbDEMHandler.cxx index 64b9249ffb..7886230cf8 100644 --- a/Modules/IO/IOGDAL/src/otbDEMHandler.cxx +++ b/Modules/IO/IOGDAL/src/otbDEMHandler.cxx @@ -202,6 +202,13 @@ void DEMHandler::OpenDEMFile(const std::string& path) GDALClose(close_me); m_Dataset = static_cast(GDALOpen(DEM_DATASET_PATH.c_str(), GA_ReadOnly)); m_DEMDirectories.push_back(path); + + if(m_GeoidDS) + { + CreateShiftedDataset(); + } + + Notify(); } void DEMHandler::OpenDEMDirectory(const std::string& DEMDirectory) @@ -250,6 +257,7 @@ void DEMHandler::OpenDEMDirectory(const std::string& DEMDirectory) { CreateShiftedDataset(); } + Notify(); } bool DEMHandler::OpenGeoidFile(const std::string& geoidFile) @@ -277,6 +285,7 @@ bool DEMHandler::OpenGeoidFile(const std::string& geoidFile) CreateShiftedDataset(); } + Notify(); return pbError; } @@ -481,6 +490,7 @@ void DEMHandler::ClearDEMs() // This will call GDALClose on all datasets m_DatasetList.clear(); + Notify(); } void DEMHandler::SetDefaultHeightAboveEllipsoid(double height) @@ -488,6 +498,7 @@ void DEMHandler::SetDefaultHeightAboveEllipsoid(double height) OssimDEMHandler::Instance()->SetDefaultHeightAboveEllipsoid(height); m_DefaultHeightAboveEllipsoid = height; + Notify(); } double DEMHandler::GetDefaultHeightAboveEllipsoid() const @@ -495,4 +506,12 @@ double DEMHandler::GetDefaultHeightAboveEllipsoid() const return m_DefaultHeightAboveEllipsoid; } +void DEMHandler::Notify() const +{ + for (const auto & observer: m_ObserverList) + { + observer->Update(); + } +}; + } // namespace otb diff --git a/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx b/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx index 7452e165be..acf786140f 100644 --- a/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx +++ b/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx @@ -53,26 +53,7 @@ GDALRPCTransformer::GDALRPCTransformer(double LineOffset, double SampleOffset, d this->m_GDALRPCInfo.dfMAX_LONG = 180.0; this->m_GDALRPCInfo.dfMAX_LAT = 90.0; - auto & demHandler = otb::DEMHandler::GetInstance(); - - if (demHandler.GetDEMCount() > 0) - { - if (demHandler.GetGeoidFile().empty()) - { - this->SetOption("RPC_DEM", demHandler.DEM_DATASET_PATH); - } - else - { - this->SetOption("RPC_DEM", demHandler.DEM_SHIFTED_DATASET_PATH); - - } - this->SetOption("RPC_DEM_MISSING_VALUE", std::to_string(demHandler.GetDefaultHeightAboveEllipsoid())); - } - else - { - // RPC height is used as a constant height offset applied to all points in case no DEM is set. - this->SetOption("RPC_HEIGHT", std::to_string(demHandler.GetDefaultHeightAboveEllipsoid())); - } + otb::DEMHandler::GetInstance().AttachObserver(this); this->SetOption("RPC_MAX_ITERATIONS", "40"); this->SetOption("RPC_PIXEL_ERROR_THRESHOLD", "0.000001"); @@ -83,6 +64,8 @@ GDALRPCTransformer::~GDALRPCTransformer() if(m_TransformArg != nullptr) GDALDestroyTransformer(m_TransformArg); CSLDestroy(m_Options); + + otb::DEMHandler::GetInstance().DetachObserver(this); } void GDALRPCTransformer::SetOption(const std::string& Name, const std::string& Value) @@ -99,6 +82,29 @@ void GDALRPCTransformer::SetPixErrThreshold(double PixErrThreshold) void GDALRPCTransformer::Update() { + // We need a lock here because Update() is not called until the first call + // to Forward/InverseTransform(), which might be done in a thread. + const std::lock_guard lock(m_Mutex); + + auto & demHandler = otb::DEMHandler::GetInstance(); + if (demHandler.GetDEMCount() > 0) + { + if (demHandler.GetGeoidFile().empty()) + { + this->SetOption("RPC_DEM", demHandler.DEM_DATASET_PATH); + } + else + { + this->SetOption("RPC_DEM", demHandler.DEM_SHIFTED_DATASET_PATH); + } + this->SetOption("RPC_DEM_MISSING_VALUE", std::to_string(demHandler.GetDefaultHeightAboveEllipsoid())); + } + else + { + // RPC height is used as a constant height offset applied to all points in case no DEM is set. + this->SetOption("RPC_HEIGHT", std::to_string(demHandler.GetDefaultHeightAboveEllipsoid())); + } + if(m_TransformArg != nullptr) GDALDestroyTransformer(m_TransformArg); this->m_TransformArg = GDALCreateRPCTransformer(&this->m_GDALRPCInfo, false, this->m_PixErrThreshold, this->m_Options); -- GitLab From 1fd0539bf4e61ee821adb195ce78e02d7c3a545f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Mon, 18 Jan 2021 12:31:11 +0100 Subject: [PATCH 089/123] BUG: don't use DEM height in RPC transform when the altitude is provided by the user --- .../Transform/include/otbRPCTransformBase.hxx | 4 ++- .../IO/IOGDAL/include/otbGDALRPCTransformer.h | 5 +++- .../IO/IOGDAL/src/otbGDALRPCTransformer.cxx | 28 +++++++++++-------- .../IOGDAL/test/otbGDALRPCTransformerTest.cxx | 2 +- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/Modules/Core/Transform/include/otbRPCTransformBase.hxx b/Modules/Core/Transform/include/otbRPCTransformBase.hxx index 43f481b67d..a49bf4416e 100644 --- a/Modules/Core/Transform/include/otbRPCTransformBase.hxx +++ b/Modules/Core/Transform/include/otbRPCTransformBase.hxx @@ -42,10 +42,12 @@ bool RPCTransformBase::SetMeta { return false; } + + constexpr bool useDEM = NInputDimensions == 2 ? true : false; this->m_Transformer = std::make_unique( m_RPCParam->LineOffset, m_RPCParam->SampleOffset, m_RPCParam->LatOffset, m_RPCParam->LonOffset, m_RPCParam->HeightOffset, m_RPCParam->LineScale, m_RPCParam->SampleScale, m_RPCParam->LatScale, m_RPCParam->LonScale, m_RPCParam->HeightScale, - m_RPCParam->LineNum, m_RPCParam->LineDen, m_RPCParam->SampleNum, m_RPCParam->SampleDen); + m_RPCParam->LineNum, m_RPCParam->LineDen, m_RPCParam->SampleNum, m_RPCParam->SampleDen, useDEM); return true; } diff --git a/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h b/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h index 1c7357c9a5..facde156b0 100644 --- a/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h +++ b/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h @@ -65,7 +65,7 @@ public: */ GDALRPCTransformer(double LineOffset, double SampleOffset, double LatOffset, double LonOffset, double HeightOffset, double LineScale, double SampleScale, double LatScale, double LonScale, double HeightScale, - const double (&LineNum)[20], const double (&LineDen)[20], const double (&SampleNum)[20], const double (&SampleDen)[20]); + const double (&LineNum)[20], const double (&LineDen)[20], const double (&SampleNum)[20], const double (&SampleDen)[20], bool useDEM); ~GDALRPCTransformer(); /** @@ -223,6 +223,9 @@ private: /** Lock threads when instantiating the GDAL RPC transformer */ std::mutex m_Mutex; + /** Use the DEM singleton in DEM computations */ + bool m_UseDEM = true; + }; } #endif diff --git a/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx b/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx index acf786140f..b118f09ce1 100644 --- a/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx +++ b/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx @@ -27,7 +27,9 @@ namespace otb { GDALRPCTransformer::GDALRPCTransformer(double LineOffset, double SampleOffset, double LatOffset, double LonOffset, double HeightOffset, double LineScale, double SampleScale, double LatScale, double LonScale, double HeightScale, - const double (&LineNum)[20], const double (&LineDen)[20], const double (&SampleNum)[20], const double (&SampleDen)[20]) + const double (&LineNum)[20], const double (&LineDen)[20], const double (&SampleNum)[20], const double (&SampleDen)[20], + bool useDEM) + : m_UseDEM(useDEM) { // Offsets this->m_GDALRPCInfo.dfLINE_OFF = LineOffset; @@ -87,22 +89,26 @@ void GDALRPCTransformer::Update() const std::lock_guard lock(m_Mutex); auto & demHandler = otb::DEMHandler::GetInstance(); - if (demHandler.GetDEMCount() > 0) + + if (m_UseDEM) { - if (demHandler.GetGeoidFile().empty()) + if (demHandler.GetDEMCount() > 0) { - this->SetOption("RPC_DEM", demHandler.DEM_DATASET_PATH); + if (demHandler.GetGeoidFile().empty()) + { + this->SetOption("RPC_DEM", demHandler.DEM_DATASET_PATH); + } + else + { + this->SetOption("RPC_DEM", demHandler.DEM_SHIFTED_DATASET_PATH); + } + this->SetOption("RPC_DEM_MISSING_VALUE", std::to_string(demHandler.GetDefaultHeightAboveEllipsoid())); } else { - this->SetOption("RPC_DEM", demHandler.DEM_SHIFTED_DATASET_PATH); + // RPC height is used as a constant height offset applied to all points in case no DEM is set. + this->SetOption("RPC_HEIGHT", std::to_string(demHandler.GetDefaultHeightAboveEllipsoid())); } - this->SetOption("RPC_DEM_MISSING_VALUE", std::to_string(demHandler.GetDefaultHeightAboveEllipsoid())); - } - else - { - // RPC height is used as a constant height offset applied to all points in case no DEM is set. - this->SetOption("RPC_HEIGHT", std::to_string(demHandler.GetDefaultHeightAboveEllipsoid())); } if(m_TransformArg != nullptr) diff --git a/Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest.cxx b/Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest.cxx index 78dd1b2af6..f50c1ac3a9 100644 --- a/Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest.cxx +++ b/Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest.cxx @@ -61,7 +61,7 @@ int otbGDALRPCTransformerTest(int itkNotUsed(argc), char* argv[]) otb::GDALRPCTransformer transformer(LineOffset, SampleOffset, LatOffset, LonOffset, HeightOffset, LineScale, SampleScale, LatScale, LonScale, HeightScale, - line_num_coeff, line_den_coeff, samp_num_coeff, samp_den_coeff); + line_num_coeff, line_den_coeff, samp_num_coeff, samp_den_coeff, true); // Test ForwardTransform std::vector x = {20.5, 20.5}; -- GitLab From 975b106b1228b5a62c92e7d07571c03e8abeb4ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Wed, 20 Jan 2021 10:38:32 +0100 Subject: [PATCH 090/123] REFAC: implement RPCSolver (adapted for ossimRPCSolver) --- .../otbGCPsToRPCSensorModelImageFilter.hxx | 3 + .../Projection/include/otbRPCSolver.h | 42 ++ .../Filtering/Projection/src/CMakeLists.txt | 1 + .../Filtering/Projection/src/otbRPCSolver.cxx | 378 ++++++++++++++++++ .../Filtering/Projection/test/CMakeLists.txt | 30 ++ .../test/otbProjectionTestDriver.cxx | 1 + .../Projection/test/otbRPCSolverTest.cxx | 184 +++++++++ 7 files changed, 639 insertions(+) create mode 100644 Modules/Filtering/Projection/include/otbRPCSolver.h create mode 100644 Modules/Filtering/Projection/src/otbRPCSolver.cxx create mode 100644 Modules/Filtering/Projection/test/otbRPCSolverTest.cxx diff --git a/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.hxx b/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.hxx index f64c770d8e..7199a52d93 100644 --- a/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.hxx +++ b/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.hxx @@ -24,6 +24,9 @@ #include "otbGCPsToRPCSensorModelImageFilter.h" #include "otbRPCSolverAdapter.h" +#include "otbRPCSolver.h" + + #include "otbGenericRSTransform.h" #include "itkMetaDataObject.h" diff --git a/Modules/Filtering/Projection/include/otbRPCSolver.h b/Modules/Filtering/Projection/include/otbRPCSolver.h new file mode 100644 index 0000000000..212067e4b1 --- /dev/null +++ b/Modules/Filtering/Projection/include/otbRPCSolver.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef otbRPCSolver_h +#define otbRPCSolver_h + +#include "itkPoint.h" +#include "otbGeometryMetadata.h" + +namespace otb +{ + namespace RPCSolver + { + using Point2DType = itk::Point; + using Point3DType = itk::Point; + using GCPType = std::pair; + using GCPsContainerType = std::vector; + + void Solve(const GCPsContainerType& gcpContainer, double& rmsError, Projection::RPCParam& outputParams); + }; + +} + + +#endif diff --git a/Modules/Filtering/Projection/src/CMakeLists.txt b/Modules/Filtering/Projection/src/CMakeLists.txt index 2cbbcba088..5b63fdaf1e 100644 --- a/Modules/Filtering/Projection/src/CMakeLists.txt +++ b/Modules/Filtering/Projection/src/CMakeLists.txt @@ -21,6 +21,7 @@ set(OTBProjection_SRC otbGeometriesProjectionFilter.cxx otbPleiadesPToXSAffineTransformCalculator.cxx + otbRPCSolver.cxx ) add_library(OTBProjection ${OTBProjection_SRC}) diff --git a/Modules/Filtering/Projection/src/otbRPCSolver.cxx b/Modules/Filtering/Projection/src/otbRPCSolver.cxx new file mode 100644 index 0000000000..9bd4fd2528 --- /dev/null +++ b/Modules/Filtering/Projection/src/otbRPCSolver.cxx @@ -0,0 +1,378 @@ +/* + * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "otbRPCSolver.h" +#include "otbMacro.h" + +#include "vnl/algo/vnl_svd.h" +#include "vnl/algo/vnl_matrix_inverse.h" + +namespace otb +{ + +const double epsilon = 1e-7; + +using PrecisionType = double; +using VectorType = vnl_vector; +using MatrixType = vnl_matrix; +using DiagonalMatrixType = vnl_diag_matrix; + +void UpdateMatrix(const VectorType & f, + const std::vector & x, + const std::vector & y, + const std::vector & z, + MatrixType & M) +{ + for(unsigned int i = 0; i < f.size(); i++) + { + M[i][0] = 1; + M[i][1] = x[i]; + M[i][2] = y[i]; + M[i][3] = z[i]; + M[i][4] = x[i]*y[i]; + M[i][5] = x[i]*z[i]; + M[i][6] = y[i]*z[i]; + M[i][7] = x[i]*x[i]; + M[i][8] = y[i]*y[i]; + M[i][9] = z[i]*z[i]; + M[i][10] = x[i]*y[i]*z[i]; + M[i][11] = x[i]*x[i]*x[i]; + M[i][12] = x[i]*y[i]*y[i]; + M[i][13] = x[i]*z[i]*z[i]; + M[i][14] = x[i]*x[i]*y[i]; + M[i][15] = y[i]*y[i]*y[i]; + M[i][16] = y[i]*z[i]*z[i]; + M[i][17] = x[i]*x[i]*z[i]; + M[i][18] = y[i]*y[i]*z[i]; + M[i][19] = z[i]*z[i]*z[i]; + M[i][20] = -f[i]*x[i]; + M[i][21] = -f[i]*y[i]; + M[i][22] = -f[i]*z[i]; + M[i][23] = -f[i]*x[i]*y[i]; + M[i][24] = -f[i]*x[i]*z[i]; + M[i][25] = -f[i]*y[i]*z[i]; + M[i][26] = -f[i]*x[i]*x[i]; + M[i][27] = -f[i]*y[i]*y[i]; + M[i][28] = -f[i]*z[i]*z[i]; + M[i][29] = -f[i]*x[i]*y[i]*z[i]; + M[i][30] = -f[i]*x[i]*x[i]*x[i]; + M[i][31] = -f[i]*x[i]*y[i]*y[i]; + M[i][32] = -f[i]*x[i]*z[i]*z[i]; + M[i][33] = -f[i]*x[i]*x[i]*y[i]; + M[i][34] = -f[i]*y[i]*y[i]*y[i]; + M[i][35] = -f[i]*y[i]*z[i]*z[i]; + M[i][36] = -f[i]*x[i]*x[i]*z[i]; + M[i][37] = -f[i]*y[i]*y[i]*z[i]; + M[i][38] = -f[i]*z[i]*z[i]*z[i]; + } +} + +void UpdateWeights(const std::vector & x, + const std::vector & y, + const std::vector & z, + const VectorType & coeff, + DiagonalMatrixType & W) +{ + std::vector row(coeff.size()); + + for(unsigned int i = 0; i < x.size(); i++) + { + W[i] = 0.; + + row[0] = 1; + row[1] = x[i]; + row[2] = y[i]; + row[3] = z[i]; + row[4] = x[i]*y[i]; + row[5] = x[i]*z[i]; + row[6] = y[i]*z[i]; + row[7] = x[i]*x[i]; + row[8] = y[i]*y[i]; + row[9] = z[i]*z[i]; + row[10] = x[i]*y[i]*z[i]; + row[11] = x[i]*x[i]*x[i]; + row[12] = x[i]*y[i]*y[i]; + row[13] = x[i]*z[i]*z[i]; + row[14] = x[i]*x[i]*y[i]; + row[15] = y[i]*y[i]*y[i]; + row[16] = y[i]*z[i]*z[i]; + row[17] = x[i]*x[i]*z[i]; + row[18] = y[i]*y[i]*z[i]; + row[19] = z[i]*z[i]*z[i]; + + for (unsigned int j =0; j < row.size(); j++) + { + W[i] += row[j]*coeff[j]; + } + + if(W[i] > epsilon) + { + W[i] = 1.0/W[i]; + } + } +} + +void computeCoefficients(const std::vector & f, + const std::vector & x, + const std::vector & y, + const std::vector & z, + std::vector & outCoeffs) +{ + auto numberOfPoints = f.size(); + + // Iteratively reweighted least square + + MatrixType M(numberOfPoints, 39); + VectorType r(numberOfPoints, numberOfPoints, f.data()); + DiagonalMatrixType weights(numberOfPoints, 1.); + + double res = std::numeric_limits::max(); + VectorType coeffs; + + int i =0; + while (res > epsilon && i < 10) + { + auto w2 = weights * weights; + + UpdateMatrix(r, x, y ,z ,M); + + vnl_svd svd(M.transpose()*w2*M); + + auto diag = svd.W(); + for (unsigned int idx = 0; idx < diag.size(); idx++) + { + if(diag[idx] > epsilon) + { + diag[idx] = 1.0/diag[idx]; + } + else + { + diag[idx] = 0.0; + } + } + + coeffs = svd.V() * diag * svd.U().transpose() * M.transpose()*w2*r; + + auto denominator = VectorType(&(coeffs[19]), 20); + denominator[0] = 1; + + UpdateWeights( x, y ,z , denominator, weights); + + // compute the residual + auto residual = M.transpose()*w2*(M*coeffs-r); + + auto residualValue = inner_product(residual,residual); + i++; + } + + outCoeffs.resize(coeffs.size()); + std::copy(coeffs.begin(), coeffs.end(), outCoeffs.begin()); +} + + + + + + +void RPCSolver::Solve(const GCPsContainerType& gcpContainer, double& rmsError, Projection::RPCParam& outputParams) +{ + // By default, use elevation provided with ground control points + bool useElevation = true; + auto numberOfPoints = gcpContainer.size(); + + std::vector colNorm; + colNorm.reserve(numberOfPoints); + + std::vector lineNorm; + lineNorm.reserve(numberOfPoints); + + std::vector lonNorm; + lonNorm.reserve(numberOfPoints); + + std::vector latNorm; + latNorm.reserve(numberOfPoints); + + std::vector altNorm; + altNorm.reserve(numberOfPoints); + + // Check for enough points + if (numberOfPoints < 20) + { + itkGenericExceptionMacro(<< "At least 20 points are required to estimate the 40 parameters of a RPC model without elevation support, and 40 are required " + "to estimate the 80 parameters of a RPC model with elevation support. Only " + << numberOfPoints << " points were given."); + } + + // If not enough points are given for a proper estimation of RPC + // with elevation support, disable elevation. This will result in + // all coefficients related to elevation set to zero. + if (numberOfPoints < 40) + { + otbGenericWarningMacro("Only " << numberOfPoints << " ground control points are provided, can not estimate a RPC model with elevation support (at " + "least 40 points required). Elevation support will be disabled for RPC estimation. All " + "coefficients related to elevation will be set to zero, and elevation will have no effect on the " + "resulting transform."); + useElevation = false; + } + + // Compute Offsets + + // Find the ground points center of mass + double accLat = 0.; + double accLon = 0.; + double accAlt = 0.; + + for (const auto & gcp : gcpContainer) + { + const auto & groundPoint = gcp.second; + + accLon += groundPoint[0]; + accLat += groundPoint[1]; + if (useElevation) + { + accAlt += groundPoint[2]; + } + } + + Point3DType groundCenter; + groundCenter[0] = accLon / numberOfPoints; + groundCenter[1] = accLat /numberOfPoints; + groundCenter[2] = useElevation ? accAlt / numberOfPoints : 0.; + + + double minc = std::numeric_limits::max(); + double minl = std::numeric_limits::max(); + double maxc = std::numeric_limits::min(); + double maxl = std::numeric_limits::min(); + + for (const auto & gcp : gcpContainer) + { + const auto & imagePoint = gcp.first; + + minc = std::min(imagePoint[0], minl); + maxc = std::max(imagePoint[0], maxc); + + minl = std::min(imagePoint[1], minl); + maxl = std::max(imagePoint[1], maxl); + } + + Point2DType imageCenter; + imageCenter[0] = (minc + maxc -1)/2.0; + imageCenter[1] = (minl + maxl -1)/2.0; + + auto height = std::abs(minl - maxl) +1; + auto width = std::abs(minc - maxc) +1; + + double maxDeltaLon = std::numeric_limits::min(); + double maxDeltaLat = std::numeric_limits::min(); + double maxDeltaAlt = std::numeric_limits::min(); + + for (const auto & gcp : gcpContainer) + { + const auto & imagePoint = gcp.first; + const auto & groundPoint = gcp.second; + auto deltaLon = groundPoint[0] - groundCenter[0]; + auto deltaLat = groundPoint[1] - groundCenter[1]; + auto deltaAlt = useElevation ? groundPoint[2] - groundCenter[2] : 0.; + auto alt = useElevation ? groundPoint[2] : 0.; + + maxDeltaLon = std::max(maxDeltaLon, std::abs(deltaLon)); + maxDeltaLat = std::max(maxDeltaLat, std::abs(deltaLat)); + maxDeltaAlt = std::max(maxDeltaAlt, std::abs(alt)); + + colNorm.push_back( (imagePoint[0]- imageCenter[0] -0.5) / width * 2.); + lineNorm.push_back( (imagePoint[1]- imageCenter[1] -0.5)/ height * 2.); + lonNorm.push_back(deltaLon); + latNorm.push_back(deltaLat); + altNorm.push_back(deltaAlt); + } + + if(maxDeltaLat < 1.0) + { + maxDeltaLat = 1.0; + } + + if(maxDeltaLon < 1.0) + { + maxDeltaLon = 1.0; + } + + if(fabs(maxDeltaAlt) < epsilon) + { + maxDeltaAlt = false; + } + + if(maxDeltaAlt < 1.0) + { + maxDeltaAlt = 1.0; + } + + // Normalize ground coordinates + for (auto & lon: lonNorm) + { + lon /= maxDeltaLon; + } + for (auto & lat: latNorm) + { + lat /= maxDeltaLat; + } + for (auto & alt: altNorm) + { + alt /= maxDeltaAlt; + } + + std::vector colCoeffs; + computeCoefficients(colNorm, lonNorm, latNorm, altNorm, colCoeffs); + + std::vector lineCoeffs; + computeCoefficients(lineNorm, lonNorm, latNorm, altNorm, lineCoeffs); + + // Offsets + outputParams.SampleOffset = imageCenter[0]; + outputParams.LineOffset = imageCenter[1]; + outputParams.LonOffset = groundCenter[0]; + outputParams.LatOffset = groundCenter[1]; + outputParams.HeightOffset = groundCenter[2]; + + // Scales + outputParams.SampleScale = width/2.0; + outputParams.LineScale = height/2.0; + outputParams.LatScale = maxDeltaLat; + outputParams.LonScale = maxDeltaLon; + outputParams.HeightScale = maxDeltaAlt; + + // Line numerator coefficients + std::copy(lineCoeffs.begin(), lineCoeffs.begin() +20, outputParams.LineNum); + // Line denominator coefficients + outputParams.LineDen[0] = 1.; + std::copy(lineCoeffs.begin()+20, lineCoeffs.end(), outputParams.LineDen +1); + + // Sample numerator coefficients + std::copy(colCoeffs.begin(), colCoeffs.begin() +20, outputParams.SampleNum); + // Sample denominator coefficients + outputParams.SampleDen[0] = 1.; + std::copy(colCoeffs.begin()+20, colCoeffs.end(), outputParams.SampleDen +1); + + // TODO instantiate a model a compute error on input tie points + rmsError = std::numeric_limits::max(); + +} + +} \ No newline at end of file diff --git a/Modules/Filtering/Projection/test/CMakeLists.txt b/Modules/Filtering/Projection/test/CMakeLists.txt index b829994691..0ff1a36bdd 100644 --- a/Modules/Filtering/Projection/test/CMakeLists.txt +++ b/Modules/Filtering/Projection/test/CMakeLists.txt @@ -55,6 +55,7 @@ otbGeometriesProjectionFilterFromMapToImage.cxx otbGeometriesProjectionFilterFromMapToEPSG.cxx otbVectorDataProjectionFilter.cxx otbImportGeoInformationImageFilter.cxx +otbRPCSolverTest.cxx ) @@ -581,6 +582,35 @@ otb_add_test(NAME prTvLeastSquareAffineTransformEstimator COMMAND otbProjectionT 352 807 919 10023 12102 14181 ) + +otb_add_test(NAME uaTvRPCSolverNoDEMValidationTest COMMAND otbProjectionTestDriver + otbRPCSolverTest + LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF} + 10 0.25 0.35 + no + no + ) + +otb_add_test(NAME uaTvRPCSolverNotEnoughPointsForElevationTest COMMAND otbProjectionTestDriver + otbRPCSolverTest + LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF} + 5 0.25 0.35 + no + no + ) + +otb_add_test(NAME uaTvRPCSolverNotEnoughPointsTest COMMAND otbProjectionTestDriver + otbRPCSolverTest + LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF} + 4 0.25 0.35 + ${INPUTDATA}/DEM/srtm_directory/ + ${INPUTDATA}/DEM/egm96.grd + ) +if (OTB_DATA_USE_LARGEINPUT) + set_property(TEST uaTvRPCSolverNotEnoughPointsTest PROPERTY WILL_FAIL TRUE) +endif() + + set(VALID_CONDITION err=12) if(OTB_OSSIM_VERSION LESS 20200) set(VALID_CONDITION err=10) diff --git a/Modules/Filtering/Projection/test/otbProjectionTestDriver.cxx b/Modules/Filtering/Projection/test/otbProjectionTestDriver.cxx index 121e3f3355..0405c730d2 100644 --- a/Modules/Filtering/Projection/test/otbProjectionTestDriver.cxx +++ b/Modules/Filtering/Projection/test/otbProjectionTestDriver.cxx @@ -56,4 +56,5 @@ void RegisterTests() REGISTER_TEST(otbVectorDataProjectionFilter); REGISTER_TEST(otbTileMapTransform); REGISTER_TEST(otbImportGeoInformationImageFilter); + REGISTER_TEST(otbRPCSolverTest); } diff --git a/Modules/Filtering/Projection/test/otbRPCSolverTest.cxx b/Modules/Filtering/Projection/test/otbRPCSolverTest.cxx new file mode 100644 index 0000000000..d29976c75c --- /dev/null +++ b/Modules/Filtering/Projection/test/otbRPCSolverTest.cxx @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "otbRPCSolver.h" +#include "otbDEMHandler.h" +#include "otbImageFileReader.h" +#include "otbGenericRSTransform.h" +#include "otbGeographicalDistance.h" +#include "itkEuclideanDistanceMetric.h" + +int otbRPCSolverTest(int argc, char* argv[]) +{ + using ImageType = otb::Image; + using ReaderType = otb::ImageFileReader; + using RSTranformType = otb::GenericRSTransform<>; + using Point2DType = otb::RPCSolver::Point2DType; + using Point3DType = otb::RPCSolver::Point3DType; + using RSTranform3dType = otb::GenericRSTransform; + using EuclideanDistanceMetricType = itk::Statistics::EuclideanDistanceMetric; + using GeoDistanceType = otb::GeographicalDistance; + + + if (argc < 7) + { + std::cout << "Usage: test_driver input grid_size geo_tol img_tol dem_dir geoid" << std::endl; + return EXIT_FAILURE; + } + + // This test takes a sensor model (possibly a rpc one), use it to + // generate gcps and estimate a rpc model. It then checks the + // precision of both forward and inverse transform + const std::string infname = argv[1]; + const unsigned int gridSize = atoi(argv[2]); + const double geoTol = atof(argv[3]); + const double imgTol = atof(argv[4]); + const std::string demdir = argv[5]; + const std::string geoid = argv[6]; + + if (gridSize == 0) + { + std::cerr << "Grid size is null!" << std::endl; + return EXIT_FAILURE; + } + + std::cout << "GeoTol: " << geoTol << " meters" << std::endl; + std::cout << "ImgTol: " << imgTol << " pixels" << std::endl; + + auto& demHandler = otb::DEMHandler::GetInstance(); + demHandler.SetDefaultHeightAboveEllipsoid(0); + if (demdir != "no") + demHandler.OpenDEMDirectory(demdir); + if (geoid != "no") + demHandler.OpenGeoidFile(geoid); + + ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(infname); + reader->UpdateOutputInformation(); + + RSTranformType::Pointer fwd2dTransform = RSTranformType::New(); + + fwd2dTransform->SetInputImageMetadata(&(reader->GetOutput()->GetImageMetadata())); + fwd2dTransform->InstantiateTransform(); + + + ImageType::SizeType size = reader->GetOutput()->GetLargestPossibleRegion().GetSize(); + + unsigned int stepx = size[0] / gridSize; + unsigned int stepy = size[1] / gridSize; + + otb::RPCSolver::GCPsContainerType gcps; + + // Generate gcps + for (unsigned int i = 0; i < gridSize; ++i) + { + for (unsigned int j = 0; j < gridSize; ++j) + { + ImageType::IndexType currentIndex; + currentIndex[0] = i * stepx; + currentIndex[1] = j * stepy; + + Point2DType currentPoint, currentWgs84Point; + reader->GetOutput()->TransformIndexToPhysicalPoint(currentIndex, currentPoint); + + currentWgs84Point = fwd2dTransform->TransformPoint(currentPoint); + + double height = demHandler.GetHeightAboveEllipsoid(currentWgs84Point); + + Point3DType current3DWgs84Point; + current3DWgs84Point[0] = currentWgs84Point[0]; + current3DWgs84Point[1] = currentWgs84Point[1]; + current3DWgs84Point[2] = height; + + gcps.push_back(std::make_pair(currentPoint, current3DWgs84Point)); + + } + } + + double rmse; + otb::Projection::RPCParam params; + + otb::RPCSolver::Solve(gcps, rmse, params); + + auto outputMetadata = reader->GetOutput()->GetImageMetadata(); + + outputMetadata.Add(otb::MDGeom::RPC, params); + + // Build forward and inverse rpc transform + RSTranform3dType::Pointer rpcFwdTransform = RSTranform3dType::New(); + rpcFwdTransform->SetInputImageMetadata(&outputMetadata); + rpcFwdTransform->InstantiateTransform(); + RSTranformType::Pointer rpcInvTransform = RSTranformType::New(); + rpcInvTransform->SetOutputImageMetadata(&outputMetadata); + rpcInvTransform->InstantiateTransform(); + + EuclideanDistanceMetricType::Pointer euclideanDistanceMetric = EuclideanDistanceMetricType::New(); + GeoDistanceType::Pointer geoDistance = GeoDistanceType::New(); + + bool fail = false; + + for (auto it = gcps.begin(); it != gcps.end(); ++it) + { + Point2DType imgPoint, groundPoint, groundPoint2dRef; + Point3DType imgPoint3D, groundPoint3D; + + groundPoint2dRef[0] = it->second[0]; + groundPoint2dRef[1] = it->second[1]; + + // Check forward transform + imgPoint3D[0] = it->first[0]; + imgPoint3D[1] = it->first[1]; + imgPoint3D[2] = it->second[2]; + + groundPoint3D = rpcFwdTransform->TransformPoint(imgPoint3D); + + groundPoint[0] = groundPoint3D[0]; + groundPoint[1] = groundPoint3D[1]; + + double groundRes = geoDistance->Evaluate(groundPoint, groundPoint2dRef); + + if (groundRes > geoTol) + { + fail = true; + std::cerr << "Imprecise result with forward estimated model: fwd(" << it->first << ") = " << groundPoint << ", but reference is " << groundPoint2dRef + << " error: " << groundRes << " meters)" << std::endl; + } + + // Check inverse transform + imgPoint = rpcInvTransform->TransformPoint(groundPoint2dRef); + + double imgRes = euclideanDistanceMetric->Evaluate(imgPoint, it->first); + + if (imgRes > imgTol) + { + fail = true; + std::cerr << "Imprecise result with inverse estimated model: inv(" << groundPoint2dRef << ") = " << imgPoint << ", but reference is " << it->first + << " error: " << imgRes << " pixels)" << std::endl; + } + } + + + if (fail) + { + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} -- GitLab From 18f1f22dbbc697cc89b1a898247aae68584ac6ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Wed, 20 Jan 2021 10:43:44 +0100 Subject: [PATCH 091/123] DOC: add documentation for RPCSolver::Solve --- Modules/Filtering/Projection/include/otbRPCSolver.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Modules/Filtering/Projection/include/otbRPCSolver.h b/Modules/Filtering/Projection/include/otbRPCSolver.h index 212067e4b1..0f79525d8c 100644 --- a/Modules/Filtering/Projection/include/otbRPCSolver.h +++ b/Modules/Filtering/Projection/include/otbRPCSolver.h @@ -33,6 +33,15 @@ namespace otb using GCPType = std::pair; using GCPsContainerType = std::vector; + /** Solve RPC modelling from a set of GCPs and image bounds. + * The estimated RPC model is written in a RPCParam structure that can + * for instance be added to an ImageMetadata object. + * Please note that at least 20 points are required to estimate the + * RPC model. Between 20 and 40 points, the estimated model will + * not provide elevation support, since there are not enough points + * to estimate all the coefficients. Starting at 40 points, a full + * RPC model is estimated. + */ void Solve(const GCPsContainerType& gcpContainer, double& rmsError, Projection::RPCParam& outputParams); }; -- GitLab From 14dc9359a3970793ce9ba5205c976e3c2a5209df Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 20 Jan 2021 16:45:45 +0100 Subject: [PATCH 092/123] [TEST] Add new validation test for GDALRPCTransformer --- Data/Input/QB/qb-1.gcp2 | 901 ++++++++++++++++++ Data/Input/ikonos/ikonos-1.gcp2 | 901 ++++++++++++++++++ Data/Input/pleiades/pleiades-1.gcp2 | 901 ++++++++++++++++++ Data/Input/spot6/spot6-1.gcp2 | 901 ++++++++++++++++++ Data/Input/wv2/wv2-1.gcp2 | 901 ++++++++++++++++++ .../Projection/test/otbSensorModel.cxx | 1 - Modules/IO/IOGDAL/otb-module.cmake | 1 + Modules/IO/IOGDAL/test/CMakeLists.txt | 47 + .../IOGDAL/test/otbGDALRPCTransformerTest.cxx | 5 - .../test/otbGDALRPCTransformerTest2.cxx | 126 +++ .../IO/IOGDAL/test/otbIOGDALTestDriver.cxx | 1 + 11 files changed, 4680 insertions(+), 6 deletions(-) create mode 100644 Data/Input/QB/qb-1.gcp2 create mode 100644 Data/Input/ikonos/ikonos-1.gcp2 create mode 100644 Data/Input/pleiades/pleiades-1.gcp2 create mode 100644 Data/Input/spot6/spot6-1.gcp2 create mode 100644 Data/Input/wv2/wv2-1.gcp2 create mode 100644 Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest2.cxx diff --git a/Data/Input/QB/qb-1.gcp2 b/Data/Input/QB/qb-1.gcp2 new file mode 100644 index 0000000000..06eda3e686 --- /dev/null +++ b/Data/Input/QB/qb-1.gcp2 @@ -0,0 +1,901 @@ +#From file /work/scratch/osmanj/otb_valid/qb-1.geom +0 0 1.3541065878393608 43.654566906071395 242.0 +10 0 1.3541860246729207 43.65456711611387 242.0 +20 0 1.3542654614960283 43.65456732608195 242.0 +30 0 1.354344898308687 43.654567535975644 242.0 +40 0 1.3544243351108998 43.65456774579495 242.0 +50 0 1.35450377190267 43.65456795553987 242.0 +60 0 1.354583208684001 43.6545681652104 242.0 +70 0 1.3546626454548958 43.654568374806544 242.0 +80 0 1.354742082215358 43.654568584328295 242.0 +90 0 1.3548215189653905 43.65456879377566 242.0 +100 0 1.3549009557049965 43.65456900314864 242.0 +110 0 1.3549803924341797 43.65456921244723 242.0 +120 0 1.3550598291529428 43.654569421671425 242.0 +130 0 1.3551392658612895 43.654569630821236 242.0 +140 0 1.3552187025592226 43.65456983989666 242.0 +150 0 1.3552981392467458 43.654570048897696 242.0 +160 0 1.355377575923862 43.654570257824346 242.0 +170 0 1.3554570125905745 43.6545704666766 242.0 +180 0 1.3555364492468867 43.65457067545447 242.0 +190 0 1.3556158858928018 43.654570884157955 242.0 +200 0 1.3556953225283228 43.65457109278705 242.0 +210 0 1.3557747591534532 43.65457130134176 242.0 +220 0 1.3558541957681964 43.65457150982208 242.0 +230 0 1.3559336323725553 43.65457171822801 242.0 +240 0 1.356013068966533 43.654571926559555 242.0 +250 0 1.3560925055501334 43.65457213481671 242.0 +260 0 1.3561719421233591 43.65457234299948 242.0 +270 0 1.3562513786862136 43.65457255110786 242.0 +280 0 1.3563308152387001 43.65457275914185 242.0 +290 0 1.356410251780822 43.65457296710146 242.0 +0 10 1.354107024641273 43.654506008612195 242.0 +10 10 1.3541864611935914 43.65450621864526 242.0 +20 10 1.3542658977354693 43.65450642860394 242.0 +30 10 1.3543453342669098 43.65450663848823 242.0 +40 10 1.3544247707879162 43.65450684829813 242.0 +50 10 1.354504207298492 43.654507058033644 242.0 +60 10 1.35458364379864 43.654507267694775 242.0 +70 10 1.3546630802883637 43.65450747728151 242.0 +80 10 1.3547425167676663 43.65450768679387 242.0 +90 10 1.3548219532365513 43.654507896231834 242.0 +100 10 1.3549013896950213 43.65450810559542 242.0 +110 10 1.35498082614308 43.65450831488461 242.0 +120 10 1.3550602625807309 43.65450852409941 242.0 +130 10 1.3551396990079765 43.65450873323983 242.0 +140 10 1.3552191354248206 43.65450894230586 242.0 +150 10 1.3552985718312665 43.65450915129751 242.0 +160 10 1.355378008227317 43.65450936021477 242.0 +170 10 1.3554574446129757 43.65450956905764 242.0 +180 10 1.3555368809882455 43.65450977782612 242.0 +190 10 1.3556163173531302 43.65450998652022 242.0 +200 10 1.3556957537076324 43.65451019513992 242.0 +210 10 1.3557751900517558 43.654510403685244 242.0 +220 10 1.3558546263855036 43.65451061215618 242.0 +230 10 1.355934062708879 43.65451082055273 242.0 +240 10 1.3560134990218848 43.65451102887489 242.0 +250 10 1.356092935324525 43.65451123712267 242.0 +260 10 1.3561723716168024 43.65451144529606 242.0 +270 10 1.3562518078987202 43.65451165339506 242.0 +280 10 1.356331244170282 43.65451186141968 242.0 +290 10 1.3564106804314906 43.65451206936991 242.0 +0 20 1.3541074615794975 43.654445111580536 242.0 +10 20 1.3541868978505829 43.65444532160419 242.0 +20 20 1.3542663341112395 43.65444553155347 242.0 +30 20 1.3543457703614705 43.654445741428354 242.0 +40 20 1.3544252066012792 43.65444595122886 242.0 +50 20 1.3545046428306686 43.654446160954976 242.0 +60 20 1.3545840790496424 43.654446370606706 242.0 +70 20 1.3546635152582036 43.65444658018404 242.0 +80 20 1.3547429514563551 43.654446789687 242.0 +90 20 1.3548223876441008 43.65444699911558 242.0 +100 20 1.3549018238214434 43.65444720846976 242.0 +110 20 1.3549812599883866 43.65444741774956 242.0 +120 20 1.3550606961449332 43.654447626954976 242.0 +130 20 1.3551401322910865 43.654447836086 242.0 +140 20 1.3552195684268502 43.654448045142644 242.0 +150 20 1.355299004552227 43.654448254124894 242.0 +160 20 1.3553784406672205 43.654448463032764 242.0 +170 20 1.3554578767718337 43.65444867186625 242.0 +180 20 1.3555373128660702 43.65444888062535 242.0 +190 20 1.3556167489499327 43.65444908931006 242.0 +200 20 1.3556961850234248 43.65444929792039 242.0 +210 20 1.3557756210865497 43.65444950645633 242.0 +220 20 1.3558550571393106 43.65444971491789 242.0 +230 20 1.3559344931817108 43.65444992330506 242.0 +240 20 1.3560139292137536 43.65445013161784 242.0 +250 20 1.356093365235442 43.65445033985624 242.0 +260 20 1.3561728012467795 43.65445054802025 242.0 +270 20 1.3562522372477692 43.65445075610988 242.0 +280 20 1.3563316732384143 43.654450964125125 242.0 +290 20 1.3564111092187183 43.654451172065976 242.0 +0 30 1.3541078986540156 43.654384214976105 242.0 +10 30 1.3541873346438766 43.65438442499037 242.0 +20 30 1.3542667706233205 43.65438463493024 242.0 +30 30 1.3543462065923504 43.65438484479573 242.0 +40 30 1.3544256425509698 43.65438505458683 242.0 +50 30 1.354505078499182 43.65438526430355 242.0 +60 30 1.3545845144369897 43.65438547394589 242.0 +70 30 1.3546639503643967 43.65438568351383 242.0 +80 30 1.354743386281406 43.654385893007394 242.0 +90 30 1.354822822188021 43.65438610242658 242.0 +100 30 1.3549022580842447 43.65438631177137 242.0 +110 30 1.3549816939700805 43.65438652104178 242.0 +120 30 1.3550611298455315 43.6543867302378 242.0 +130 30 1.3551405657106013 43.65438693935944 242.0 +140 30 1.3552200015652929 43.6543871484067 242.0 +150 30 1.3552994374096092 43.65438735737957 242.0 +160 30 1.355378873243554 43.654387566278054 242.0 +170 30 1.3554583090671306 43.65438777510215 242.0 +180 30 1.3555377448803416 43.65438798385187 242.0 +190 30 1.355617180683191 43.6543881925272 242.0 +200 30 1.3556966164756812 43.654388401128145 242.0 +210 30 1.3557760522578162 43.65438860965471 242.0 +220 30 1.355855488029599 43.65438881810689 242.0 +230 30 1.3559349237910325 43.65438902648468 242.0 +240 30 1.3560143595421204 43.65438923478809 242.0 +250 30 1.3560937952828658 43.654389443017116 242.0 +260 30 1.356173231013272 43.654389651171755 242.0 +270 30 1.3562526667333419 43.654389859252014 242.0 +280 30 1.3563321024430792 43.654390067257886 242.0 +290 30 1.356411538142487 43.65439027518937 242.0 +0 40 1.3541083358648092 43.65432331879862 242.0 +10 40 1.3541877715734543 43.65432352880348 242.0 +20 40 1.354267207271694 43.65432373873396 242.0 +30 40 1.3543466429595314 43.65432394859005 242.0 +40 40 1.35442607863697 43.65432415837176 242.0 +50 40 1.354505514304013 43.65432436807908 242.0 +60 40 1.3545849499606635 43.65432457771202 242.0 +70 40 1.354664385606925 43.654324787270575 242.0 +80 40 1.3547438212428002 43.65432499675475 242.0 +90 40 1.354823256868293 43.65432520616454 242.0 +100 40 1.3549026924834064 43.65432541549995 242.0 +110 40 1.3549821280881436 43.654325624760965 242.0 +120 40 1.3550615636825076 43.6543258339476 242.0 +130 40 1.355140999266502 43.65432604305986 242.0 +140 40 1.35522043484013 43.65432625209773 242.0 +150 40 1.3552998704033947 43.65432646106122 242.0 +160 40 1.3553793059562995 43.65432666995032 242.0 +170 40 1.3554587414988475 43.65432687876504 242.0 +180 40 1.3555381770310422 43.65432708750538 242.0 +190 40 1.3556176125528863 43.65432729617133 242.0 +200 40 1.3556970480643835 43.654327504762904 242.0 +210 40 1.355776483565537 43.65432771328009 242.0 +220 40 1.35585591905635 43.654327921722896 242.0 +230 40 1.3559353545368256 43.654328130091315 242.0 +240 40 1.3560147900069672 43.65432833838535 242.0 +250 40 1.356094225466778 43.654328546605 242.0 +260 40 1.3561736609162613 43.654328754750274 242.0 +270 40 1.3562530963554202 43.65432896282116 242.0 +280 40 1.356332531784258 43.65432917081767 242.0 +290 40 1.3564119672027781 43.65432937873979 242.0 +0 50 1.3541087732118597 43.65426242304777 242.0 +10 50 1.3541882086392973 43.65426263304323 242.0 +20 50 1.3542676440563413 43.654262842964314 242.0 +30 50 1.3543470794629948 43.65426305281101 242.0 +40 50 1.3544265148592611 43.65426326258333 242.0 +50 50 1.3545059502451438 43.654263472281265 242.0 +60 50 1.3545853856206453 43.654263681904816 242.0 +70 50 1.3546648209857697 43.65426389145398 242.0 +80 50 1.3547442563405199 43.65426410092876 242.0 +90 50 1.3548236916848988 43.65426431032917 242.0 +100 50 1.3549031270189102 43.654264519655186 242.0 +110 50 1.3549825623425573 43.654264728906824 242.0 +120 50 1.355061997655843 43.65426493808408 242.0 +130 50 1.3551414329587708 43.654265147186955 242.0 +140 50 1.3552208682513436 43.65426535621544 242.0 +150 50 1.3553003035335651 43.65426556516955 242.0 +160 50 1.3553797388054383 43.65426577404928 242.0 +170 50 1.3554591740669664 43.65426598285462 242.0 +180 50 1.3555386093181527 43.65426619158558 242.0 +190 50 1.3556180445590007 43.65426640024216 242.0 +200 50 1.3556974797895132 43.65426660882435 242.0 +210 50 1.3557769150096937 43.654266817332164 242.0 +220 50 1.3558563502195455 43.6542670257656 242.0 +230 50 1.3559357854190717 43.654267234124646 242.0 +240 50 1.3560152206082754 43.654267442409314 242.0 +250 50 1.3560946557871603 43.6542676506196 242.0 +260 50 1.3561740909557292 43.6542678587555 242.0 +270 50 1.3562535261139854 43.654268066817025 242.0 +280 50 1.3563329612619324 43.65426827480417 242.0 +290 50 1.3564123963995733 43.65426848271692 242.0 +0 60 1.354109210695149 43.65420152772325 242.0 +10 60 1.3541886458413877 43.65420173770933 242.0 +20 60 1.3542680809772445 43.65420194762102 242.0 +30 60 1.3543475161027225 43.65420215745832 242.0 +40 60 1.354426951217825 43.65420236722125 242.0 +50 60 1.3545063863225555 43.654202576909796 242.0 +60 60 1.354585821416917 43.65420278652396 242.0 +70 60 1.3546652565009127 43.65420299606374 242.0 +80 60 1.354744691574546 43.65420320552914 242.0 +90 60 1.35482412663782 43.65420341492016 242.0 +100 60 1.3549035616907381 43.6542036242368 242.0 +110 60 1.3549829967333034 43.65420383347905 242.0 +120 60 1.355062431765519 43.65420404264693 242.0 +130 60 1.3551418667873887 43.654204251740424 242.0 +140 60 1.355221301798915 43.65420446075954 242.0 +150 60 1.3553007368001018 43.654204669704264 242.0 +160 60 1.355380171790952 43.65420487857462 242.0 +170 60 1.3554596067714688 43.654205087370585 242.0 +180 60 1.3555390417416555 43.65420529609217 242.0 +190 60 1.3556184767015156 43.65420550473937 242.0 +200 60 1.355697911651052 43.6542057133122 242.0 +210 60 1.355777346590268 43.65420592181064 242.0 +220 60 1.355856781519167 43.654206130234705 242.0 +230 60 1.3559362164377522 43.65420633858439 242.0 +240 60 1.3560156513460269 43.65420654685969 242.0 +250 60 1.356095086243994 43.65420675506061 242.0 +260 60 1.3561745211316572 43.65420696318715 242.0 +270 60 1.3562539560090194 43.65420717123931 242.0 +280 60 1.356333390876084 43.654207379217084 242.0 +290 60 1.3564128257328543 43.65420758712048 242.0 +0 70 1.3541096483146584 43.654140632824785 242.0 +10 70 1.3541890831797068 43.65414084280146 242.0 +20 70 1.3542685180343847 43.654141052703764 242.0 +30 70 1.354347952878696 43.65414126253168 242.0 +40 70 1.3544273877126434 43.654141472285225 242.0 +50 70 1.3545068225362302 43.65414168196438 242.0 +60 70 1.35458625734946 43.65414189156916 242.0 +70 70 1.3546656921523357 43.65414210109956 242.0 +80 70 1.3547451269448607 43.65414231055558 242.0 +90 70 1.354824561727038 43.65414251993722 242.0 +100 70 1.3549039964988712 43.65414272924448 242.0 +110 70 1.3549834312603632 43.65414293847736 242.0 +120 70 1.3550628660115176 43.65414314763585 242.0 +130 70 1.3551423007523375 43.65414335671997 242.0 +140 70 1.355221735482826 43.654143565729704 242.0 +150 70 1.3553011702029865 43.65414377466506 242.0 +160 70 1.355380604912822 43.65414398352604 242.0 +170 70 1.355460039612336 43.654144192312636 242.0 +180 70 1.3555394743015319 43.65414440102485 242.0 +190 70 1.3556189089804125 43.65414460966269 242.0 +200 70 1.3556983436489813 43.65414481822614 242.0 +210 70 1.3557777783072413 43.65414502671522 242.0 +220 70 1.3558572129551962 43.65414523512992 242.0 +230 70 1.355936647592849 43.654145443470235 242.0 +240 70 1.3560160822202028 43.65414565173617 242.0 +250 70 1.356095516837261 43.65414585992773 242.0 +260 70 1.3561749514440269 43.65414606804491 242.0 +270 70 1.3562543860405036 43.65414627608771 242.0 +280 70 1.3563338206266944 43.65414648405613 242.0 +290 70 1.3564132552026025 43.65414669195016 242.0 +0 80 1.3541100860703696 43.654079738352046 242.0 +10 80 1.354189520654236 43.65407994831934 242.0 +20 80 1.354268955227744 43.65408015821226 242.0 +30 80 1.3543483897908968 43.65408036803079 242.0 +40 80 1.3544278243436976 43.65408057777495 242.0 +50 80 1.3545072588861495 43.65408078744473 242.0 +60 80 1.354586693418256 43.654080997040126 242.0 +70 80 1.35466612794002 43.654081206561145 242.0 +80 80 1.3547455624514453 43.654081416007784 242.0 +90 80 1.3548249969525346 43.654081625380044 242.0 +100 80 1.3549044314432914 43.654081834677925 242.0 +110 80 1.354983865923719 43.654082043901425 242.0 +120 80 1.3550633003938204 43.65408225305055 242.0 +130 80 1.355142734853599 43.654082462125295 242.0 +140 80 1.355222169303058 43.65408267112566 242.0 +150 80 1.3553016037422008 43.65408288005164 242.0 +160 80 1.3553810381710303 43.65408308890325 242.0 +170 80 1.35546047258955 43.65408329768048 242.0 +180 80 1.3555399069977632 43.65408350638333 242.0 +190 80 1.355619341395673 43.654083715011794 242.0 +200 80 1.3556987757832828 43.654083923565885 242.0 +210 80 1.3557782101605955 43.654084132045604 242.0 +220 80 1.3558576445276147 43.654084340450936 242.0 +230 80 1.3559370788843434 43.65408454878189 242.0 +240 80 1.356016513230785 43.65408475703847 242.0 +250 80 1.3560959475669427 43.65408496522066 242.0 +260 80 1.3561753818928197 43.65408517332848 242.0 +270 80 1.3562548162084194 43.654085381361924 242.0 +280 80 1.3563342505137448 43.654085589320985 242.0 +290 80 1.3564136848087993 43.654085797205674 242.0 +0 90 1.3541105239622646 43.65401884430476 242.0 +10 90 1.3541899582649575 43.65401905426267 242.0 +20 90 1.354269392557304 43.6540192641462 242.0 +30 90 1.3543488268393067 43.65401947395535 242.0 +40 90 1.3544282611109693 43.65401968369013 242.0 +50 90 1.3545076953722948 43.65401989335052 242.0 +60 90 1.3545871296232865 43.65402010293654 242.0 +70 90 1.3546665638639477 43.65402031244819 242.0 +80 90 1.3547459980942815 43.65402052188545 242.0 +90 90 1.3548254323142912 43.65402073124834 242.0 +100 90 1.3549048665239802 43.65402094053684 242.0 +110 90 1.3549843007233517 43.65402114975097 242.0 +120 90 1.3550637349124086 43.65402135889072 242.0 +130 90 1.3551431690911546 43.65402156795609 242.0 +140 90 1.3552226032595929 43.65402177694709 242.0 +150 90 1.3553020374177263 43.65402198586371 242.0 +160 90 1.3553814715655583 43.65402219470595 242.0 +170 90 1.3554609057030924 43.65402240347381 242.0 +180 90 1.3555403398303314 43.654022612167296 242.0 +190 90 1.3556197739472788 43.6540228207864 242.0 +200 90 1.355699208053938 43.65402302933113 242.0 +210 90 1.355778642150312 43.65402323780148 242.0 +220 90 1.3558580762364039 43.654023446197456 242.0 +230 90 1.3559375103122173 43.65402365451905 242.0 +240 90 1.3560169443777552 43.65402386276627 242.0 +250 90 1.3560963784330209 43.654024070939116 242.0 +260 90 1.3561758124780177 43.65402427903758 242.0 +270 90 1.3562552465127489 43.65402448706166 242.0 +280 90 1.3563346805372174 43.65402469501137 242.0 +290 90 1.3564141145514268 43.654024902886704 242.0 +0 100 1.3541109619903244 43.65395795068261 242.0 +10 100 1.3541903960118526 43.653958160631134 242.0 +20 100 1.354269830023046 43.653958370505286 242.0 +30 100 1.3543492640239074 43.653958580305066 242.0 +40 100 1.3544286980144402 43.653958790030465 242.0 +50 100 1.3545081319946477 43.653958999681485 242.0 +60 100 1.3545875659645332 43.653959209258126 242.0 +70 100 1.3546669999241 43.653959418760394 242.0 +80 100 1.354746433873351 43.65395962818828 242.0 +90 100 1.3548258678122898 43.6539598375418 242.0 +100 100 1.3549053017409194 43.653960046820934 242.0 +110 100 1.3549847356592433 43.65396025602569 242.0 +120 100 1.3550641695672643 43.653960465156075 242.0 +130 100 1.3551436034649862 43.65396067421208 242.0 +140 100 1.355223037352412 43.65396088319371 242.0 +150 100 1.3553024712295445 43.653961092100964 242.0 +160 100 1.3553819050963878 43.65396130093384 242.0 +170 100 1.3554613389529444 43.65396150969234 242.0 +180 100 1.3555407727992181 43.65396171837646 242.0 +190 100 1.3556202066352117 43.653961926986206 242.0 +200 100 1.3556996404609287 43.653962135521574 242.0 +210 100 1.3557790742763722 43.65396234398257 242.0 +220 100 1.3558585080815455 43.65396255236919 242.0 +230 100 1.355937941876452 43.65396276068143 242.0 +240 100 1.3560173756610947 43.65396296891929 242.0 +250 100 1.356096809435477 43.65396317708278 242.0 +260 100 1.356176243199602 43.65396338517189 242.0 +270 100 1.356255676953473 43.653963593186624 242.0 +280 100 1.3563351106970933 43.653963801126984 242.0 +290 100 1.3564145444304663 43.653964008992965 242.0 +0 110 1.3541114001545311 43.65389705748531 242.0 +10 110 1.3541908338949031 43.653897267424455 242.0 +20 110 1.3542702676249516 43.653897477289235 242.0 +30 110 1.3543497013446801 43.65389768707963 242.0 +40 110 1.354429135054092 43.653897896795655 242.0 +50 110 1.3545085687531901 43.6538981064373 242.0 +60 110 1.3545880024419779 43.65389831600457 242.0 +70 110 1.3546674361204585 43.65389852549747 242.0 +80 110 1.3547468697886353 43.653898734915984 242.0 +90 110 1.3548263034465116 43.65389894426013 242.0 +100 110 1.3549057370940905 43.6538991535299 242.0 +110 110 1.3549851707313751 43.65389936272529 242.0 +120 110 1.355064604358369 43.65389957184631 242.0 +130 110 1.355144037975075 43.65389978089295 242.0 +140 110 1.3552234715814968 43.65389998986522 242.0 +150 110 1.3553029051776373 43.653900198763104 242.0 +160 110 1.3553823387635 43.65390040758662 242.0 +170 110 1.355461772339088 43.65390061633576 242.0 +180 110 1.3555412059044047 43.653900825010524 242.0 +190 110 1.355620639459453 43.653901033610914 242.0 +200 110 1.3557000730042363 43.653901242136925 242.0 +210 110 1.3557795065387581 43.65390145058856 242.0 +220 110 1.3558589400630212 43.65390165896583 242.0 +230 110 1.3559383735770294 43.653901867268715 242.0 +240 110 1.3560178070807853 43.65390207549723 242.0 +250 110 1.3560972405742926 43.65390228365136 242.0 +260 110 1.3561766740575545 43.653902491731124 242.0 +270 110 1.356256107530574 43.65390269973651 242.0 +280 110 1.3563355409933544 43.65390290766752 242.0 +290 110 1.3564149744458993 43.65390311552416 242.0 +0 120 1.3541118384548663 43.65383616471255 242.0 +10 120 1.3541912719140903 43.653836374642324 242.0 +20 120 1.354270705363003 43.653836584497725 242.0 +30 120 1.354350138801607 43.65383679427875 242.0 +40 120 1.3544295722299062 43.6538370039854 242.0 +50 120 1.3545090056479034 43.65383721361768 242.0 +60 120 1.354588439055602 43.65383742317558 242.0 +70 120 1.3546678724530052 43.65383763265911 242.0 +80 120 1.3547473058401163 43.65383784206826 242.0 +90 120 1.3548267392169384 43.65383805140304 242.0 +100 120 1.354906172583475 43.65383826066344 242.0 +110 120 1.3549856059397292 43.65383846984947 242.0 +120 120 1.355065039285704 43.65383867896112 242.0 +130 120 1.355144472621403 43.653838887998404 242.0 +140 120 1.3552239059468294 43.65383909696131 242.0 +150 120 1.3553033392619864 43.65383930584984 242.0 +160 120 1.355382772566877 43.653839514664 242.0 +170 120 1.3554622058615047 43.65383972340378 242.0 +180 120 1.3555416391458728 43.65383993206919 242.0 +190 120 1.3556210724199844 43.65384014066022 242.0 +200 120 1.3557005056838427 43.65384034917688 242.0 +210 120 1.355779938937451 43.65384055761917 242.0 +220 120 1.3558593721808128 43.65384076598708 242.0 +230 120 1.3559388054139307 43.65384097428061 242.0 +240 120 1.3560182386368087 43.653841182499775 242.0 +250 120 1.3560976718494495 43.653841390644565 242.0 +260 120 1.3561771050518565 43.65384159871498 242.0 +270 120 1.356256538244033 43.65384180671102 242.0 +280 120 1.3563359714259824 43.65384201463269 242.0 +290 120 1.3564154045977075 43.65384222247998 242.0 +0 130 1.3541122768913114 43.653775272364044 242.0 +10 130 1.3541917100693963 43.65377548228445 242.0 +20 130 1.3542711432371812 43.65377569213048 242.0 +30 130 1.3543505763946695 43.65377590190214 242.0 +40 130 1.3544300095418644 43.65377611159941 242.0 +50 130 1.3545094426787694 43.653776321222324 242.0 +60 130 1.3545888758053872 43.65377653077086 242.0 +70 130 1.3546683089217215 43.65377674024502 242.0 +80 130 1.3547477420277754 43.65377694964481 242.0 +90 130 1.3548271751235519 43.65377715897022 242.0 +100 130 1.3549066082090546 43.65377736822126 242.0 +110 130 1.3549860412842867 43.65377757739793 242.0 +120 130 1.3550654743492514 43.65377778650023 242.0 +130 130 1.3551449074039517 43.653777995528145 242.0 +140 130 1.3552243404483912 43.653778204481696 242.0 +150 130 1.3553037734825728 43.65377841336087 242.0 +160 130 1.3553832065065001 43.65377862216567 242.0 +170 130 1.355462639520176 43.6537788308961 242.0 +180 130 1.3555420725236043 43.653779039552155 242.0 +190 130 1.3556215055167875 43.65377924813384 242.0 +200 130 1.3557009384997294 43.653779456641146 242.0 +210 130 1.3557803714724328 43.65377966507408 242.0 +220 130 1.3558598044349013 43.65377987343264 242.0 +230 130 1.355939237387138 43.65378008171683 242.0 +240 130 1.3560186703291461 43.65378028992665 242.0 +250 130 1.3560981032609292 43.65378049806209 242.0 +260 130 1.35617753618249 43.653780706123165 242.0 +270 130 1.356256969093832 43.653780914109866 242.0 +280 130 1.3563364019949584 43.65378112202219 242.0 +290 130 1.3564158348858726 43.65378132986014 242.0 +0 140 1.3541127154638484 43.653714380439496 242.0 +10 140 1.3541921483608024 43.653714590350525 242.0 +20 140 1.3542715812474682 43.65371480018719 242.0 +30 140 1.354351014123849 43.65371500994948 242.0 +40 140 1.3544304469899486 43.65371521963739 242.0 +50 140 1.3545098798457693 43.65371542925094 242.0 +60 140 1.354589312691315 43.65371563879011 242.0 +70 140 1.354668745526589 43.653715848254905 242.0 +80 140 1.354748178351594 43.65371605764533 242.0 +90 140 1.3548276111663338 43.65371626696139 242.0 +100 140 1.354907043970811 43.653716476203066 242.0 +110 140 1.3549864767650297 43.65371668537038 242.0 +120 140 1.3550659095489923 43.653716894463315 242.0 +130 140 1.3551453423227027 43.65371710348188 242.0 +140 140 1.3552247750861637 43.653717312426075 242.0 +150 140 1.3553042078393789 43.653717521295896 242.0 +160 140 1.3553836405823512 43.653717730091344 242.0 +170 140 1.3554630733150839 43.65371793881242 242.0 +180 140 1.3555425060375805 43.653718147459124 242.0 +190 140 1.355621938749844 43.65371835603146 242.0 +200 140 1.3557013714518777 43.65371856452942 242.0 +210 140 1.355780804143685 43.653718772953006 242.0 +220 140 1.3558602368252688 43.65371898130223 242.0 +230 140 1.3559396694966326 43.653719189577075 242.0 +240 140 1.3560191021577797 43.65371939777754 242.0 +250 140 1.3560985348087131 43.653719605903646 242.0 +260 140 1.3561779674494363 43.65371981395538 242.0 +270 140 1.3562574000799523 43.653720021932735 242.0 +280 140 1.3563368327002645 43.65372022983572 242.0 +290 140 1.3564162653103762 43.65372043766434 242.0 +0 150 1.3541131541724585 43.6536534889386 242.0 +10 150 1.3541925867882902 43.653653698840266 242.0 +20 150 1.3542720193938456 43.65365390866756 242.0 +30 150 1.3543514519891278 43.653654118420484 242.0 +40 150 1.35443088457414 43.65365432809904 242.0 +50 150 1.3545103171488855 43.65365453770322 242.0 +60 150 1.3545897497133674 43.65365474723303 242.0 +70 150 1.3546691822675894 43.65365495668847 242.0 +80 150 1.3547486148115542 43.653655166069534 242.0 +90 150 1.3548280473452654 43.65365537537623 242.0 +100 150 1.354907479868726 43.65365558460856 242.0 +110 150 1.3549869123819394 43.65365579376651 242.0 +120 150 1.355066344884909 43.65365600285009 242.0 +130 150 1.3551457773776376 43.65365621185931 242.0 +140 150 1.3552252098601287 43.65365642079415 242.0 +150 150 1.3553046423323856 43.65365662965462 242.0 +160 150 1.3553840747944115 43.65365683844072 242.0 +170 150 1.3554635072462096 43.65365704715245 242.0 +180 150 1.3555429396877832 43.6536572557898 242.0 +190 150 1.3556223721191354 43.65365746435279 242.0 +200 150 1.3557018045402696 43.653657672841405 242.0 +210 150 1.355781236951189 43.653657881255654 242.0 +220 150 1.3558606693518966 43.65365808959553 242.0 +230 150 1.3559401017423962 43.65365829786103 242.0 +240 150 1.3560195341226906 43.65365850605217 242.0 +250 150 1.3560989664927832 43.65365871416893 242.0 +260 150 1.356178398852677 43.65365892221132 242.0 +270 150 1.3562578312023756 43.65365913017934 242.0 +280 150 1.356337263541882 43.65365933807299 242.0 +290 150 1.3564166958711996 43.653659545892275 242.0 +0 160 1.3541135930171238 43.65359259786106 242.0 +10 160 1.3541930253518417 43.65359280775336 242.0 +20 160 1.3542724576762948 43.653593017571296 242.0 +30 160 1.3543518899904867 43.65359322731486 242.0 +40 160 1.3544313222944202 43.65359343698405 242.0 +50 160 1.3545107545880988 43.65359364657887 242.0 +60 160 1.3545901868715258 43.65359385609933 242.0 +70 160 1.354669619144704 43.653594065545406 242.0 +80 160 1.3547490514076372 43.65359427491712 242.0 +90 160 1.3548284836603286 43.65359448421446 242.0 +100 160 1.3549079159027808 43.653594693437434 242.0 +110 160 1.3549873481349979 43.653594902586036 242.0 +120 160 1.3550667803569825 43.653595111660266 242.0 +130 160 1.355146212568738 43.65359532066013 242.0 +140 160 1.3552256447702677 43.65359552958562 242.0 +150 160 1.355305076961575 43.65359573843674 242.0 +160 160 1.3553845091426628 43.653595947213496 242.0 +170 160 1.3554639413135348 43.65359615591588 242.0 +180 160 1.355543373474194 43.653596364543894 242.0 +190 160 1.3556228056246433 43.65359657309754 242.0 +200 160 1.3557022377648866 43.653596781576816 242.0 +210 160 1.3557816698949265 43.653596989981715 242.0 +220 160 1.3558611020147668 43.653597198312255 242.0 +230 160 1.3559405341244104 43.653597406568416 242.0 +240 160 1.3560199662238606 43.65359761475021 242.0 +250 160 1.3560993983131207 43.65359782285764 242.0 +260 160 1.356178830392194 43.6535980308907 242.0 +270 160 1.3562582624610835 43.65359823884938 242.0 +280 160 1.3563376945197927 43.6535984467337 242.0 +290 160 1.3564171265683247 43.65359865454365 242.0 +0 170 1.3541140319978255 43.65353170720658 242.0 +10 170 1.3541934640514381 43.65353191708952 242.0 +20 170 1.3542728960947978 43.6535321268981 242.0 +30 170 1.3543523281279077 43.6535323366323 242.0 +40 170 1.3544317601507712 43.65353254629214 242.0 +50 170 1.3545111921633914 43.653532755877606 242.0 +60 170 1.3545906241657717 43.6535329653887 242.0 +70 170 1.3546700561579152 43.65353317482543 242.0 +80 170 1.3547494881398252 43.65353338418779 242.0 +90 170 1.354828920111505 43.65353359347578 242.0 +100 170 1.3549083520729575 43.6535338026894 242.0 +110 170 1.3549877840241864 43.653534011828654 242.0 +120 170 1.3550672159651946 43.65353422089353 242.0 +130 170 1.3551466478959855 43.653534429884054 242.0 +140 170 1.3552260798165625 43.653534638800195 242.0 +150 170 1.3553055117269286 43.65353484764198 242.0 +160 170 1.355384943627087 43.65353505640939 242.0 +170 170 1.3554643755170412 43.65353526510243 242.0 +180 170 1.3555438073967945 43.6535354737211 242.0 +190 170 1.3556232392663496 43.6535356822654 242.0 +200 170 1.3557026711257103 43.653535890735334 242.0 +210 170 1.3557821029748796 43.6535360991309 242.0 +220 170 1.3558615348138605 43.6535363074521 242.0 +230 170 1.3559409666426567 43.65353651569893 242.0 +240 170 1.3560203984612713 43.6535367238714 242.0 +250 170 1.3560998302697076 43.653536931969484 242.0 +260 170 1.3561792620679687 43.65353713999321 242.0 +270 170 1.3562586938560577 43.65353734794257 242.0 +280 170 1.3563381256339782 43.65353755581756 242.0 +290 170 1.3564175574017332 43.653537763618175 242.0 +0 180 1.3541144711145456 43.653470816974874 242.0 +10 180 1.3541939028870613 43.65347102684846 242.0 +20 180 1.354273334649336 43.653471236647675 242.0 +30 180 1.3543527664013728 43.65347144637252 242.0 +40 180 1.3544321981431746 43.653471656023 242.0 +50 180 1.354511629874745 43.653471865599116 242.0 +60 180 1.354591061596087 43.65347207510086 242.0 +70 180 1.354670493307204 43.653472284528235 242.0 +80 180 1.3547499250080992 43.653472493881246 242.0 +90 180 1.354829356698776 43.653472703159885 242.0 +100 180 1.3549087883792372 43.65347291236416 242.0 +110 180 1.3549882200494867 43.653473121494066 242.0 +120 180 1.355067651709527 43.65347333054961 242.0 +130 180 1.355147083359362 43.65347353953078 242.0 +140 180 1.3552265149989946 43.653473748437584 242.0 +150 180 1.3553059466284278 43.653473957270016 242.0 +160 180 1.3553853782476655 43.65347416602808 242.0 +170 180 1.3554648098567106 43.653474374711784 242.0 +180 180 1.355544241455566 43.65347458332112 242.0 +190 180 1.3556236730442357 43.653474791856084 242.0 +200 180 1.3557031046227221 43.65347500031669 242.0 +210 180 1.3557825361910292 43.653475208702915 242.0 +220 180 1.3558619677491597 43.65347541701478 242.0 +230 180 1.355941399297117 43.65347562525228 242.0 +240 180 1.3560208308349044 43.653475833415406 242.0 +250 180 1.3561002623625253 43.65347604150417 242.0 +260 180 1.3561796938799826 43.65347624951857 242.0 +270 180 1.3562591253872798 43.653476457458595 242.0 +280 180 1.35633855688442 43.653476665324256 242.0 +290 180 1.3564179883714065 43.65347687311555 242.0 +0 190 1.3541149103672654 43.65340992716563 242.0 +10 190 1.3541943418586933 43.65341013702986 242.0 +20 190 1.3542737733398913 43.653410346819726 242.0 +30 190 1.354353204810863 43.65341055653522 242.0 +40 190 1.354432636271612 43.65341076617635 242.0 +50 190 1.3545120677221407 43.65341097574311 242.0 +60 190 1.3545914991624532 43.653411185235505 242.0 +70 190 1.3546709305925524 43.65341139465353 242.0 +80 190 1.3547503620124413 43.6534116039972 242.0 +90 190 1.3548297934221234 43.653411813266494 242.0 +100 190 1.3549092248216021 43.653412022461424 242.0 +110 190 1.3549886562108804 43.65341223158198 242.0 +120 190 1.3550680875899614 43.65341244062818 242.0 +130 190 1.3551475189588489 43.653412649600014 242.0 +140 190 1.3552269503175456 43.653412858497475 242.0 +150 190 1.3553063816660549 43.65341306732057 242.0 +160 190 1.35538581300438 43.6534132760693 242.0 +170 190 1.3554652443325244 43.653413484743666 242.0 +180 190 1.355544675650491 43.653413693343666 242.0 +190 190 1.355624106958283 43.6534139018693 242.0 +200 190 1.3557035382559042 43.65341411032056 242.0 +210 190 1.3557829695433574 43.653414318697465 242.0 +220 190 1.3558624008206457 43.653414526999995 242.0 +230 190 1.3559418320877727 43.65341473522816 242.0 +240 190 1.3560212633447415 43.65341494338196 242.0 +250 190 1.3561006945915555 43.6534151514614 242.0 +260 190 1.3561801258282176 43.65341535946647 242.0 +270 190 1.3562595570547313 43.65341556739717 242.0 +280 190 1.3563389882710997 43.65341577525351 242.0 +290 190 1.356418419477326 43.65341598303548 242.0 +0 200 1.354115349755967 43.65334903777856 242.0 +10 200 1.3541947809663148 43.65334924763344 242.0 +20 200 1.354274212166445 43.65334945741395 242.0 +30 200 1.3543536433563605 43.6533496671201 242.0 +40 200 1.3544330745360647 43.653349876751875 242.0 +50 200 1.3545125057055607 43.653350086309295 242.0 +60 200 1.354591936864852 43.65335029579234 242.0 +70 200 1.3546713680139417 43.653350505201026 242.0 +80 200 1.354750799152833 43.65335071453534 242.0 +90 200 1.3548302302815292 43.653350923795294 242.0 +100 200 1.3549096614000335 43.65335113298089 242.0 +110 200 1.3549890925083492 43.65335134209211 242.0 +120 200 1.3550685236064797 43.653351551128964 242.0 +130 200 1.3551479546944278 43.653351760091454 242.0 +140 200 1.355227385772197 43.65335196897958 242.0 +150 200 1.3553068168397908 43.653352177793344 242.0 +160 200 1.355386247897212 43.65335238653274 242.0 +170 200 1.3554656789444641 43.65335259519777 242.0 +180 200 1.3555451099815503 43.65335280378844 242.0 +190 200 1.3556245410084737 43.653353012304734 242.0 +200 200 1.3557039720252377 43.65335322074667 242.0 +210 200 1.3557834030318456 43.65335342911424 242.0 +220 200 1.3558628340283003 43.65335363740745 242.0 +230 200 1.3559422650146056 43.653353845626285 242.0 +240 200 1.3560216959907643 43.65335405377076 242.0 +250 200 1.3561011269567798 43.653354261840875 242.0 +260 200 1.3561805579126551 43.65335446983662 242.0 +270 200 1.3562599888583937 43.653354677757996 242.0 +280 200 1.356339419793999 43.65335488560501 242.0 +290 200 1.3564188507194739 43.65335509337767 242.0 +0 210 1.354115789280632 43.653288148813374 242.0 +10 210 1.3541952202099083 43.6532883586589 242.0 +20 210 1.354274651128979 43.653288568430064 242.0 +30 210 1.3543540820378466 43.653288778126864 242.0 +40 210 1.3544335129365146 43.6532889877493 242.0 +50 210 1.3545129438249863 43.65328919729737 242.0 +60 210 1.3545923747032649 43.65328940677107 242.0 +70 210 1.3546718055713536 43.65328961617041 242.0 +80 210 1.3547512364292558 43.65328982549539 242.0 +90 210 1.3548306672769745 43.65329003474601 242.0 +100 210 1.354910098114513 43.65329024392225 242.0 +110 210 1.3549895289418747 43.653290453024134 242.0 +120 210 1.3550689597590628 43.65329066205166 242.0 +130 210 1.3551483905660804 43.65329087100481 242.0 +140 210 1.355227821362931 43.65329107988361 242.0 +150 210 1.3553072521496174 43.65329128868803 242.0 +160 210 1.3553866829261432 43.653291497418095 242.0 +170 210 1.3554661136925115 43.653291706073794 242.0 +180 210 1.3555455444487259 43.653291914655135 242.0 +190 210 1.3556249751947889 43.6532921231621 242.0 +200 210 1.3557044059307044 43.65329233159471 242.0 +210 210 1.3557838366564754 43.65329253995296 242.0 +220 210 1.3558632673721052 43.65329274823684 242.0 +230 210 1.355942698077597 43.65329295644636 242.0 +240 210 1.3560221287729541 43.653293164581505 242.0 +250 210 1.3561015594581796 43.653293372642295 242.0 +260 210 1.3561809901332769 43.65329358062872 242.0 +270 210 1.3562604207982492 43.65329378854078 242.0 +280 210 1.3563398514530995 43.65329399637848 242.0 +290 210 1.3564192820978314 43.653294204141815 242.0 +0 220 1.3541162289412414 43.65322726026976 242.0 +10 220 1.3541956595894553 43.653227470105946 242.0 +20 220 1.3542750902274747 43.65322767986776 242.0 +30 220 1.3543545208553032 43.65322788955522 242.0 +40 220 1.3544339514729435 43.65322809916831 242.0 +50 220 1.3545133820803994 43.653228308707035 242.0 +60 220 1.3545928126776738 43.6532285181714 242.0 +70 220 1.3546722432647702 43.653228727561405 242.0 +80 220 1.3547516738416916 43.65322893687704 242.0 +90 220 1.3548311044084413 43.65322914611832 242.0 +100 220 1.3549105349650226 43.653229355285234 242.0 +110 220 1.3549899655114388 43.65322956437778 242.0 +120 220 1.355069396047693 43.65322977339597 242.0 +130 220 1.3551488265737883 43.653229982339795 242.0 +140 220 1.3552282570897285 43.65323019120925 242.0 +150 220 1.3553076875955163 43.65323040000435 242.0 +160 220 1.3553871180911552 43.65323060872508 242.0 +170 220 1.3554665485766484 43.65323081737146 242.0 +180 220 1.355545979051999 43.65323102594347 242.0 +190 220 1.3556254095172107 43.653231234441115 242.0 +200 220 1.355704839972286 43.653231442864396 242.0 +210 220 1.3557842704172287 43.65323165121332 242.0 +220 220 1.355863700852042 43.653231859487875 242.0 +230 220 1.3559431312767287 43.65323206768807 242.0 +240 220 1.3560225616912926 43.653232275813906 242.0 +250 220 1.356101992095737 43.653232483865374 242.0 +260 220 1.3561814224900643 43.65323269184248 242.0 +270 220 1.3562608528742788 43.65323289974523 242.0 +280 220 1.3563402832483828 43.653233107573605 242.0 +290 220 1.3564197136123803 43.653233315327626 242.0 +0 230 1.3541166687377777 43.65316637214744 242.0 +10 230 1.3541960991049373 43.653166581974276 242.0 +20 230 1.3542755294619142 43.653166791726754 242.0 +30 230 1.3543549598087117 43.65316700140487 242.0 +40 230 1.354434390145333 43.65316721100862 242.0 +50 230 1.3545138204717815 43.65316742053801 242.0 +60 230 1.3545932507880603 43.653167629993035 242.0 +70 230 1.3546726810941725 43.6531678393737 242.0 +80 230 1.3547521113901217 43.65316804868001 242.0 +90 230 1.354831541675911 43.65316825791194 242.0 +100 230 1.3549109719515435 43.65316846706953 242.0 +110 230 1.3549904022170227 43.653168676152745 242.0 +120 230 1.3550698324723516 43.6531688851616 242.0 +130 230 1.3551492627175334 43.65316909409609 242.0 +140 230 1.3552286929525716 43.65316930295623 242.0 +150 230 1.3553081231774693 43.653169511742 242.0 +160 230 1.3553875533922297 43.653169720453405 242.0 +170 230 1.3554669835968562 43.65316992909045 242.0 +180 230 1.355546413791352 43.653170137653134 242.0 +190 230 1.3556258439757203 43.65317034614146 242.0 +200 230 1.3557052741499642 43.65317055455542 242.0 +210 230 1.355784704314087 43.65317076289502 242.0 +220 230 1.355864134468092 43.653170971160264 242.0 +230 230 1.3559435646119826 43.65317117935114 242.0 +240 230 1.3560229947457618 43.65317138746766 242.0 +250 230 1.356102424869433 43.65317159550981 242.0 +260 230 1.3561818549829994 43.653171803477605 242.0 +270 230 1.3562612850864642 43.65317201137103 242.0 +280 230 1.3563407151798306 43.653172219190104 242.0 +290 230 1.356420145263102 43.65317242693481 242.0 +0 240 1.3541171086702222 43.65310548444611 242.0 +10 240 1.354196538756336 43.6531056942636 242.0 +20 240 1.3542759688322787 43.65310590400674 242.0 +30 240 1.354355398898054 43.65310611367552 242.0 +40 240 1.3544348289536645 43.65310632326993 242.0 +50 240 1.3545142589991142 43.653106532789984 242.0 +60 240 1.3545936890344057 43.65310674223568 242.0 +70 240 1.3546731190595427 43.65310695160701 242.0 +80 240 1.354752549074528 43.65310716090398 242.0 +90 240 1.3548319790793655 43.65310737012659 242.0 +100 240 1.3549114090740577 43.65310757927484 242.0 +110 240 1.3549908390586083 43.65310778834873 242.0 +120 240 1.3550702690330203 43.65310799734826 242.0 +130 240 1.355149698997297 43.65310820627342 242.0 +140 240 1.355229128951442 43.65310841512423 242.0 +150 240 1.3553085588954579 43.65310862390068 242.0 +160 240 1.3553879888293485 43.65310883260276 242.0 +170 240 1.3554674187531168 43.653109041230486 242.0 +180 240 1.355546848666766 43.65310924978385 242.0 +190 240 1.3556262785702995 43.653109458262854 242.0 +200 240 1.3557057084637203 43.6531096666675 242.0 +210 240 1.3557851383470318 43.65310987499778 242.0 +220 240 1.3558645682202373 43.65311008325371 242.0 +230 240 1.35594399808334 43.65311029143527 242.0 +240 240 1.356023427936343 43.65311049954247 242.0 +250 240 1.3561028577792498 43.65311070757531 242.0 +260 240 1.3561822876120635 43.65311091553379 242.0 +270 240 1.3562617174347873 43.65311112341791 242.0 +280 240 1.3563411472474245 43.65311133122767 242.0 +290 240 1.3564205770499782 43.653111538963074 242.0 +0 250 1.3541175487385564 43.65304459716547 242.0 +10 250 1.3541969785436327 43.65304480697363 242.0 +20 250 1.3542764083385501 43.65304501670743 242.0 +30 250 1.3543558381233114 43.65304522636687 242.0 +40 250 1.3544352678979201 43.65304543595195 242.0 +50 250 1.3545146976623792 43.653045645462676 242.0 +60 250 1.3545941274166922 43.653045854899034 242.0 +70 250 1.3546735571608621 43.653046064261034 242.0 +80 250 1.3547529868948924 43.653046273548675 242.0 +90 250 1.3548324166187862 43.65304648276196 242.0 +100 250 1.3549118463325467 43.65304669190088 242.0 +110 250 1.354991276036177 43.65304690096544 242.0 +120 250 1.355070705729681 43.65304710995565 242.0 +130 250 1.355150135413061 43.653047318871494 242.0 +140 250 1.3552295650863209 43.65304752771298 242.0 +150 250 1.3553089947494639 43.6530477364801 242.0 +160 250 1.355388424402493 43.653047945172865 242.0 +170 250 1.3554678540454115 43.65304815379127 242.0 +180 250 1.3555472836782227 43.65304836233532 242.0 +190 250 1.3556267133009299 43.653048570805005 242.0 +200 250 1.3557061429135362 43.65304877920033 242.0 +210 250 1.3557855725160448 43.6530489875213 242.0 +220 250 1.3558650021084593 43.653049195767906 242.0 +230 250 1.3559444316907825 43.65304940394016 242.0 +240 250 1.356023861263018 43.653049612038046 242.0 +250 250 1.356103290825169 43.65304982006158 242.0 +260 250 1.3561827203772383 43.65305002801075 242.0 +270 250 1.3562621499192296 43.653050235885566 242.0 +280 250 1.356341579451146 43.65305044368602 242.0 +290 250 1.3564210089729907 43.653050651412116 242.0 +0 260 1.3541179889427621 43.652983710305236 242.0 +10 260 1.35419741846681 43.65298392010406 242.0 +20 260 1.3542768479807101 43.652984129828525 242.0 +30 260 1.354356277484466 43.652984339478635 242.0 +40 260 1.354435706978081 43.65298454905439 242.0 +50 260 1.3545151364615582 43.652984758555775 242.0 +60 260 1.354594565934901 43.65298496798281 242.0 +70 260 1.3546739953981126 43.65298517733548 242.0 +80 260 1.354753424851196 43.6529853866138 242.0 +90 260 1.3548328542941548 43.65298559581775 242.0 +100 260 1.354912283726992 43.652985804947356 242.0 +110 260 1.354991713149711 43.65298601400259 242.0 +120 260 1.3550711425623148 43.65298622298347 242.0 +130 260 1.355150571964807 43.65298643189 242.0 +140 260 1.3552300013571905 43.65298664072216 242.0 +150 260 1.3553094307394686 43.652986849479966 242.0 +160 260 1.3553888601116448 43.65298705816341 242.0 +170 260 1.355468289473722 43.652987266772506 242.0 +180 260 1.3555477188257037 43.652987475307235 242.0 +190 260 1.3556271481675932 43.652987683767606 242.0 +200 260 1.3557065774993935 43.652987892153625 242.0 +210 260 1.3557860068211078 43.65298810046528 242.0 +220 260 1.3558654361327396 43.652988308702575 242.0 +230 260 1.355944865434292 43.65298851686552 242.0 +240 260 1.3560242947257684 43.6529887249541 242.0 +250 260 1.3561037240071716 43.65298893296832 242.0 +260 260 1.3561831532785054 43.65298914090819 242.0 +270 260 1.3562625825397727 43.652989348773694 242.0 +280 260 1.3563420117909768 43.65298955656485 242.0 +290 260 1.356421441032121 43.65298976428164 242.0 +0 270 1.3541184292828212 43.652922823865104 242.0 +10 270 1.3541978585258485 43.6529230336546 242.0 +20 270 1.3542772877587401 43.65292324336974 242.0 +30 270 1.3543567169814992 43.652923453010516 242.0 +40 270 1.3544361461941292 43.65292366257694 242.0 +50 270 1.354515575396633 43.652923872069 242.0 +60 270 1.354595004589014 43.65292408148671 242.0 +70 270 1.3546744337712755 43.65292429083006 242.0 +80 270 1.3547538629434208 43.65292450009905 242.0 +90 270 1.3548332921054531 43.652924709293686 242.0 +100 270 1.3549127212573755 43.65292491841396 242.0 +110 270 1.3549921503991913 43.65292512745988 242.0 +120 270 1.3550715795309038 43.652925336431444 242.0 +130 270 1.3551510086525163 43.65292554532865 242.0 +140 270 1.355230437764032 43.6529257541515 242.0 +150 270 1.355309866865454 43.652925962899985 242.0 +160 270 1.3553892959567857 43.652926171574116 242.0 +170 270 1.3554687250380302 43.652926380173895 242.0 +180 270 1.355548154109191 43.65292658869931 242.0 +190 270 1.355627583170271 43.65292679715037 242.0 +200 270 1.3557070122212738 43.652927005527076 242.0 +210 270 1.3557864412622023 43.65292721382943 242.0 +220 270 1.35586587029306 43.65292742205742 242.0 +230 270 1.3559452993138499 43.65292763021105 242.0 +240 270 1.3560247283245757 43.652927838290324 242.0 +250 270 1.35610415732524 43.652928046295244 242.0 +260 270 1.3561835863158465 43.65292825422581 242.0 +270 270 1.3562630152963981 43.652928462082016 242.0 +280 270 1.3563424442668985 43.65292866986386 242.0 +290 270 1.3564218732273507 43.652928877571355 242.0 +0 280 1.354118869758715 43.65286193784479 242.0 +10 280 1.3541982987207306 43.65286214762496 242.0 +20 280 1.3542777276726221 43.65286235733077 242.0 +30 280 1.3543571566143928 43.65286256696222 242.0 +40 280 1.354436585546046 43.652862776519314 242.0 +50 280 1.354516014467585 43.652862986002056 242.0 +60 280 1.3545954433790128 43.65286319541044 242.0 +70 280 1.354674872280333 43.652863404744465 242.0 +80 280 1.3547543011715484 43.65286361400414 242.0 +90 280 1.3548337300526627 43.65286382318945 242.0 +100 280 1.3549131589236787 43.65286403230041 242.0 +110 280 1.3549925877846 43.652864241337014 242.0 +120 280 1.3550720166354298 43.652864450299255 242.0 +130 280 1.355151445476171 43.652864659187145 242.0 +140 280 1.3552308743068273 43.652864868000684 242.0 +150 280 1.3553103031274016 43.65286507673986 242.0 +160 280 1.3553897319378974 43.65286528540468 242.0 +170 280 1.3554691607383176 43.652865493995144 242.0 +180 280 1.3555485895286659 43.65286570251126 242.0 +190 280 1.355628018308945 43.65286591095301 242.0 +200 280 1.3557074470791588 43.65286611932041 242.0 +210 280 1.35578687583931 43.652866327613445 242.0 +220 280 1.355866304589402 43.65286653583213 242.0 +230 280 1.355945733329438 43.65286674397646 242.0 +240 280 1.3560251620594215 43.65286695204644 242.0 +250 280 1.3561045907793554 43.65286716004206 242.0 +260 280 1.3561840194892432 43.65286736796332 242.0 +270 280 1.3562634481890878 43.65286757581023 242.0 +280 280 1.356342876878893 43.65286778358278 242.0 +290 280 1.3564223055586615 43.65286799128097 242.0 +0 290 1.3541193103704254 43.652801052243994 242.0 +10 290 1.3541987390514376 43.65280126201483 242.0 +20 290 1.3542781677223377 43.65280147171132 242.0 +30 290 1.3543575963831285 43.65280168133345 242.0 +40 290 1.3544370250338136 43.65280189088122 242.0 +50 290 1.354516453674396 43.65280210035464 242.0 +60 290 1.3545958823048792 43.6528023097537 242.0 +70 290 1.3546753109252663 43.65280251907841 242.0 +80 290 1.3547547395355606 43.652802728328766 242.0 +90 290 1.3548341681357652 43.65280293750477 242.0 +100 290 1.3549135967258834 43.65280314660641 242.0 +110 290 1.3549930253059186 43.652803355633694 242.0 +120 290 1.3550724538758738 43.65280356458663 242.0 +130 290 1.3551518824357527 43.6528037734652 242.0 +140 290 1.3552313109855578 43.652803982269425 242.0 +150 290 1.355310739525293 43.6528041909993 242.0 +160 290 1.3553901680549614 43.652804399654805 242.0 +170 290 1.3554695965745658 43.65280460823597 242.0 +180 290 1.35554902508411 43.652804816742766 242.0 +190 290 1.355628453583597 43.65280502517522 242.0 +200 290 1.35570788207303 43.65280523353331 242.0 +210 290 1.3557873105524123 43.65280544181705 242.0 +220 290 1.3558667390217471 43.65280565002643 242.0 +230 290 1.3559461674810378 43.652805858161464 242.0 +240 290 1.3560255959302876 43.65280606622214 242.0 +250 290 1.3561050243694996 43.65280627420846 242.0 +260 290 1.356184452798677 43.652806482120425 242.0 +270 290 1.3562638812178234 43.652806689958034 242.0 +280 290 1.3563433096269415 43.65280689772129 242.0 +290 290 1.356422738026035 43.65280710541019 242.0 diff --git a/Data/Input/ikonos/ikonos-1.gcp2 b/Data/Input/ikonos/ikonos-1.gcp2 new file mode 100644 index 0000000000..bf886d8298 --- /dev/null +++ b/Data/Input/ikonos/ikonos-1.gcp2 @@ -0,0 +1,901 @@ +#From file /work/scratch/osmanj/otb_valid/ikonos-1.geom +0 0 0.6653296033735767 49.92379399415211 111.0 +10 0 0.6658863963066598 49.923805207151865 111.0 +20 0 0.6664431895897024 49.923816417480445 111.0 +30 0 0.6669999832226209 49.92382762513786 111.0 +40 0 0.667556777205332 49.9238388301241 111.0 +50 0 0.6681135715377523 49.92385003243916 111.0 +60 0 0.6686703662197984 49.923861232083034 111.0 +70 0 0.6692271612513867 49.92387242905573 111.0 +80 0 0.6697839566324342 49.92388362335722 111.0 +90 0 0.6703407523628572 49.92389481498752 111.0 +100 0 0.6708975484425723 49.92390600394663 111.0 +110 0 0.6714543448714964 49.92391719023452 111.0 +120 0 0.6720111416495458 49.923928373851204 111.0 +130 0 0.6725679387766371 49.92393955479668 111.0 +140 0 0.6731247362526872 49.92395073307094 111.0 +150 0 0.6736815340776126 49.923961908673974 111.0 +160 0 0.6742383322513298 49.92397308160578 111.0 +170 0 0.6747951307737555 49.92398425186636 111.0 +180 0 0.6753519296448064 49.9239954194557 111.0 +190 0 0.6759087288643989 49.92400658437381 111.0 +200 0 0.6764655284324499 49.92401774662066 111.0 +210 0 0.6770223283488759 49.92402890619628 111.0 +220 0 0.6775791286135934 49.92404006310064 111.0 +230 0 0.6781359292265192 49.92405121733375 111.0 +240 0 0.6786927301875699 49.92406236889559 111.0 +250 0 0.6792495314966621 49.92407351778618 111.0 +260 0 0.6798063331537125 49.92408466400549 111.0 +270 0 0.6803631351586378 49.92409580755353 111.0 +280 0 0.6809199375113543 49.92410694843029 111.0 +290 0 0.681476740211779 49.92411808663577 111.0 +0 10 0.665346973430628 49.92343452621842 111.0 +10 10 0.665903762230304 49.9234457390763 111.0 +20 10 0.6664605513799304 49.92345694926305 111.0 +30 10 0.6670173408794237 49.923468156778654 111.0 +40 10 0.6675741307287003 49.92347936162312 111.0 +50 10 0.6681309209276772 49.92349056379644 111.0 +60 10 0.6686877114762707 49.92350176329862 111.0 +70 10 0.6692445023743975 49.923512960129635 111.0 +80 10 0.6698012936219742 49.923524154289495 111.0 +90 10 0.6703580852189174 49.92353534577819 111.0 +100 10 0.6709148771651438 49.92354653459572 111.0 +110 10 0.6714716694605698 49.92355772074208 111.0 +120 10 0.6720284621051122 49.92356890421727 111.0 +130 10 0.6725852550986876 49.92358008502127 111.0 +140 10 0.6731420484412126 49.923591263154094 111.0 +150 10 0.6736988421326037 49.92360243861573 111.0 +160 10 0.6742556361727777 49.92361361140617 111.0 +170 10 0.6748124305616511 49.92362478152542 111.0 +180 10 0.6753692252991405 49.92363594897346 111.0 +190 10 0.6759260203851626 49.9236471137503 111.0 +200 10 0.6764828158196341 49.92365827585593 111.0 +210 10 0.6770396116024714 49.92366943529034 111.0 +220 10 0.6775964077335914 49.92368059205354 111.0 +230 10 0.6781532042129106 49.923691746145515 111.0 +240 10 0.6787100010403455 49.923702897566265 111.0 +250 10 0.6792667982158129 49.92371404631578 111.0 +260 10 0.6798235957392296 49.923725192394066 111.0 +270 10 0.6803803936105118 49.92373633580111 111.0 +280 10 0.6809371918295765 49.92374747653691 111.0 +290 10 0.6814939903963402 49.92375861460146 111.0 +0 20 0.6653643431376702 49.9230750582579 111.0 +10 20 0.6659211278040222 49.923086270973904 111.0 +20 20 0.6664779128203155 49.923097481018814 111.0 +30 20 0.6670346981864665 49.92310868839262 111.0 +40 20 0.667591483902392 49.92311989309532 111.0 +50 20 0.6681482699680085 49.923131095126905 111.0 +60 20 0.6687050563832325 49.92314229448737 111.0 +70 20 0.6692618431479808 49.92315349117673 111.0 +80 20 0.6698186302621698 49.92316468519495 111.0 +90 20 0.6703754177257163 49.92317587654205 111.0 +100 20 0.6709322055385368 49.92318706521801 111.0 +110 20 0.671488993700548 49.923198251222836 111.0 +120 20 0.6720457822116666 49.923209434556526 111.0 +130 20 0.6726025710718089 49.923220615219066 111.0 +140 20 0.6731593602808917 49.923231793210455 111.0 +150 20 0.6737161498388318 49.92324296853069 111.0 +160 20 0.6742729397455456 49.92325414117976 111.0 +170 20 0.6748297300009497 49.92326531115768 111.0 +180 20 0.6753865206049607 49.92327647846442 111.0 +190 20 0.6759433115574955 49.9232876431 111.0 +200 20 0.6765001028584705 49.9232988050644 111.0 +210 20 0.6770568945078024 49.923309964357614 111.0 +220 20 0.6776136865054078 49.92332112097965 111.0 +230 20 0.6781704788512033 49.923332274930495 111.0 +240 20 0.6787272715451057 49.92334342621015 111.0 +250 20 0.6792840645870314 49.92335457481861 111.0 +260 20 0.6798408579768972 49.92336572075586 111.0 +270 20 0.6803976517146197 49.92337686402191 111.0 +280 20 0.6809544458001155 49.923388004616754 111.0 +290 20 0.6815112402333013 49.923399142540376 111.0 +0 30 0.6653817124947127 49.92271559027054 111.0 +10 30 0.6659384930278238 49.92272680284468 111.0 +20 30 0.6664952739108669 49.92273801274775 111.0 +30 30 0.6670520551437588 49.92274921997976 111.0 +40 30 0.667608836726416 49.922760424540684 111.0 +50 30 0.6681656186587551 49.92277162643054 111.0 +60 30 0.6687224009406928 49.922782825649314 111.0 +70 30 0.6692791835721456 49.922794022196996 111.0 +80 30 0.66983596655303 49.92280521607359 111.0 +90 30 0.6703927498832629 49.922816407279086 111.0 +100 30 0.6709495335627607 49.92282759581349 111.0 +110 30 0.6715063175914401 49.92283878167678 111.0 +120 30 0.6720631019692177 49.922849964868966 111.0 +130 30 0.6726198866960101 49.922861145390044 111.0 +140 30 0.673176671771734 49.92287232324001 111.0 +150 30 0.673733457196306 49.92288349841884 111.0 +160 30 0.6742902429696426 49.92289467092656 111.0 +170 30 0.6748470290916605 49.92290584076314 111.0 +180 30 0.6754038155622764 49.92291700792859 111.0 +190 30 0.6759606023814068 49.92292817242291 111.0 +200 30 0.6765173895489683 49.922939334246074 111.0 +210 30 0.6770741770648778 49.922950493398105 111.0 +220 30 0.6776309649290517 49.92296164987898 111.0 +230 30 0.6781877531414068 49.922972803688694 111.0 +240 30 0.6787445417018595 49.92298395482726 111.0 +250 30 0.6793013306103265 49.92299510329465 111.0 +260 30 0.6798581198667247 49.92300624909088 111.0 +270 30 0.6804149094709705 49.92301739221594 111.0 +280 30 0.6809716994229805 49.923028532669825 111.0 +290 30 0.6815284897226715 49.923039670452525 111.0 +0 40 0.6653990815017644 49.922356122256346 111.0 +10 40 0.6659558579017175 49.92236733468862 111.0 +20 40 0.6665126346515937 49.92237854444986 111.0 +30 40 0.6670694117513095 49.92238975154007 111.0 +40 40 0.6676261892007815 49.92240095595923 111.0 +50 40 0.6681829669999264 49.922412157707356 111.0 +60 40 0.6687397451486606 49.92242335678443 111.0 +70 40 0.6692965236469011 49.92243455319045 111.0 +80 40 0.669853302494564 49.92244574692541 111.0 +90 40 0.6704100816915662 49.92245693798931 111.0 +100 40 0.6709668612378245 49.92246812638215 111.0 +110 40 0.6715236411332551 49.92247931210392 111.0 +120 40 0.6720804213777749 49.922490495154605 111.0 +130 40 0.6726372019713004 49.92250167553422 111.0 +140 40 0.6731939829137483 49.92251285324275 111.0 +150 40 0.6737507642050353 49.9225240282802 111.0 +160 40 0.6743075458450778 49.92253520064655 111.0 +170 40 0.6748643278337926 49.922546370341806 111.0 +180 40 0.6754211101710962 49.92255753736597 111.0 +190 40 0.6759778928569055 49.92256870171902 111.0 +200 40 0.6765346758911367 49.92257986340096 111.0 +210 40 0.6770914592737067 49.9225910224118 111.0 +220 40 0.6776482430045323 49.92260217875152 111.0 +230 40 0.6782050270835298 49.92261333242011 111.0 +240 40 0.678761811510616 49.92262448341758 111.0 +250 40 0.6793185962857075 49.92263563174392 111.0 +260 40 0.6798753814087211 49.92264677739912 111.0 +270 40 0.6804321668795731 49.922657920383195 111.0 +280 40 0.6809889526981805 49.92266906069612 111.0 +290 40 0.6815457388644598 49.9226801983379 111.0 +0 50 0.6654164501588345 49.92199665421532 111.0 +10 50 0.6659732224257128 49.92200786650573 111.0 +20 50 0.6665299950425051 49.92201907612514 111.0 +30 50 0.6670867680091278 49.922030283073546 111.0 +40 50 0.6676435413254976 49.92204148735095 111.0 +50 50 0.6682003149915313 49.92205268895734 111.0 +60 50 0.6687570890071454 49.92206388789272 111.0 +70 50 0.6693138633722563 49.92207508415708 111.0 +80 50 0.6698706380867808 49.92208627775042 111.0 +90 50 0.6704274131506356 49.922097468672725 111.0 +100 50 0.6709841885637371 49.922108656923996 111.0 +110 50 0.6715409643260022 49.92211984250424 111.0 +120 50 0.6720977404373472 49.922131025413435 111.0 +130 50 0.6726545168976888 49.92214220565159 111.0 +140 50 0.673211293706944 49.9221533832187 111.0 +150 50 0.6737680708650289 49.92216455811475 111.0 +160 50 0.6743248483718605 49.922175730339745 111.0 +170 50 0.6748816262273551 49.922186899893674 111.0 +180 50 0.6754384044314297 49.922198066776545 111.0 +190 50 0.6759951829840006 49.922209230988344 111.0 +200 50 0.6765519618849847 49.92222039252906 111.0 +210 50 0.6771087411342984 49.9222315513987 111.0 +220 50 0.6776655207318585 49.92224270759726 111.0 +230 50 0.6782223006775816 49.92225386112474 111.0 +240 50 0.6787790809713844 49.92226501198112 111.0 +250 50 0.6793358616131834 49.922276160166405 111.0 +260 50 0.6798926426028953 49.92228730568059 111.0 +270 50 0.6804494239404368 49.92229844852367 111.0 +280 50 0.6810062056257246 49.92230958869564 111.0 +290 50 0.6815629876586752 49.9223207261965 111.0 +0 60 0.6654338184659322 49.921637186147464 111.0 +10 60 0.6659905865998187 49.92164839829601 111.0 +20 60 0.6665473550836101 49.92165960777359 111.0 +30 60 0.6671041239172228 49.9216708145802 111.0 +40 60 0.6676608931005736 49.92168201871585 111.0 +50 60 0.6682176626335792 49.921693220180515 111.0 +60 60 0.6687744325161559 49.921704418974194 111.0 +70 60 0.6693312027482206 49.92171561509689 111.0 +80 60 0.6698879733296897 49.921726808548605 111.0 +90 60 0.67044474426048 49.921737999329316 111.0 +100 60 0.6710015155405079 49.92174918743903 111.0 +110 60 0.6715582871696903 49.92176037287775 111.0 +120 60 0.6721150591479437 49.921771555645456 111.0 +130 60 0.6726718314751846 49.921782735742156 111.0 +140 60 0.6732286041513299 49.92179391316784 111.0 +150 60 0.6737853771762959 49.9218050879225 111.0 +160 60 0.6743421505499995 49.92181626000614 111.0 +170 60 0.6748989242723571 49.92182742941875 111.0 +180 60 0.6754556983432856 49.92183859616033 111.0 +190 60 0.6760124727627014 49.92184976023087 111.0 +200 60 0.6765692475305213 49.92186092163037 111.0 +210 60 0.6771260226466618 49.921872080358824 111.0 +220 60 0.6776827981110396 49.92188323641623 111.0 +230 60 0.6782395739235713 49.92189438980258 111.0 +240 60 0.6787963500841736 49.921905540517876 111.0 +250 60 0.6793531265927633 49.921916688562106 111.0 +260 60 0.6799099034492567 49.92192783393528 111.0 +270 60 0.6804666806535706 49.92193897663737 111.0 +280 60 0.6810234582056218 49.92195011666839 111.0 +290 60 0.6815802361053268 49.92196125402833 111.0 +0 70 0.6654511864230667 49.92127771805277 111.0 +10 70 0.6660079504240444 49.921288930059454 111.0 +20 70 0.6665647147749179 49.92130013939521 111.0 +30 70 0.6671214794756037 49.92131134606003 111.0 +40 70 0.6676782445260185 49.921322550053915 111.0 +50 70 0.6682350099260789 49.92133375137686 111.0 +60 70 0.6687917756757015 49.921344950028846 111.0 +70 70 0.6693485417748029 49.92135614600989 111.0 +80 70 0.6699053082232996 49.92136733931998 111.0 +90 70 0.6704620750211086 49.9213785299591 111.0 +100 70 0.671018842168146 49.92138971792726 111.0 +110 70 0.6715756096643288 49.92140090322445 111.0 +120 70 0.6721323775095736 49.92141208585067 111.0 +130 70 0.6726891457037968 49.92142326580591 111.0 +140 70 0.6732459142469153 49.92143444309018 111.0 +150 70 0.6738026831388455 49.92144561770345 111.0 +160 70 0.6743594523795041 49.92145678964573 111.0 +170 70 0.6749162219688079 49.92146795891702 111.0 +180 70 0.6754729919066732 49.921479125517315 111.0 +190 70 0.6760297621930169 49.9214902894466 111.0 +200 70 0.6765865328277556 49.92150145070488 111.0 +210 70 0.677143303810806 49.92151260929215 111.0 +220 70 0.6777000751420845 49.921523765208406 111.0 +230 70 0.678256846821508 49.92153491845364 111.0 +240 70 0.6788136188489929 49.921546069027855 111.0 +250 70 0.6793703912244562 49.921557216931035 111.0 +260 70 0.6799271639478142 49.92156836216318 111.0 +270 70 0.6804839370189837 49.92157950472429 111.0 +280 70 0.6810407104378813 49.92159064461436 111.0 +290 70 0.6815974842044237 49.92160178183339 111.0 +0 80 0.6654685540302469 49.92091824993124 111.0 +10 80 0.6660253138983989 49.92092946179607 111.0 +20 80 0.6665820741164376 49.92094067099 111.0 +30 80 0.6671388346842795 49.92095187751303 111.0 +40 80 0.6676955956018413 49.92096308136516 111.0 +50 80 0.6682523568690397 49.920974282546375 111.0 +60 80 0.6688091184857912 49.92098548105668 111.0 +70 80 0.6693658804520124 49.92099667689607 111.0 +80 80 0.6699226427676199 49.92100787006453 111.0 +90 80 0.6704794054325304 49.92101906056207 111.0 +100 80 0.6710361684466605 49.921030248388675 111.0 +110 80 0.6715929318099267 49.921041433544346 111.0 +120 80 0.6721496955222459 49.92105261602908 111.0 +130 80 0.6727064595835345 49.92106379584286 111.0 +140 80 0.6732632239937092 49.92107497298571 111.0 +150 80 0.6738199887526866 49.92108614745759 111.0 +160 80 0.6743767538603834 49.92109731925853 111.0 +170 80 0.6749335193167162 49.9211084883885 111.0 +180 80 0.6754902851216016 49.92111965484751 111.0 +190 80 0.6760470512749563 49.92113081863554 111.0 +200 80 0.676603817776697 49.921141979752605 111.0 +210 80 0.6771605846267401 49.92115313819869 111.0 +220 80 0.6777173518250025 49.921164293973796 111.0 +230 80 0.6782741193714007 49.921175447077914 111.0 +240 80 0.6788308872658514 49.921186597511046 111.0 +250 80 0.6793876555082713 49.921197745273176 111.0 +260 80 0.6799444240985769 49.92120889036431 111.0 +270 80 0.680501193036685 49.92122003278444 111.0 +280 80 0.6810579623225121 49.92123117253357 111.0 +290 80 0.6816147319559751 49.92124230961168 111.0 +0 90 0.6654859212874821 49.92055878178287 111.0 +10 90 0.6660426770228915 49.92056999350585 111.0 +20 90 0.6665994331081785 49.92058120255796 111.0 +30 90 0.6671561895432596 49.92059240893921 111.0 +40 90 0.6677129463280514 49.92060361264958 111.0 +50 90 0.6682697034624708 49.92061481368907 111.0 +60 90 0.6688264609464342 49.92062601205769 111.0 +70 90 0.6693832187798582 49.92063720775542 111.0 +80 90 0.6699399769626595 49.92064840078227 111.0 +90 90 0.6704967354947546 49.92065959113822 111.0 +100 90 0.6710534943760603 49.92067077882327 111.0 +110 90 0.6716102536064932 49.920681963837424 111.0 +120 90 0.6721670131859697 49.920693146180675 111.0 +130 90 0.6727237731144068 49.92070432585301 111.0 +140 90 0.6732805333917208 49.920715502854435 111.0 +150 90 0.6738372940178284 49.92072667718494 111.0 +160 90 0.6743940549926465 49.920737848844524 111.0 +170 90 0.6749508163160914 49.920749017833174 111.0 +180 90 0.6755075779880799 49.9207601841509 111.0 +190 90 0.6760643400085287 49.92077134779769 111.0 +200 90 0.6766211023773543 49.92078250877354 111.0 +210 90 0.6771778650944733 49.92079366707844 111.0 +220 90 0.6777346281598026 49.9208048227124 111.0 +230 90 0.6782913915732586 49.9208159756754 111.0 +240 90 0.6788481553347581 49.92082712596745 111.0 +250 90 0.6794049194442177 49.92083827358854 111.0 +260 90 0.6799616839015539 49.92084941853866 111.0 +270 90 0.6805184487066837 49.92086056081781 111.0 +280 90 0.6810752138595234 49.92087170042599 111.0 +290 90 0.6816319793599899 49.92088283736319 111.0 +0 100 0.6655032881947814 49.92019931360768 111.0 +10 100 0.6660600397975311 49.9202105251888 111.0 +20 100 0.6666167917501494 49.92022173409909 111.0 +30 100 0.6671735440525528 49.92023294033855 111.0 +40 100 0.6677302967046579 49.92024414390717 111.0 +50 100 0.6682870497063813 49.92025534480494 111.0 +60 100 0.6688438030576396 49.92026654303188 111.0 +70 100 0.6694005567583495 49.92027773858796 111.0 +80 100 0.6699573108084275 49.92028893147319 111.0 +90 100 0.6705140652077904 49.92030012168755 111.0 +100 100 0.6710708199563548 49.92031130923106 111.0 +110 100 0.6716275750540373 49.920322494103694 111.0 +120 100 0.6721843305007543 49.92033367630546 111.0 +130 100 0.6727410862964227 49.92034485583635 111.0 +140 100 0.6732978424409591 49.920356032696354 111.0 +150 100 0.6738545989342801 49.92036720688548 111.0 +160 100 0.6744113557763024 49.92037837840372 111.0 +170 100 0.6749681129669425 49.920389547251055 111.0 +180 100 0.6755248705061172 49.9204007134275 111.0 +190 100 0.676081628393743 49.920411876933045 111.0 +200 100 0.6766383866297366 49.92042303776768 111.0 +210 100 0.6771951452140147 49.920434195931406 111.0 +220 100 0.6777519041464938 49.92044535142421 111.0 +230 100 0.6783086634270907 49.92045650424611 111.0 +240 100 0.678865423055722 49.92046765439708 111.0 +250 100 0.6794221830323043 49.92047880187712 111.0 +260 100 0.6799789433567544 49.92048994668623 111.0 +270 100 0.6805357040289888 49.9205010888244 111.0 +280 100 0.6810924650489242 49.92051222829164 111.0 +290 100 0.6816492264164772 49.92052336508793 111.0 +0 110 0.665520654752154 49.91983984540565 111.0 +10 110 0.6660774022223273 49.91985105684492 111.0 +20 110 0.6666341500423598 49.91986226561339 111.0 +30 110 0.6671908982121685 49.919873471711064 111.0 +40 110 0.6677476467316696 49.919884675137936 111.0 +50 110 0.6683043956007801 49.919895875894 111.0 +60 110 0.6688611448194165 49.919907073979246 111.0 +70 110 0.6694178943874953 49.919918269393676 111.0 +80 110 0.6699746443049333 49.91992946213729 111.0 +90 110 0.6705313945716469 49.91994065221007 111.0 +100 110 0.671088145187553 49.91995183961203 111.0 +110 110 0.671644896152568 49.919963024343154 111.0 +120 110 0.6722016474666087 49.91997420640344 111.0 +130 110 0.6727583991295917 49.919985385792884 111.0 +140 110 0.6733151511414335 49.91999656251148 111.0 +150 110 0.6738719035020508 49.92000773655922 111.0 +160 110 0.6744286562113604 49.92001890793611 111.0 +170 110 0.6749854092692787 49.92003007664214 111.0 +180 110 0.6755421626757225 49.92004124267731 111.0 +190 110 0.6760989164306085 49.920052406041606 111.0 +200 110 0.6766556705338531 49.920063566735024 111.0 +210 110 0.6772124249853733 49.920074724757576 111.0 +220 110 0.6777691797850853 49.92008588010924 111.0 +230 110 0.6783259349329062 49.920097032790025 111.0 +240 110 0.6788826904287523 49.92010818279992 111.0 +250 110 0.6794394462725404 49.92011933013892 111.0 +260 110 0.6799962024641872 49.920130474807024 111.0 +270 110 0.6805529590036093 49.92014161680422 111.0 +280 110 0.6811097158907234 49.92015275613051 111.0 +290 110 0.6816664731254463 49.9201638927859 111.0 +0 120 0.665538020959609 49.91948037717678 111.0 +10 120 0.6660947642972886 49.9194915884742 111.0 +20 120 0.6666515079848186 49.91950279710086 111.0 +30 120 0.6672082520221156 49.919514003056754 111.0 +40 120 0.667764996409096 49.91952520634187 111.0 +50 120 0.6683217411456767 49.91953640695622 111.0 +60 120 0.668878486231774 49.91954760489979 111.0 +70 120 0.6694352316673048 49.919558800172574 111.0 +80 120 0.6699919774521857 49.919569992774576 111.0 +90 120 0.6705487235863332 49.919581182705784 111.0 +100 120 0.6711054700696639 49.919592369966196 111.0 +110 120 0.6716622169020947 49.919603554555806 111.0 +120 120 0.672218964083542 49.91961473647461 111.0 +130 120 0.6727757116139225 49.919625915722605 111.0 +140 120 0.6733324594931528 49.919637092299794 111.0 +150 120 0.6738892077211496 49.91964826620616 111.0 +160 120 0.6744459562978294 49.9196594374417 111.0 +170 120 0.6750027052231091 49.91967060600642 111.0 +180 120 0.6755594544969051 49.919681771900315 111.0 +190 120 0.6761162041191342 49.919692935123365 111.0 +200 120 0.676672954089713 49.919704095675584 111.0 +210 120 0.6772297044085581 49.91971525355696 111.0 +220 120 0.6777864550755862 49.91972640876749 111.0 +230 120 0.678343206090714 49.91973756130716 111.0 +240 120 0.6788999574538581 49.91974871117598 111.0 +250 120 0.6794567091649351 49.919759858373936 111.0 +260 120 0.6800134612238617 49.91977100290104 111.0 +270 120 0.6805702136305546 49.919782144757264 111.0 +280 120 0.6811269663849304 49.91979328394262 111.0 +290 120 0.6816837194869059 49.91980442045709 111.0 +0 130 0.6655553868171555 49.91912090892108 111.0 +10 130 0.6661121260224248 49.919132120076654 111.0 +20 130 0.6666688655775351 49.919143328561496 111.0 +30 130 0.6672256054824034 49.919154534375615 111.0 +40 130 0.6677823457369461 49.91916573751899 111.0 +50 130 0.6683390863410799 49.91917693799162 111.0 +60 130 0.6688958272947214 49.91918813579351 111.0 +70 130 0.6694525685977871 49.919199330924656 111.0 +80 130 0.670009310250194 49.91921052338504 111.0 +90 130 0.6705660522518584 49.91922171317467 111.0 +100 130 0.6711227946026969 49.91923290029354 111.0 +110 130 0.6716795373026263 49.91924408474164 111.0 +120 130 0.6722362803515632 49.919255266518974 111.0 +130 130 0.6727930237494243 49.919266445625524 111.0 +140 130 0.6733497674961262 49.9192776220613 111.0 +150 130 0.6739065115915853 49.91928879582629 111.0 +160 130 0.6744632560357187 49.9192999669205 111.0 +170 130 0.6750200008284426 49.91931113534391 111.0 +180 130 0.675576745969674 49.91932230109653 111.0 +190 130 0.6761334914593292 49.91933346417834 111.0 +200 130 0.6766902372973251 49.91934462458935 111.0 +210 130 0.6772469834835785 49.91935578232955 111.0 +220 130 0.6778037300180056 49.91936693739894 111.0 +230 130 0.6783604769005234 49.91937808979751 111.0 +240 130 0.6789172241310484 49.91938923952526 111.0 +250 130 0.6794739717094973 49.919400386582176 111.0 +260 130 0.6800307196357869 49.91941153096827 111.0 +270 130 0.6805874679098336 49.919422672683524 111.0 +280 130 0.6811442165315542 49.91943381172794 111.0 +290 130 0.6817009655008653 49.919444948101514 111.0 +0 140 0.6655727523248026 49.91876144063855 111.0 +10 140 0.6661294873977444 49.918772651652276 111.0 +20 140 0.6666862228205183 49.91878385999531 111.0 +30 140 0.667242958593041 49.918795065667645 111.0 +40 140 0.6677996947152289 49.91880626866928 111.0 +50 140 0.668356431186999 49.9188174690002 111.0 +60 140 0.6689131680082676 49.91882866666042 111.0 +70 140 0.6694699051789514 49.918839861649914 111.0 +80 140 0.6700266426989672 49.918851053968694 111.0 +90 140 0.6705833805682315 49.91886224361675 111.0 +100 140 0.6711401187866609 49.918873430594076 111.0 +110 140 0.6716968573541721 49.91888461490067 111.0 +120 140 0.6722535962706817 49.918895796536525 111.0 +130 140 0.6728103355361064 49.918906975501635 111.0 +140 140 0.6733670751503628 49.91891815179601 111.0 +150 140 0.6739238151133675 49.918929325419626 111.0 +160 140 0.6744805554250372 49.91894049637249 111.0 +170 140 0.6750372960852886 49.9189516646546 111.0 +180 140 0.6755940370940382 49.91896283026594 111.0 +190 140 0.6761507784512027 49.91897399320652 111.0 +200 140 0.6767075201566989 49.91898515347632 111.0 +210 140 0.6772642622104433 49.918996311075354 111.0 +220 140 0.6778210046123525 49.919007466003606 111.0 +230 140 0.6783777473623434 49.91901861826107 111.0 +240 140 0.6789344904603324 49.919029767847746 111.0 +250 140 0.6794912339062363 49.919040914763634 111.0 +260 140 0.6800479776999717 49.91905205900873 111.0 +270 140 0.6806047218414554 49.91906320058301 111.0 +280 140 0.6811614663306038 49.91907433948649 111.0 +290 140 0.6817182111673338 49.91908547571917 111.0 +0 150 0.6655901174825596 49.91840197232918 111.0 +10 150 0.666146848423257 49.91841318320106 111.0 +20 150 0.6667035797137774 49.91842439140229 111.0 +30 150 0.6672603113540374 49.918435596932845 111.0 +40 150 0.6678170433439538 49.91844679979274 111.0 +50 150 0.668373775683443 49.91845799998196 111.0 +60 150 0.6689305083724219 49.9184691975005 111.0 +70 150 0.6694872414108067 49.91848039234836 111.0 +80 150 0.6700439747985145 49.918491584525526 111.0 +90 150 0.6706007085354618 49.91850277403201 111.0 +100 150 0.6711574426215651 49.9185139608678 111.0 +110 150 0.6717141770567411 49.91852514503288 111.0 +120 150 0.6722709118409064 49.91853632652727 111.0 +130 150 0.6728276469739778 49.91854750535094 111.0 +140 150 0.6733843824558717 49.91855868150391 111.0 +150 150 0.6739411182865049 49.91856985498616 111.0 +160 150 0.6744978544657941 49.918581025797685 111.0 +170 150 0.675054590993656 49.91859219393849 111.0 +180 150 0.6756113278700069 49.918603359408564 111.0 +190 150 0.6761680650947638 49.9186145222079 111.0 +200 150 0.6767248026678432 49.918625682336504 111.0 +210 150 0.6772815405891618 49.91863683979437 111.0 +220 150 0.6778382788586361 49.918647994581484 111.0 +230 150 0.678395017476183 49.91865914669785 111.0 +240 150 0.6789517564417191 49.91867029614346 111.0 +250 150 0.679508495755161 49.91868144291831 111.0 +260 150 0.6800652354164254 49.9186925870224 111.0 +270 150 0.6806219754254289 49.918703728455725 111.0 +280 150 0.6811787157820883 49.91871486721827 111.0 +290 150 0.6817354564863201 49.91872600331005 111.0 +0 160 0.6656074822904354 49.91804250399297 111.0 +10 160 0.6661642090989714 49.918053714723015 111.0 +20 160 0.6667209362573214 49.918064922782435 111.0 +30 160 0.667277663765402 49.91807612817122 111.0 +40 160 0.6678343916231296 49.91808733088938 111.0 +50 160 0.6683911198304212 49.91809853093689 111.0 +60 160 0.6689478483871932 49.91810972831376 111.0 +70 160 0.6695045772933623 49.91812092301998 111.0 +80 160 0.6700613065488451 49.91813211505554 111.0 +90 160 0.6706180361535583 49.918143304420454 111.0 +100 160 0.6711747661074186 49.918154491114706 111.0 +110 160 0.6717314964103422 49.91816567513829 111.0 +120 160 0.6722882270622464 49.9181768564912 111.0 +130 160 0.6728449580630474 49.91818803517344 111.0 +140 160 0.6734016894126621 49.918199211185005 111.0 +150 160 0.6739584211110069 49.918210384525885 111.0 +160 160 0.6745151531579986 49.91822155519608 111.0 +170 160 0.6750718855535538 49.91823272319558 111.0 +180 160 0.6756286182975892 49.91824388852439 111.0 +190 160 0.6761853513900213 49.91825505118249 111.0 +200 160 0.6767420848307671 49.91826621116989 111.0 +210 160 0.6772988186197428 49.91827736848659 111.0 +220 160 0.6778555527568655 49.918288523132574 111.0 +230 160 0.6784122872420516 49.91829967510784 111.0 +240 160 0.6789690220752177 49.91831082441239 111.0 +250 160 0.6795257572562806 49.918321971046204 111.0 +260 160 0.680082492785157 49.9183331150093 111.0 +270 160 0.6806392286617635 49.91834425630166 111.0 +280 160 0.6811959648860167 49.918355394923275 111.0 +290 160 0.6817527014578335 49.91836653087415 111.0 +0 170 0.6656248467484394 49.917683035629935 111.0 +10 170 0.666181569424897 49.91769424621814 111.0 +20 170 0.6667382924511596 49.917705454135756 111.0 +30 170 0.6672950158271436 49.91771665938277 111.0 +40 170 0.6678517395527657 49.917727861959186 111.0 +50 170 0.6684084636279426 49.91773906186499 111.0 +60 170 0.6689651880525909 49.917750259100195 111.0 +70 170 0.6695219128266271 49.917761453664774 111.0 +80 170 0.670078637949968 49.91777264555874 111.0 +90 170 0.6706353634225302 49.917783834782085 111.0 +100 170 0.6711920892442303 49.9177950213348 111.0 +110 170 0.671748815414985 49.917806205216884 111.0 +120 170 0.6723055419347109 49.917817386428325 111.0 +130 170 0.6728622688033247 49.917828564969135 111.0 +140 170 0.6734189960207431 49.9178397408393 111.0 +150 170 0.6739757235868824 49.91785091403881 111.0 +160 170 0.6745324515016597 49.917862084567666 111.0 +170 170 0.6750891797649914 49.91787325242587 111.0 +180 170 0.6756459083767942 49.917884417613415 111.0 +190 170 0.6762026373369847 49.91789558013029 111.0 +200 170 0.6767593666454798 49.917906739976495 111.0 +210 170 0.6773160963021958 49.91791789715202 111.0 +220 170 0.6778728263070497 49.91792905165688 111.0 +230 170 0.6784295566599579 49.91794020349105 111.0 +240 170 0.6789862873608372 49.917951352654526 111.0 +250 170 0.6795430184096042 49.91796249914732 111.0 +260 170 0.6800997498061756 49.917973642969415 111.0 +270 170 0.6806564815504681 49.91798478412081 111.0 +280 170 0.6812132136423983 49.917995922601506 111.0 +290 170 0.6817699460818829 49.91800705841148 111.0 +0 180 0.6656422108565805 49.91732356724006 111.0 +10 180 0.6661989294010429 49.917334777686435 111.0 +20 180 0.6667556482953011 49.91734598546224 111.0 +30 180 0.6673123675392716 49.91735719056749 111.0 +40 180 0.6678690871328711 49.91736839300217 111.0 +50 180 0.6684258070760163 49.91737959276628 111.0 +60 180 0.6689825273686238 49.91739078985981 111.0 +70 180 0.6695392480106103 49.91740198428276 111.0 +80 180 0.6700959690018923 49.917413176035126 111.0 +90 180 0.6706526903423865 49.9174243651169 111.0 +100 180 0.6712094120320097 49.91743555152808 111.0 +110 180 0.6717661340706783 49.91744673526866 111.0 +120 180 0.6723228564583091 49.91745791633864 111.0 +130 180 0.6728795791948186 49.91746909473802 111.0 +140 180 0.6734363022801236 49.91748027046678 111.0 +150 180 0.6739930257141407 49.91749144352493 111.0 +160 180 0.6745497494967865 49.91750261391246 111.0 +170 180 0.6751064736279777 49.91751378162937 111.0 +180 180 0.675663198107631 49.91752494667565 111.0 +190 180 0.6762199229356629 49.91753610905129 111.0 +200 180 0.6767766481119903 49.9175472687563 111.0 +210 180 0.6773333736365297 49.917558425790666 111.0 +220 180 0.6778900995091978 49.91756958015439 111.0 +230 180 0.6784468257299112 49.917580731847465 111.0 +240 180 0.6790035522985867 49.91759188086989 111.0 +250 180 0.6795602792151407 49.91760302722165 111.0 +260 180 0.6801170064794902 49.91761417090275 111.0 +270 180 0.6806737340915517 49.91762531191319 111.0 +280 180 0.681230462051242 49.91763645025296 111.0 +290 180 0.6817871903584777 49.91764758592205 111.0 +0 190 0.665659574614868 49.91696409882335 111.0 +10 190 0.6662162890274181 49.91697530912789 111.0 +20 190 0.6667730037897549 49.9169865167619 111.0 +30 190 0.6673297189017949 49.91699772172538 111.0 +40 190 0.667886434363455 49.917008924018326 111.0 +50 190 0.6684431501746515 49.91702012364074 111.0 +60 190 0.6689998663353014 49.9170313205926 111.0 +70 190 0.669556582845321 49.91704251487392 111.0 +80 190 0.6701132997046273 49.91705370648469 111.0 +90 190 0.6706700169131365 49.9170648954249 111.0 +100 190 0.6712267344707656 49.917076081694546 111.0 +110 190 0.6717834523774312 49.91708726529363 111.0 +120 190 0.6723401706330498 49.917098446222155 111.0 +130 190 0.6728968892375382 49.9171096244801 111.0 +140 190 0.6734536081908129 49.917120800067465 111.0 +150 190 0.6740103274927907 49.91713197298425 111.0 +160 190 0.6745670471433881 49.917143143230454 111.0 +170 190 0.6751237671425219 49.91715431080606 111.0 +180 190 0.6756804874901087 49.91716547571108 111.0 +190 190 0.676237208186065 49.9171766379455 111.0 +200 190 0.6767939292303078 49.917187797509314 111.0 +210 190 0.6773506506227535 49.91719895440252 111.0 +220 190 0.6779073723633189 49.91721010862512 111.0 +230 190 0.6784640944519206 49.9172212601771 111.0 +240 190 0.6790208168884752 49.917232409058464 111.0 +250 190 0.6795775396728995 49.9172435552692 111.0 +260 190 0.6801342628051101 49.917254698809316 111.0 +270 190 0.6806909862850237 49.91726583967879 111.0 +280 190 0.6812477101125569 49.917276977877634 111.0 +290 190 0.6818044342876265 49.91728811340583 111.0 +0 200 0.665676938023311 49.91660463037981 111.0 +10 200 0.6662336483040319 49.91661584054251 111.0 +20 200 0.6667903589345302 49.91662704803473 111.0 +30 200 0.6673470699147228 49.916638252856444 111.0 +40 200 0.6679037812445264 49.91664945500766 111.0 +50 200 0.6684604929238575 49.91666065448837 111.0 +60 200 0.6690172049526325 49.916671851298574 111.0 +70 200 0.6695739173307684 49.91668304543826 111.0 +80 200 0.6701306300581819 49.91669423690743 111.0 +90 200 0.6706873431347893 49.916705425706084 111.0 +100 200 0.6712440565605075 49.916716611834204 111.0 +110 200 0.6718007703352529 49.91672779529179 111.0 +120 200 0.6723574844589424 49.916738976078854 111.0 +130 200 0.6729141989314926 49.91675015419537 111.0 +140 200 0.6734709137528201 49.91676132964134 111.0 +150 200 0.6740276289228415 49.91677250241677 111.0 +160 200 0.6745843444414736 49.916783672521646 111.0 +170 200 0.675141060308633 49.91679483995596 111.0 +180 200 0.6756977765242362 49.91680600471972 111.0 +190 200 0.6762544930882002 49.91681716681291 111.0 +200 200 0.6768112100004413 49.91682832623554 111.0 +210 200 0.6773679272608765 49.91683948298759 111.0 +220 200 0.677924644869422 49.91685063706906 111.0 +230 200 0.678481362825995 49.916861788479956 111.0 +240 200 0.6790380811305119 49.916872937220255 111.0 +250 200 0.6795947997828894 49.91688408328997 111.0 +260 200 0.6801515187830441 49.91689522668909 111.0 +270 200 0.6807082381308929 49.91690636741762 111.0 +280 200 0.6812649578263521 49.91691750547554 111.0 +290 200 0.6818216778693388 49.91692864086285 111.0 +0 210 0.6656943010819185 49.91624516190943 111.0 +10 210 0.6662510072308931 49.91625637193031 111.0 +20 210 0.6668077137296362 49.91626757928072 111.0 +30 210 0.6673644205780644 49.91627878396068 111.0 +40 210 0.6679211277760945 49.91628998597017 111.0 +50 210 0.6684778353236429 49.91630118530918 111.0 +60 210 0.6690345432206264 49.916312381977725 111.0 +70 210 0.6695912514669616 49.91632357597578 111.0 +80 210 0.6701479600625652 49.91633476730336 111.0 +90 210 0.6707046690073537 49.91634595596045 111.0 +100 210 0.671261378301244 49.916357141947046 111.0 +110 210 0.6718180879441524 49.91636832526314 111.0 +120 210 0.6723747979359959 49.91637950590874 111.0 +130 210 0.672931508276691 49.91639068388383 111.0 +140 210 0.6734882189661542 49.91640185918842 111.0 +150 210 0.6740449300043024 49.916413031822486 111.0 +160 210 0.6746016413910522 49.916424201786036 111.0 +170 210 0.6751583531263201 49.91643536907906 111.0 +180 210 0.675715065210023 49.91644653370156 111.0 +190 210 0.6762717776420774 49.916457695653534 111.0 +200 210 0.6768284904224 49.91646885493497 111.0 +210 210 0.6773852035509075 49.916480011545865 111.0 +220 210 0.6779419170275165 49.916491165486214 111.0 +230 210 0.6784986308521438 49.91650231675602 111.0 +240 210 0.6790553450247059 49.916513465355266 111.0 +250 210 0.6796120595451196 49.91652461128396 111.0 +260 210 0.6801687744133015 49.916535754542096 111.0 +270 210 0.6807254896291683 49.91654689512966 111.0 +280 210 0.6812822051926367 49.91655803304666 111.0 +290 210 0.6818389211036234 49.91656916829309 111.0 +0 220 0.6657116637906998 49.91588569341222 111.0 +10 220 0.6662683658080111 49.91589690329127 111.0 +20 220 0.666825068175082 49.91590811049989 111.0 +30 220 0.6673817708918288 49.91591931503808 111.0 +40 220 0.6679384739581684 49.915930516905846 111.0 +50 220 0.6684951773740173 49.91594171610317 111.0 +60 220 0.6690518811392921 49.91595291263005 111.0 +70 220 0.6696085852539098 49.915964106486484 111.0 +80 220 0.6701652897177865 49.91597529767247 111.0 +90 220 0.6707219945308392 49.915986486188004 111.0 +100 220 0.6712786996929846 49.91599767203307 111.0 +110 220 0.671835405204139 49.91600885520768 111.0 +120 220 0.6723921110642195 49.916020035711824 111.0 +130 220 0.6729488172731424 49.91603121354549 111.0 +140 220 0.6735055238308244 49.91604238870868 111.0 +150 220 0.6740622307371824 49.916053561201394 111.0 +160 220 0.6746189379921328 49.916064731023624 111.0 +170 220 0.6751756455955924 49.916075898175365 111.0 +180 220 0.6757323535474778 49.91608706265661 111.0 +190 220 0.6762890618477058 49.916098224467355 111.0 +200 220 0.6768457704961929 49.916109383607605 111.0 +210 220 0.6774024794928558 49.916120540077344 111.0 +220 220 0.6779591888376112 49.91613169387658 111.0 +230 220 0.6785158985303757 49.9161428450053 111.0 +240 220 0.6790726085710662 49.916153993463496 111.0 +250 220 0.6796293189595992 49.91616513925117 111.0 +260 220 0.6801860296958913 49.91617628236832 111.0 +270 220 0.6807427407798593 49.916187422814936 111.0 +280 220 0.6812994522114199 49.91619856059101 111.0 +290 220 0.6818561639904895 49.91620969569656 111.0 +0 230 0.6657290261496639 49.91552622488817 111.0 +10 230 0.6662857240353951 49.91553743462539 111.0 +20 230 0.6668424222708766 49.915548641692226 111.0 +30 230 0.6673991208560252 49.91555984608866 111.0 +40 230 0.6679558197907572 49.915571047814694 111.0 +50 230 0.6685125190749897 49.91558224687033 111.0 +60 230 0.669069218708639 49.91559344325555 111.0 +70 230 0.6696259186916218 49.915604636970365 111.0 +80 230 0.6701826190238549 49.915615828014765 111.0 +90 230 0.6707393197052548 49.91562701638874 111.0 +100 230 0.6712960207357381 49.91563820209229 111.0 +110 230 0.6718527221152216 49.915649385125406 111.0 +120 230 0.672409423843622 49.91566056548809 111.0 +130 230 0.6729661259208559 49.91567174318034 111.0 +140 230 0.6735228283468399 49.915682918202144 111.0 +150 230 0.6740795311214905 49.9156940905535 111.0 +160 230 0.6746362342447247 49.91570526023441 111.0 +170 230 0.6751929377164589 49.91571642724487 111.0 +180 230 0.67574964153661 49.91572759158486 111.0 +190 230 0.6763063457050945 49.91573875325439 111.0 +200 230 0.6768630502218291 49.91574991225345 111.0 +210 230 0.6774197550867305 49.91576106858204 111.0 +220 230 0.6779764602997154 49.91577222224016 111.0 +230 230 0.6785331658607002 49.91578337322779 111.0 +240 230 0.679089871769602 49.91579452154493 111.0 +250 230 0.6796465780263372 49.91580566719159 111.0 +260 230 0.6802032846308226 49.91581681016776 111.0 +270 230 0.6807599915829747 49.91582795047343 111.0 +280 230 0.6813166988827104 49.91583908810859 111.0 +290 230 0.6818734065299463 49.91585022307325 111.0 +0 240 0.66574638815882 49.915166756337285 111.0 +10 240 0.666303081913054 49.915177965932685 111.0 +20 240 0.6668597760170293 49.91518917285773 111.0 +30 240 0.6674164704706625 49.91520037711241 111.0 +40 240 0.6679731652738703 49.91521157869673 111.0 +50 240 0.6685298604265691 49.915222777610666 111.0 +60 240 0.6690865559286758 49.915233973854235 111.0 +70 240 0.669643251780107 49.91524516742743 111.0 +80 240 0.6701999479807793 49.91525635833024 111.0 +90 240 0.6707566445306095 49.91526754656266 111.0 +100 240 0.6713133414295139 49.91527873212468 111.0 +110 240 0.6718700386774096 49.915289915016324 111.0 +120 240 0.6724267362742129 49.91530109523755 111.0 +130 240 0.6729834342198407 49.915312272788384 111.0 +140 240 0.6735401325142095 49.915323447668804 111.0 +150 240 0.6740968311572361 49.91533461987881 111.0 +160 240 0.6746535301488369 49.9153457894184 111.0 +170 240 0.6752102294889288 49.91535695628757 111.0 +180 240 0.6757669291774286 49.91536812048631 111.0 +190 240 0.6763236292142526 49.91537928201463 111.0 +200 240 0.6768803295993178 49.91539044087251 111.0 +210 240 0.6774370303325407 49.91540159705995 111.0 +220 240 0.6779937314138378 49.91541275057694 111.0 +230 240 0.6785504328431261 49.915423901423495 111.0 +240 240 0.6791071346203222 49.915435049599594 111.0 +250 240 0.6796638367453427 49.91544619510524 111.0 +260 240 0.6802205392181043 49.915457337940424 111.0 +270 240 0.6807772420385237 49.91546847810514 111.0 +280 240 0.6813339452065176 49.915479615599395 111.0 +290 240 0.6818906487220027 49.915490750423174 111.0 +0 250 0.6657637498181772 49.91480728775957 111.0 +10 250 0.6663204394409972 49.91481849721315 111.0 +20 250 0.6668771294135492 49.9148297039964 111.0 +30 250 0.66743381973575 49.914840908109326 111.0 +40 250 0.6679905104075163 49.91485210955192 111.0 +50 250 0.6685472014287648 49.91486330832418 111.0 +60 250 0.6691038927994118 49.9148745044261 111.0 +70 250 0.6696605845193745 49.91488569785767 111.0 +80 250 0.6702172765885691 49.91489688861889 111.0 +90 250 0.6707739690069124 49.914908076709764 111.0 +100 250 0.6713306617743211 49.914919262130276 111.0 +110 250 0.6718873548907117 49.914930444880426 111.0 +120 250 0.6724440483560011 49.91494162496021 111.0 +130 250 0.6730007421701059 49.91495280236962 111.0 +140 250 0.6735574363329425 49.914963977108656 111.0 +150 250 0.674114130844428 49.914975149177316 111.0 +160 250 0.6746708257044786 49.914986318575586 111.0 +170 250 0.6752275209130113 49.91499748530347 111.0 +180 250 0.6757842164699426 49.91500864936097 111.0 +190 250 0.6763409123751892 49.91501981074807 111.0 +200 250 0.6768976086286679 49.915030969464766 111.0 +210 250 0.6774543052302953 49.91504212551106 111.0 +220 250 0.6780110021799879 49.915053278886944 111.0 +230 250 0.6785676994776626 49.91506442959241 111.0 +240 250 0.679124397123236 49.91507557762747 111.0 +250 250 0.6796810951166249 49.9150867229921 111.0 +260 250 0.6802377934577458 49.915097865686306 111.0 +270 250 0.6807944921465154 49.91510900571008 111.0 +280 250 0.6813511911828505 49.91512014306342 111.0 +290 250 0.6819078905666677 49.915131277746326 111.0 +0 260 0.6657811111277447 49.914447819155015 111.0 +10 260 0.6663377966192335 49.91445902846678 111.0 +20 260 0.6668944824604454 49.91447023510825 111.0 +30 260 0.6674511686512968 49.914481439079424 111.0 +40 260 0.6680078551917048 49.914492640380296 111.0 +50 260 0.6685645420815857 49.91450383901087 111.0 +60 260 0.6691212293208564 49.91451503497114 111.0 +70 260 0.6696779169094333 49.914526228261096 111.0 +80 260 0.6702346048472332 49.914537418880734 111.0 +90 260 0.6707912931341727 49.91454860683005 111.0 +100 260 0.6713479817701685 49.914559792109046 111.0 +110 260 0.6719046707551374 49.91457097471771 111.0 +120 260 0.6724613600889958 49.914582154656046 111.0 +130 260 0.6730180497716605 49.914593331924046 111.0 +140 260 0.673574739803048 49.914604506521705 111.0 +150 260 0.6741314301830752 49.91461567844901 111.0 +160 260 0.6746881209116588 49.914626847705975 111.0 +170 260 0.6752448119887151 49.91463801429258 111.0 +180 260 0.6758015034141611 49.914649178208826 111.0 +190 260 0.6763581951879134 49.91466033945471 111.0 +200 260 0.6769148873098886 49.91467149803024 111.0 +210 260 0.6774715797800035 49.91468265393538 111.0 +220 260 0.6780282725981747 49.91469380717015 111.0 +230 260 0.6785849657643188 49.91470495773455 111.0 +240 260 0.6791416592783526 49.91471610562856 111.0 +250 260 0.6796983531401928 49.91472725085218 111.0 +260 260 0.680255047349756 49.91473839340541 111.0 +270 260 0.6808117419069588 49.914749533288244 111.0 +280 260 0.6813684368117181 49.91476067050068 111.0 +290 260 0.6819251320639506 49.9147718050427 111.0 +0 270 0.6657984720875316 49.91408835052363 111.0 +10 270 0.6663551534477722 49.914099559693575 111.0 +20 270 0.6669118351577269 49.91411076619326 111.0 +30 270 0.6674685172173122 49.914121970022684 111.0 +40 270 0.6680251996264447 49.914133171181845 111.0 +50 270 0.6685818823850412 49.91414436967074 111.0 +60 270 0.6691385654930183 49.91415556548935 111.0 +70 270 0.6696952489502926 49.91416675863769 111.0 +80 270 0.6702519327567809 49.914177949115754 111.0 +90 270 0.6708086169123997 49.914189136923525 111.0 +100 270 0.6713653014170656 49.914200322061006 111.0 +110 270 0.6719219862706955 49.9142115045282 111.0 +120 270 0.6724786714732061 49.91422268432508 111.0 +130 270 0.6730353570245137 49.91423386145167 111.0 +140 270 0.6735920429245352 49.914245035907946 111.0 +150 270 0.6741487291731872 49.91425620769391 111.0 +160 270 0.6747054157703865 49.91426737680956 111.0 +170 270 0.6752621027160496 49.91427854325489 111.0 +180 270 0.6758187900100934 49.914289707029894 111.0 +190 270 0.6763754776524342 49.91430086813457 111.0 +200 270 0.6769321656429891 49.91431202656891 111.0 +210 270 0.6774888539816745 49.914323182332915 111.0 +220 270 0.6780455426684071 49.91433433542658 111.0 +230 270 0.6786022317031037 49.9143454858499 111.0 +240 270 0.6791589210856809 49.914356633602864 111.0 +250 270 0.6797156108160554 49.91436777868548 111.0 +260 270 0.6802723008941439 49.914378921097736 111.0 +270 270 0.6808289913198631 49.91439006083962 111.0 +280 270 0.6813856820931297 49.91440119791115 111.0 +290 270 0.6819423732138603 49.9144123323123 111.0 +0 280 0.6658158326975471 49.91372888186541 111.0 +10 280 0.6663725099266226 49.91374009089353 111.0 +20 280 0.666929187505403 49.91375129725144 111.0 +30 280 0.667485865433805 49.913762500939114 111.0 +40 280 0.6680425437117451 49.913773701956565 111.0 +50 280 0.6685992223391402 49.913784900303774 111.0 +60 280 0.6691559013159067 49.91379609598075 111.0 +70 280 0.6697125806419615 49.91380728898748 111.0 +80 280 0.670269260317221 49.91381847932396 111.0 +90 280 0.6708259403416021 49.91382966699018 111.0 +100 280 0.6713826207150213 49.91384085198615 111.0 +110 280 0.6719393014373953 49.91385203431186 111.0 +120 280 0.6724959825086408 49.9138632139673 111.0 +130 280 0.6730526639286746 49.91387439095248 111.0 +140 280 0.6736093456974129 49.91388556526738 111.0 +150 280 0.6741660278147729 49.913896736912 111.0 +160 280 0.6747227102806709 49.91390790588634 111.0 +170 280 0.6752793930950239 49.913919072190396 111.0 +180 280 0.6758360762577482 49.91393023582416 111.0 +190 280 0.6763927597687609 49.91394139678763 111.0 +200 280 0.6769494436279783 49.9139525550808 111.0 +210 280 0.6775061278353172 49.91396371070366 111.0 +220 280 0.6780628123906943 49.913974863656215 111.0 +230 280 0.6786194972940264 49.91398601393846 111.0 +240 280 0.67917618254523 49.91399716155039 111.0 +250 280 0.679732868144222 49.91400830649199 111.0 +260 280 0.6802895540909187 49.91401944876328 111.0 +270 280 0.6808462403852372 49.914030588364234 111.0 +280 280 0.681402927027094 49.91404172529485 111.0 +290 280 0.6819596140164058 49.914052859555134 111.0 +0 290 0.6658331929578001 49.91336941318035 111.0 +10 290 0.6663898660557934 49.91338062206666 111.0 +20 290 0.6669465395034827 49.91339182828279 111.0 +30 290 0.6675032133007844 49.91340303182872 111.0 +40 290 0.6680598874476152 49.913414232704454 111.0 +50 290 0.6686165619438919 49.91342543090999 111.0 +60 290 0.6691732367895309 49.91343662644532 111.0 +70 290 0.6697299119844491 49.913447819310434 111.0 +80 290 0.670286587528563 49.91345900950534 111.0 +90 290 0.6708432634217893 49.91347019703002 111.0 +100 290 0.6713999396640448 49.91348138188449 111.0 +110 290 0.6719566162552459 49.91349256406872 111.0 +120 290 0.6725132931953095 49.91350374358272 111.0 +130 290 0.6730699704841522 49.913514920426486 111.0 +140 290 0.6736266481216905 49.913526094600016 111.0 +150 290 0.6741833261078414 49.9135372661033 111.0 +160 290 0.6747400044425212 49.913548434936324 111.0 +170 290 0.675296683125647 49.91355960109911 111.0 +180 290 0.675853362157135 49.91357076459163 111.0 +190 290 0.6764100415369023 49.913581925413894 111.0 +200 290 0.6769667212648653 49.913593083565885 111.0 +210 290 0.6775234013409408 49.913604239047615 111.0 +220 290 0.6780800817650455 49.91361539185906 111.0 +230 290 0.678636762537096 49.91362654200024 111.0 +240 290 0.6791934436570091 49.91363768947112 111.0 +250 290 0.6797501251247013 49.91364883427173 111.0 +260 290 0.6803068069400896 49.913659976402045 111.0 +270 290 0.6808634891030904 49.91367111586206 111.0 +280 290 0.6814201716136205 49.913682252651775 111.0 +290 290 0.6819768544715965 49.913693386771186 111.0 diff --git a/Data/Input/pleiades/pleiades-1.gcp2 b/Data/Input/pleiades/pleiades-1.gcp2 new file mode 100644 index 0000000000..6fa0d64e39 --- /dev/null +++ b/Data/Input/pleiades/pleiades-1.gcp2 @@ -0,0 +1,901 @@ +#From file /work/scratch/osmanj/otb_valid/pleiades-1.geom +0 0 1.3619102111248311 43.685721774833176 255.0 +10 0 1.3619706278361692 43.68572218992741 255.0 +20 0 1.3620310446692756 43.68572260499125 255.0 +30 0 1.3620914616241533 43.685723020024696 255.0 +40 0 1.3621518787008053 43.685723435027754 255.0 +50 0 1.3622122958992349 43.685723850000414 255.0 +60 0 1.3622727132194445 43.68572426494268 255.0 +70 0 1.3623331306614377 43.68572467985456 255.0 +80 0 1.362393548225217 43.685725094736036 255.0 +90 0 1.3624539659107855 43.68572550958713 255.0 +100 0 1.362514383718146 43.685725924407826 255.0 +110 0 1.3625748016473018 43.68572633919813 255.0 +120 0 1.3626352196982556 43.68572675395804 255.0 +130 0 1.3626956378710104 43.68572716868757 255.0 +140 0 1.3627560561655692 43.6857275833867 255.0 +150 0 1.362816474581935 43.68572799805544 255.0 +160 0 1.3628768931201105 43.68572841269379 255.0 +170 0 1.362937311780099 43.68572882730175 255.0 +180 0 1.362997730561903 43.685729241879315 255.0 +190 0 1.3630581494655258 43.685729656426496 255.0 +200 0 1.3631185684909706 43.685730070943286 255.0 +210 0 1.3631789876382396 43.68573048542969 255.0 +220 0 1.3632394069073364 43.6857308998857 255.0 +230 0 1.3632998262982636 43.68573131431132 255.0 +240 0 1.3633602458110243 43.68573172870656 255.0 +250 0 1.3634206654456213 43.6857321430714 255.0 +260 0 1.3634810852020576 43.685732557405856 255.0 +270 0 1.3635415050803363 43.685732971709925 255.0 +280 0 1.36360192508046 43.68573338598361 255.0 +290 0 1.363662345202432 43.6857338002269 255.0 +0 10 1.3619104463769882 43.685676657354044 255.0 +10 10 1.361970863072613 43.68567707240341 255.0 +20 10 1.3620312798900078 43.685677487422375 255.0 +30 10 1.3620916968291756 43.685677902410944 255.0 +40 10 1.3621521138901194 43.685678317369124 255.0 +50 10 1.362212531072842 43.68567873229691 255.0 +60 10 1.3622729483773461 43.6856791471943 255.0 +70 10 1.3623333658036354 43.6856795620613 255.0 +80 10 1.3623937833517124 43.68567997689791 255.0 +90 10 1.3624542010215799 43.68568039170412 255.0 +100 10 1.3625146188132413 43.685680806479944 255.0 +110 10 1.3625750367266993 43.68568122122537 255.0 +120 10 1.3626354547619568 43.68568163594041 255.0 +130 10 1.3626958729190168 43.685682050625054 255.0 +140 10 1.3627562911978823 43.685682465279314 255.0 +150 10 1.3628167095985564 43.685682879903176 255.0 +160 10 1.3628771281210417 43.68568329449665 255.0 +170 10 1.3629375467653415 43.68568370905973 255.0 +180 10 1.3629979655314584 43.685684123592424 255.0 +190 10 1.3630583844193958 43.68568453809473 255.0 +200 10 1.3631188034291561 43.685684952566646 255.0 +210 10 1.3631792225607426 43.68568536700817 255.0 +220 10 1.3632396418141584 43.6856857814193 255.0 +230 10 1.363300061189406 43.685686195800045 255.0 +240 10 1.3633604806864885 43.685686610150405 255.0 +250 10 1.363420900305409 43.685687024470376 255.0 +260 10 1.3634813200461704 43.685687438759956 255.0 +270 10 1.3635417399087755 43.68568785301915 255.0 +280 10 1.363602159893227 43.68568826724795 255.0 +290 10 1.3636625799995286 43.685688681446365 255.0 +0 20 1.3619106815817028 43.68563153985796 255.0 +10 20 1.361971098261614 43.68563195486244 255.0 +20 20 1.3620315150632967 43.68563236983653 255.0 +30 20 1.3620919319867537 43.685632784780225 255.0 +40 20 1.3621523490319882 43.68563319969353 255.0 +50 20 1.3622127661990031 43.68563361457644 255.0 +60 20 1.3622731834878012 43.685634029428954 255.0 +70 20 1.362333600898386 43.68563444425108 255.0 +80 20 1.3623940184307597 43.68563485904281 255.0 +90 20 1.3624544360849258 43.685635273804145 255.0 +100 20 1.362514853860887 43.685635688535086 255.0 +110 20 1.3625752717586466 43.685636103235645 255.0 +120 20 1.362635689778207 43.685636517905806 255.0 +130 20 1.3626961079195716 43.68563693254558 255.0 +140 20 1.3627565261827432 43.68563734715495 255.0 +150 20 1.3628169445677247 43.68563776173394 255.0 +160 20 1.3628773630745192 43.68563817628254 255.0 +170 20 1.3629377817031294 43.68563859080074 255.0 +180 20 1.3629982004535586 43.68563900528856 255.0 +190 20 1.3630586193258094 43.68563941974598 255.0 +200 20 1.363119038319885 43.685639834173024 255.0 +210 20 1.3631794574357883 43.68564024856967 255.0 +220 20 1.363239876673522 43.685640662935924 255.0 +230 20 1.3633002960330893 43.6856410772718 255.0 +240 20 1.3633607155144931 43.68564149157727 255.0 +250 20 1.3634211351177363 43.685641905852364 255.0 +260 20 1.3634815548428219 43.68564232009707 255.0 +270 20 1.3635419746897528 43.68564273431138 255.0 +280 20 1.3636023946585318 43.68564314849531 255.0 +290 20 1.3636628147491618 43.68564356264885 255.0 +0 30 1.3619109167389618 43.685586422344905 255.0 +10 30 1.3619713334031585 43.68558683730451 255.0 +20 30 1.3620317501891281 43.685587252233724 255.0 +30 30 1.3620921670968738 43.685587667132545 255.0 +40 30 1.3621525841263984 43.68558808200097 255.0 +50 30 1.362213001277705 43.685588496839 255.0 +60 30 1.3622734185507963 43.68558891164664 255.0 +70 30 1.3623338359456756 43.68558932642389 255.0 +80 30 1.3623942534623454 43.685589741170745 255.0 +90 30 1.3624546711008094 43.685590155887205 255.0 +100 30 1.3625150888610698 43.68559057057327 255.0 +110 30 1.36257550674313 43.68559098522895 255.0 +120 30 1.3626359247469928 43.68559139985423 255.0 +130 30 1.362696342872661 43.685591814449126 255.0 +140 30 1.3627567611201379 43.68559222901362 255.0 +150 30 1.3628171794894264 43.685592643547736 255.0 +160 30 1.362877597980529 43.68559305805145 255.0 +170 30 1.3629380165934493 43.68559347252478 255.0 +180 30 1.3629984353281897 43.68559388696772 255.0 +190 30 1.3630588541847535 43.68559430138027 255.0 +200 30 1.3631192731631434 43.68559471576243 255.0 +210 30 1.3631796922633626 43.685595130114194 255.0 +220 30 1.3632401114854138 43.68559554443558 255.0 +230 30 1.3633005308293002 43.685595958726566 255.0 +240 30 1.3633609502950244 43.68559637298717 255.0 +250 30 1.3634213698825897 43.68559678721738 255.0 +260 30 1.3634817895919986 43.6855972014172 255.0 +270 30 1.3635422094232545 43.68559761558664 255.0 +280 30 1.3636026293763601 43.68559802972569 255.0 +290 30 1.3636630494513182 43.68559844383435 255.0 +0 40 1.3619111518487514 43.6855413048149 255.0 +10 40 1.3619715684972329 43.68554171972963 255.0 +20 40 1.362031985267489 43.68554213461397 255.0 +30 40 1.3620924021595222 43.68554254946791 255.0 +40 40 1.3621528191733363 43.68554296429146 255.0 +50 40 1.3622132363089337 43.68554337908461 255.0 +60 40 1.3622736535663174 43.68554379384737 255.0 +70 40 1.3623340709454905 43.68554420857974 255.0 +80 40 1.362394488446456 43.685544623281714 255.0 +90 40 1.3624549060692168 43.6855450379533 255.0 +100 40 1.3625153238137757 43.68554545259449 255.0 +110 40 1.3625757416801358 43.685545867205285 255.0 +120 40 1.3626361596683 43.68554628178569 255.0 +130 40 1.3626965777782716 43.685546696335706 255.0 +140 40 1.362756996010053 43.68554711085533 255.0 +150 40 1.3628174143636473 43.68554752534456 255.0 +160 40 1.3628778328390578 43.685547939803406 255.0 +170 40 1.362938251436287 43.685548354231855 255.0 +180 40 1.3629986701553383 43.685548768629914 255.0 +190 40 1.3630590889962142 43.68554918299758 255.0 +200 40 1.3631195079589178 43.68554959733486 255.0 +210 40 1.3631799270434521 43.68555001164175 255.0 +220 40 1.3632403462498202 43.68555042591826 255.0 +230 40 1.3633007655780247 43.68555084016437 255.0 +240 40 1.3633611850280687 43.68555125438009 255.0 +250 40 1.3634216045999552 43.685551668565424 255.0 +260 40 1.363482024293687 43.68555208272037 255.0 +270 40 1.3635424441092672 43.68555249684493 255.0 +280 40 1.3636028640466984 43.685552910939094 255.0 +290 40 1.3636632841059841 43.68555332500288 255.0 +0 50 1.361911386911058 43.685496187267944 255.0 +10 50 1.3619718035438235 43.685496602137796 255.0 +20 50 1.362032220298365 43.68549701697725 255.0 +30 50 1.3620926371746855 43.68549743178632 255.0 +40 50 1.362153054172788 43.685497846564985 255.0 +50 50 1.3622134712926757 43.68549826131326 255.0 +60 50 1.362273888534351 43.685498676031145 255.0 +70 50 1.3623343058978172 43.685499090718636 255.0 +80 50 1.3623947233830775 43.68549950537574 255.0 +90 50 1.3624551409901344 43.68549992000244 255.0 +100 50 1.3625155587189912 43.68550033459875 255.0 +110 50 1.3625759765696506 43.685500749164675 255.0 +120 50 1.3626363945421156 43.6855011637002 255.0 +130 50 1.3626968126363894 43.68550157820533 255.0 +140 50 1.3627572308524747 43.68550199268008 255.0 +150 50 1.3628176491903745 43.68550240712443 255.0 +160 50 1.3628780676500918 43.68550282153839 255.0 +170 50 1.3629384862316294 43.68550323592196 255.0 +180 50 1.3629989049349904 43.685503650275145 255.0 +190 50 1.3630593237601778 43.685504064597936 255.0 +200 50 1.3631197427071944 43.68550447889034 255.0 +210 50 1.3631801617760433 43.68550489315235 255.0 +220 50 1.3632405809667272 43.68550530738397 255.0 +230 50 1.3633010002792492 43.6855057215852 255.0 +240 50 1.3633614197136124 43.68550613575604 255.0 +250 50 1.3634218392698192 43.6855065498965 255.0 +260 50 1.363482258947873 43.685506964006564 255.0 +270 50 1.363542678747777 43.68550737808624 255.0 +280 50 1.3636030986695333 43.68550779213553 255.0 +290 50 1.3636635187131454 43.68550820615444 255.0 +0 60 1.3619116219258678 43.68545106970404 255.0 +10 60 1.3619720385429164 43.68545148452901 255.0 +20 60 1.3620324552817429 43.685451899323596 255.0 +30 60 1.3620928721423498 43.685452314087776 255.0 +40 60 1.36215328912474 43.68545272882157 255.0 +50 60 1.362213706228917 43.68545314352497 255.0 +60 60 1.3622741234548834 43.68545355819797 255.0 +70 60 1.3623345408026422 43.685453972840584 255.0 +80 60 1.3623949582721964 43.6854543874528 255.0 +90 60 1.3624553758635487 43.68545480203463 255.0 +100 60 1.3625157935767025 43.685455216586064 255.0 +110 60 1.3625762114116604 43.685455631107104 255.0 +120 60 1.3626366293684256 43.685456045597746 255.0 +130 60 1.3626970474470008 43.685456460058006 255.0 +140 60 1.3627574656473893 43.68545687448787 255.0 +150 60 1.3628178839695937 43.68545728888734 255.0 +160 60 1.362878302413617 43.685457703256425 255.0 +170 60 1.3629387209794623 43.68545811759512 255.0 +180 60 1.3629991396671326 43.68545853190342 255.0 +190 60 1.3630595584766307 43.685458946181335 255.0 +200 60 1.3631199774079596 43.68545936042885 255.0 +210 60 1.3631803964611222 43.685459774645985 255.0 +220 60 1.3632408156361213 43.68546018883273 255.0 +230 60 1.36330123493296 43.685460602989075 255.0 +240 60 1.3633616543516416 43.68546101711504 255.0 +250 60 1.3634220738921683 43.68546143121061 255.0 +260 60 1.3634824935545435 43.6854618452758 255.0 +270 60 1.36354291333877 43.6854622593106 255.0 +280 60 1.363603333244851 43.68546267331501 255.0 +290 60 1.363663753272789 43.68546308728903 255.0 +0 70 1.361911856893167 43.6854059521232 255.0 +10 70 1.3619722734944983 43.68540636690329 255.0 +20 70 1.3620326902176088 43.68540678165299 255.0 +30 70 1.3620931070625013 43.685407196372296 255.0 +40 70 1.3621535240291789 43.68540761106121 255.0 +50 70 1.3622139411176444 43.68540802571973 255.0 +60 70 1.362274358327901 43.68540844034786 255.0 +70 70 1.3623347756599515 43.685408854945585 255.0 +80 70 1.3623951931137988 43.685409269512924 255.0 +90 70 1.362455610689446 43.68540968404987 255.0 +100 70 1.362516028386896 43.685410098556424 255.0 +110 70 1.3625764462061518 43.685410513032586 255.0 +120 70 1.3626368641472162 43.68541092747835 255.0 +130 70 1.3626972822100925 43.685411341893726 255.0 +140 70 1.362757700394783 43.68541175627871 255.0 +150 70 1.3628181187012915 43.685412170633306 255.0 +160 70 1.3628785371296204 43.68541258495751 255.0 +170 70 1.3629389556797726 43.68541299925132 255.0 +180 70 1.3629993743517512 43.685413413514745 255.0 +190 70 1.3630597931455593 43.68541382774777 255.0 +200 70 1.3631202120611996 43.68541424195041 255.0 +210 70 1.3631806310986752 43.68541465612266 255.0 +220 70 1.363241050257989 43.685415070264526 255.0 +230 70 1.3633014695391439 43.685415484375994 255.0 +240 70 1.3633618889421428 43.68541589845708 255.0 +250 70 1.3634223084669888 43.68541631250777 255.0 +260 70 1.3634827281136845 43.685416726528075 255.0 +270 70 1.3635431478822333 43.68541714051799 255.0 +280 70 1.3636035677726377 43.68541755447752 255.0 +290 70 1.3636639877849008 43.68541796840666 255.0 +0 80 1.3619120918129424 43.68536083452541 255.0 +10 80 1.3619725083985554 43.68536124926063 255.0 +20 80 1.3620329251059493 43.68536166396545 255.0 +30 80 1.3620933419351267 43.685362078639876 255.0 +40 80 1.3621537588860906 43.68536249328391 255.0 +50 80 1.362214175958844 43.68536290789755 255.0 +60 80 1.36227459315339 43.6853633224808 255.0 +70 80 1.3623350104697314 43.68536373703365 255.0 +80 80 1.3623954279078714 43.6853641515561 255.0 +90 80 1.3624558454678126 43.68536456604817 255.0 +100 80 1.3625162631495582 43.68536498050984 255.0 +110 80 1.362576680953111 43.68536539494112 255.0 +120 80 1.362637098878474 43.68536580934201 255.0 +130 80 1.3626975169256503 43.685366223712506 255.0 +140 80 1.3627579350946426 43.685366638052606 255.0 +150 80 1.362818353385454 43.685367052362324 255.0 +160 80 1.3628787717980877 43.685367466641644 255.0 +170 80 1.3629391903325463 43.685367880890574 255.0 +180 80 1.3629996089888325 43.685368295109114 255.0 +190 80 1.36306002776695 43.685368709297265 255.0 +200 80 1.363120446666901 43.685369123455025 255.0 +210 80 1.3631808656886888 43.68536953758239 255.0 +220 80 1.3632412848323163 43.68536995167937 255.0 +230 80 1.3633017040977866 43.68537036574596 255.0 +240 80 1.3633621234851023 43.68537077978216 255.0 +250 80 1.3634225429942666 43.68537119378797 255.0 +260 80 1.3634829626252825 43.6853716077634 255.0 +270 80 1.3635433823781524 43.68537202170843 255.0 +280 80 1.3636038022528798 43.68537243562308 255.0 +290 80 1.3636642222494675 43.68537284950734 255.0 +0 90 1.3619123266851798 43.6853157169107 255.0 +10 90 1.3619727432550741 43.685316131601034 255.0 +20 90 1.3620331599467503 43.68531654626098 255.0 +30 90 1.362093576760212 43.685316960890525 255.0 +40 90 1.3621539936954614 43.685317375489674 255.0 +50 90 1.3622144107525023 43.685317790058434 255.0 +60 90 1.362274827931337 43.6853182045968 255.0 +70 90 1.3623352452319686 43.68531861910477 255.0 +80 90 1.3623956626544003 43.685319033582346 255.0 +90 90 1.3624560801986347 43.68531944802953 255.0 +100 90 1.362516497864675 43.68531986244632 255.0 +110 90 1.3625769156525243 43.68532027683272 255.0 +120 90 1.3626373335621853 43.68532069118873 255.0 +130 90 1.362697751593661 43.68532110551434 255.0 +140 90 1.3627581697469542 43.68532151980956 255.0 +150 90 1.3628185880220682 43.685321934074395 255.0 +160 90 1.3628790064190057 43.68532234830884 255.0 +170 90 1.3629394249377695 43.68532276251288 255.0 +180 90 1.362999843578363 43.685323176686545 255.0 +190 90 1.3630602623407888 43.68532359082981 255.0 +200 90 1.36312068122505 43.685324004942686 255.0 +210 90 1.3631811002311494 43.68532441902518 255.0 +220 90 1.36324151935909 43.685324833077274 255.0 +230 90 1.363301938608875 43.68532524709898 255.0 +240 90 1.3633623579805068 43.685325661090296 255.0 +250 90 1.3634227774739887 43.68532607505123 255.0 +260 90 1.3634831970893235 43.68532648898177 255.0 +270 90 1.3635436168265143 43.685326902881926 255.0 +280 90 1.363604036685564 43.68532731675169 255.0 +290 90 1.3636644566664753 43.68532773059106 255.0 +0 100 1.361912561509866 43.68527059927906 255.0 +10 100 1.3619729780640404 43.68527101392451 255.0 +20 100 1.3620333947399987 43.68527142853957 255.0 +30 100 1.3620938115377437 43.68527184312424 255.0 +40 100 1.362154228457278 43.68527225767851 255.0 +50 100 1.3622146454986053 43.68527267220239 255.0 +60 100 1.362275062661728 43.685273086695865 255.0 +70 100 1.3623354799466492 43.68527350115896 255.0 +80 100 1.3623958973533719 43.68527391559165 255.0 +90 100 1.3624563148818989 43.68527432999396 255.0 +100 100 1.3625167325322334 43.68527474436586 255.0 +110 100 1.3625771503043782 43.685275158707384 255.0 +120 100 1.3626375681983363 43.68527557301851 255.0 +130 100 1.3626979862141106 43.68527598729924 255.0 +140 100 1.362758404351704 43.68527640154958 255.0 +150 100 1.3628188226111198 43.685276815769534 255.0 +160 100 1.3628792409923605 43.68527722995909 255.0 +170 100 1.362939659495429 43.68527764411826 255.0 +180 100 1.3630000781203289 43.68527805824703 255.0 +190 100 1.3630604968670625 43.685278472345416 255.0 +200 100 1.363120915735633 43.685278886413414 255.0 +210 100 1.363181334726043 43.685279300451015 255.0 +220 100 1.3632417538382962 43.68527971445823 255.0 +230 100 1.3633021730723949 43.68528012843506 255.0 +240 100 1.3633625924283421 43.68528054238149 255.0 +250 100 1.363423011906141 43.68528095629754 255.0 +260 100 1.3634834315057944 43.6852813701832 255.0 +270 100 1.363543851227305 43.685281784038466 255.0 +280 100 1.3636042710706762 43.68528219786335 255.0 +290 100 1.3636646910359107 43.68528261165784 255.0 +0 110 1.361912796286987 43.685225481630496 255.0 +10 110 1.3619732128254411 43.68522589623107 255.0 +20 110 1.3620336294856805 43.68522631080125 255.0 +30 110 1.362094046267708 43.68522672534103 255.0 +40 110 1.3621544631715268 43.68522713985042 255.0 +50 110 1.3622148801971397 43.685227554329416 255.0 +60 110 1.3622752973445496 43.685227968778015 255.0 +70 110 1.3623357146137596 43.68522838319622 255.0 +80 110 1.3623961320047726 43.68522879758403 255.0 +90 110 1.3624565495175915 43.685229211941454 255.0 +100 110 1.3625169671522193 43.68522962626848 255.0 +110 110 1.3625773849086589 43.685230040565116 255.0 +120 110 1.3626378027869135 43.685230454831355 255.0 +130 110 1.3626982207869855 43.68523086906721 255.0 +140 110 1.3627586389088786 43.685231283272664 255.0 +150 110 1.362819057152595 43.68523169744773 255.0 +160 110 1.3628794755181384 43.685232111592406 255.0 +170 110 1.3629398940055113 43.685232525706695 255.0 +180 110 1.3630003126147163 43.68523293979059 255.0 +190 110 1.363060731345757 43.68523335384409 255.0 +200 110 1.3631211501986362 43.6852337678672 255.0 +210 110 1.3631815691733566 43.68523418185992 255.0 +220 110 1.3632419882699212 43.68523459582225 255.0 +230 110 1.363302407488333 43.685235009754194 255.0 +240 110 1.363362826828595 43.68523542365575 255.0 +250 110 1.36342324629071 43.68523583752691 255.0 +260 110 1.3634836658746812 43.685236251367684 255.0 +270 110 1.3635440855805112 43.685236665178074 255.0 +280 110 1.3636045054082029 43.68523707895807 255.0 +290 110 1.3636649253577597 43.68523749270768 255.0 +0 120 1.3619130310165293 43.68518036396502 255.0 +10 120 1.3619734475392622 43.6851807785207 255.0 +20 120 1.3620338641837821 43.685181193046 255.0 +30 120 1.3620942809500916 43.6851816075409 255.0 +40 120 1.3621546978381938 43.68518202200541 255.0 +50 120 1.3622151148480917 43.68518243643952 255.0 +60 120 1.3622755319797881 43.68518285084323 255.0 +70 120 1.362335949233286 43.68518326521656 255.0 +80 120 1.3623963666085885 43.68518367955949 255.0 +90 120 1.3624567841056987 43.68518409387203 255.0 +100 120 1.362517201724619 43.68518450815417 255.0 +110 120 1.362577619465353 43.685184922405924 255.0 +120 120 1.362638037327903 43.685185336627285 255.0 +130 120 1.3626984553122725 43.68518575081825 255.0 +140 120 1.3627588734184641 43.68518616497882 255.0 +150 120 1.362819291646481 43.68518657910901 255.0 +160 120 1.362879709996326 43.6851869932088 255.0 +170 120 1.362940128468002 43.6851874072782 255.0 +180 120 1.363000547061512 43.68518782131721 255.0 +190 120 1.363060965776859 43.685188235325825 255.0 +200 120 1.3631213846140462 43.68518864930405 255.0 +210 120 1.3631818035730758 43.68518906325189 255.0 +220 120 1.3632422226539513 43.68518947716934 255.0 +230 120 1.3633026418566758 43.685189891056396 255.0 +240 120 1.3633630611812517 43.68519030491307 255.0 +250 120 1.3634234806276821 43.68519071873935 255.0 +260 120 1.3634839001959702 43.68519113253524 255.0 +270 120 1.3635443198861188 43.685191546300736 255.0 +280 120 1.3636047396981306 43.68519196003585 255.0 +290 120 1.3636651596320088 43.68519237374058 255.0 +0 130 1.3619132656984791 43.68513524628262 255.0 +10 130 1.3619736822054904 43.68513566079343 255.0 +20 130 1.3620340988342898 43.68513607527384 255.0 +30 130 1.3620945155848805 43.68513648972385 255.0 +40 130 1.3621549324572655 43.68513690414348 255.0 +50 130 1.3622153494514475 43.6851373185327 255.0 +60 130 1.3622757665674297 43.68513773289154 255.0 +70 130 1.362336183805215 43.68513814721998 255.0 +80 130 1.3623966011648065 43.68513856151803 255.0 +90 130 1.3624570186462068 43.685138975785684 255.0 +100 130 1.3625174362494192 43.68513939002294 255.0 +110 130 1.3625778539744464 43.68513980422981 255.0 +120 130 1.3626382718212915 43.68514021840628 255.0 +130 130 1.3626986897899573 43.68514063255237 255.0 +140 130 1.362759107880447 43.68514104666806 255.0 +150 130 1.3628195260927636 43.68514146075336 255.0 +160 130 1.3628799444269095 43.68514187480827 255.0 +170 130 1.3629403628828882 43.68514228883278 255.0 +180 130 1.3630007814607024 43.68514270282691 255.0 +190 130 1.363061200160355 43.68514311679064 255.0 +200 130 1.3631216189818491 43.685143530723984 255.0 +210 130 1.3631820379251876 43.68514394462694 255.0 +220 130 1.3632424569903734 43.6851443584995 255.0 +230 130 1.3633028761774093 43.68514477234167 255.0 +240 130 1.3633632954862984 43.685145186153456 255.0 +250 130 1.3634237149170436 43.685145599934856 255.0 +260 130 1.363484134469648 43.68514601368586 255.0 +270 130 1.3635445541441145 43.68514642740647 255.0 +280 130 1.3636049739404457 43.6851468410967 255.0 +290 130 1.3636653938586447 43.685147254756544 255.0 +0 140 1.361913500332823 43.68509012858331 255.0 +10 140 1.3619739168241116 43.685090543049235 255.0 +20 140 1.36203433343719 43.68509095748477 255.0 +30 140 1.362094750172061 43.6850913718899 255.0 +40 140 1.3621551670287282 43.685091786264636 255.0 +50 140 1.3622155840071937 43.685092200608985 255.0 +60 140 1.362276001107461 43.68509261492293 255.0 +70 140 1.3623364183295328 43.68509302920649 255.0 +80 140 1.3623968356734124 43.68509344345965 255.0 +90 140 1.3624572531391024 43.68509385768242 255.0 +100 140 1.362517670726606 43.685094271874796 255.0 +110 140 1.362578088435926 43.68509468603678 255.0 +120 140 1.3626385062670652 43.68509510016837 255.0 +130 140 1.362698924220027 43.68509551426957 255.0 +140 140 1.3627593422948139 43.685095928340374 255.0 +150 140 1.362819760491429 43.68509634238079 255.0 +160 140 1.3628801788098754 43.68509675639081 255.0 +170 140 1.3629405972501558 43.68509717037044 255.0 +180 140 1.3630010158122734 43.685097584319685 255.0 +190 140 1.3630614344962309 43.68509799823853 255.0 +200 140 1.3631218533020315 43.68509841212699 255.0 +210 140 1.3631822722296778 43.68509882598506 255.0 +220 140 1.363242691279173 43.685099239812736 255.0 +230 140 1.36330311045052 43.685099653610024 255.0 +240 140 1.3633635297437217 43.68510006737692 255.0 +250 140 1.363423949158781 43.68510048111343 255.0 +260 140 1.363484368695701 43.685100894819556 255.0 +270 140 1.3635447883544842 43.685101308495284 255.0 +280 140 1.3636052081351342 43.68510172214062 255.0 +290 140 1.3636656280376533 43.68510213575558 255.0 +0 150 1.3619137349195474 43.68504501086711 255.0 +10 150 1.3619741513951125 43.685045425288145 255.0 +20 150 1.362034567992469 43.685045839678786 255.0 +30 150 1.36209498471162 43.68504625403904 255.0 +40 150 1.362155401552568 43.68504666836889 255.0 +50 150 1.3622158185153166 43.68504708266835 255.0 +60 150 1.3622762355998683 43.685047496937415 255.0 +70 150 1.362336652806226 43.685047911176085 255.0 +80 150 1.3623970701343928 43.685048325384365 255.0 +90 150 1.3624574875843718 43.68504873956225 255.0 +100 150 1.3625179051561658 43.68504915370974 255.0 +110 150 1.3625783228497776 43.68504956782684 255.0 +120 150 1.3626387406652105 43.685049981913544 255.0 +130 150 1.362699158602467 43.68505039596986 255.0 +140 150 1.3627595766615506 43.68505080999578 255.0 +150 150 1.3628199948424637 43.68505122399131 255.0 +160 150 1.36288041314521 43.68505163795644 255.0 +170 150 1.3629408315697915 43.68505205189119 255.0 +180 150 1.3630012501162116 43.68505246579554 255.0 +190 150 1.3630616687844734 43.685052879669506 255.0 +200 150 1.3631220875745795 43.68505329351308 255.0 +210 150 1.3631825064865333 43.68505370732626 255.0 +220 150 1.363242925520337 43.685054121109054 255.0 +230 150 1.3633033446759943 43.68505453486146 255.0 +240 150 1.363363763953508 43.68505494858347 255.0 +250 150 1.3634241833528806 43.685055362275094 255.0 +260 150 1.3634846028741152 43.68505577593633 255.0 +270 150 1.363545022517215 43.68505618956717 255.0 +280 150 1.3636054422821828 43.685056603167624 255.0 +290 150 1.3636658621690214 43.685057016737694 255.0 +0 160 1.3619139694586382 43.684999893134 255.0 +10 160 1.3619743859184794 43.68500030751015 255.0 +20 160 1.3620348025001134 43.68500072185591 255.0 +30 160 1.3620952192035434 43.68500113617127 255.0 +40 160 1.362155636028772 43.68500155045624 255.0 +50 160 1.3622160529758025 43.685001964710814 255.0 +60 160 1.3622764700446377 43.685002378934996 255.0 +70 160 1.3623368872352806 43.68500279312878 255.0 +80 160 1.362397304547734 43.68500320729217 255.0 +90 160 1.362457721982001 43.685003621425174 255.0 +100 160 1.3625181395380848 43.685004035527776 255.0 +110 160 1.362578557215988 43.68500444959999 255.0 +120 160 1.3626389750157135 43.68500486364181 255.0 +130 160 1.3626993929372646 43.68500527765323 255.0 +140 160 1.3627598109806438 43.685005691634274 255.0 +150 160 1.3628202291458544 43.68500610558491 255.0 +160 160 1.3628806474328994 43.685006519505166 255.0 +170 160 1.3629410658417813 43.68500693339502 255.0 +180 160 1.3630014843725033 43.68500734725449 255.0 +190 160 1.3630619030250686 43.68500776108357 255.0 +200 160 1.36312232179948 43.685008174882256 255.0 +210 160 1.36318274069574 43.685008588650554 255.0 +220 160 1.363243159713852 43.685009002388455 255.0 +230 160 1.3633035788538188 43.68500941609597 255.0 +240 160 1.3633639981156433 43.6850098297731 255.0 +250 160 1.3634244174993286 43.68501024341983 255.0 +260 160 1.3634848370048773 43.68501065703618 255.0 +270 160 1.3635452566322928 43.68501107062214 255.0 +280 160 1.3636056763815776 43.68501148417771 255.0 +290 160 1.363666096252735 43.685011897702886 255.0 +0 170 1.361914203950082 43.68495477538399 255.0 +10 170 1.3619746203941985 43.68495518971526 255.0 +20 170 1.3620350369601093 43.68495560401613 255.0 +30 170 1.3620954536478174 43.684956018286606 255.0 +40 170 1.362155870457326 43.68495643252669 255.0 +50 170 1.3622162873886379 43.68495684673638 255.0 +60 170 1.3622767044417559 43.684957260915674 255.0 +70 170 1.362337121616683 43.684957675064574 255.0 +80 170 1.3623975389134226 43.68495808918308 255.0 +90 170 1.3624579563319772 43.68495850327119 255.0 +100 170 1.3625183738723496 43.68495891732891 255.0 +110 170 1.3625787915345433 43.68495933135624 255.0 +120 170 1.362639209318561 43.68495974535317 255.0 +130 170 1.3626996272244056 43.68496015931971 255.0 +140 170 1.36276004525208 43.68496057325586 255.0 +150 170 1.3628204634015872 43.68496098716162 255.0 +160 170 1.36288088167293 43.68496140103698 255.0 +170 170 1.362941300066112 43.68496181488195 255.0 +180 170 1.3630017185811352 43.684962228696534 255.0 +190 170 1.3630621372180032 43.68496264248072 255.0 +200 170 1.3631225559767186 43.68496305623452 255.0 +210 170 1.3631829748572843 43.68496346995793 255.0 +220 170 1.3632433938597037 43.68496388365095 255.0 +230 170 1.3633038129839794 43.68496429731358 255.0 +240 170 1.3633642322301143 43.68496471094581 255.0 +250 170 1.3634246515981114 43.68496512454767 255.0 +260 170 1.3634850710879738 43.68496553811912 255.0 +270 170 1.363545490699704 43.684965951660196 255.0 +280 170 1.3636059104333054 43.68496636517087 255.0 +290 170 1.3636663302887806 43.684966778651166 255.0 +0 180 1.3619144383938655 43.68490965761709 255.0 +10 180 1.3619748548222563 43.684910071903474 255.0 +20 180 1.362035271372443 43.68491048615946 255.0 +30 180 1.3620956880444288 43.684910900385056 255.0 +40 180 1.3621561048382165 43.68491131458025 255.0 +50 180 1.3622165217538087 43.68491172874505 255.0 +60 180 1.362276938791209 43.684912142879455 255.0 +70 180 1.36233735595042 43.68491255698347 255.0 +80 180 1.3623977732314445 43.68491297105709 255.0 +90 180 1.3624581906342859 43.684913385100316 255.0 +100 180 1.3625186081589467 43.68491379911315 255.0 +110 180 1.3625790258054302 43.68491421309559 255.0 +120 180 1.362639443573739 43.68491462704763 255.0 +130 180 1.3626998614638766 43.68491504096929 255.0 +140 180 1.3627602794758453 43.684915454860544 255.0 +150 180 1.3628206976096484 43.68491586872142 255.0 +160 180 1.3628811158652887 43.68491628255189 255.0 +170 180 1.3629415342427693 43.684916696351976 255.0 +180 180 1.3630019527420931 43.684917110121674 255.0 +190 180 1.3630623713632632 43.684917523860975 255.0 +200 180 1.3631227901062821 43.684917937569885 255.0 +210 180 1.363183208971153 43.684918351248406 255.0 +220 180 1.363243627957879 43.68491876489654 255.0 +230 180 1.3633040470664628 43.68491917851428 255.0 +240 180 1.3633644662969073 43.68491959210163 255.0 +250 180 1.3634248856492155 43.68492000565859 255.0 +260 180 1.3634853051233906 43.68492041918516 255.0 +270 180 1.3635457247194351 43.68492083268134 255.0 +280 180 1.3636061444373522 43.684921246147134 255.0 +290 180 1.3636665642771446 43.684921659582535 255.0 +0 190 1.3619146727899745 43.68486453983331 255.0 +10 190 1.3619750892026392 43.684864954074804 255.0 +20 190 1.3620355057371012 43.684865368285905 255.0 +30 190 1.3620959223933637 43.68486578246661 255.0 +40 190 1.3621563391714295 43.684866196616916 255.0 +50 190 1.3622167560713019 43.68486661073683 255.0 +60 190 1.3622771730929835 43.68486702482635 255.0 +70 190 1.3623375902364774 43.684867438885476 255.0 +80 190 1.3623980075017865 43.68486785291421 255.0 +90 190 1.3624584248889138 43.684868266912545 255.0 +100 190 1.362518842397862 43.68486868088049 255.0 +110 190 1.3625792600286346 43.68486909481804 255.0 +120 190 1.3626396777812342 43.6848695087252 255.0 +130 190 1.3627000956556636 43.68486992260197 255.0 +140 190 1.362760513651926 43.68487033644834 255.0 +150 190 1.3628209317700244 43.68487075026432 255.0 +160 190 1.3628813500099615 43.68487116404991 255.0 +170 190 1.3629417683717404 43.684871577805104 255.0 +180 190 1.363002186855364 43.68487199152991 255.0 +190 190 1.3630626054608352 43.684872405224326 255.0 +200 190 1.363123024188157 43.684872818888344 255.0 +210 190 1.3631834430373322 43.68487323252198 255.0 +220 190 1.363243862008364 43.68487364612522 255.0 +230 190 1.3633042811012552 43.684874059698075 255.0 +240 190 1.3633647003160085 43.684874473240534 255.0 +250 190 1.3634251196526272 43.68487488675261 255.0 +260 190 1.3634855391111143 43.68487530023429 255.0 +270 190 1.3635459586914722 43.684875713685585 255.0 +280 190 1.3636063783937045 43.684876127106484 255.0 +290 190 1.3636667982178134 43.684876540497 255.0 +0 200 1.3619149071383958 43.684819422032646 255.0 +10 200 1.3619753235353333 43.68481983622925 255.0 +20 200 1.36203574005407 43.68482025039547 255.0 +30 200 1.3620961566946086 43.68482066453128 255.0 +40 200 1.362156573456952 43.6848210786367 255.0 +50 200 1.3622169903411034 43.68482149271173 255.0 +60 200 1.3622774073470658 43.68482190675636 255.0 +70 200 1.3623378244748419 43.6848223207706 255.0 +80 200 1.3623982417244347 43.68482273475444 255.0 +90 200 1.3624586590958472 43.68482314870789 255.0 +100 200 1.3625190765890824 43.684823562630946 255.0 +110 200 1.3625794942041434 43.68482397652361 255.0 +120 200 1.3626399119410326 43.68482439038588 255.0 +130 200 1.3627003297997535 43.684824804217754 255.0 +140 200 1.362760747780309 43.68482521801924 255.0 +150 200 1.3628211658827016 43.68482563179033 255.0 +160 200 1.3628815841069348 43.68482604553103 255.0 +170 200 1.362942002453011 43.68482645924134 255.0 +180 200 1.3630024209209337 43.684826872921256 255.0 +190 200 1.3630628395107054 43.68482728657078 255.0 +200 200 1.3631232582223294 43.68482770018991 255.0 +210 200 1.3631836770558083 43.68482811377866 255.0 +220 200 1.3632440960111452 43.68482852733701 255.0 +230 200 1.363304515088343 43.684828940864975 255.0 +240 200 1.3633649342874048 43.68482935436255 255.0 +250 200 1.3634253536083332 43.684829767829726 255.0 +260 200 1.3634857730511314 43.68483018126652 255.0 +270 200 1.3635461926158021 43.684830594672924 255.0 +280 200 1.3636066123023485 43.68483100804894 255.0 +290 200 1.3636670321107733 43.68483142139456 255.0 +0 210 1.3619151414391155 43.684774304215104 255.0 +10 210 1.3619755578203252 43.684774718366825 255.0 +20 210 1.3620359743233357 43.68477513248815 255.0 +30 210 1.3620963909481496 43.684775546579075 255.0 +40 210 1.36215680769477 43.684775960639605 255.0 +50 210 1.3622172245631998 43.684776374669745 255.0 +60 210 1.362277641553442 43.68477678866949 255.0 +70 210 1.3623380586654996 43.684777202638834 255.0 +80 210 1.3623984758993755 43.68477761657779 255.0 +90 210 1.3624588932550725 43.68477803048635 255.0 +100 210 1.362519310732594 43.68477844436452 255.0 +110 210 1.3625797283319423 43.68477885821229 255.0 +120 210 1.3626401460531208 43.68477927202967 255.0 +130 210 1.3627005638961325 43.68477968581666 255.0 +140 210 1.36276098186098 43.68478009957325 255.0 +150 210 1.3628213999476664 43.68478051329946 255.0 +160 210 1.3628818181561948 43.684780926995266 255.0 +170 210 1.362942236486568 43.684781340660685 255.0 +180 210 1.3630026549387888 43.68478175429571 255.0 +190 210 1.3630630735128606 43.68478216790035 255.0 +200 210 1.3631234922087858 43.68478258147459 255.0 +210 210 1.3631839110265676 43.684782995018445 255.0 +220 210 1.363244329966209 43.684783408531906 255.0 +230 210 1.3633047490277128 43.68478382201498 255.0 +240 210 1.363365168211082 43.68478423546766 255.0 +250 210 1.3634255875163193 43.68478464888996 255.0 +260 210 1.363486006943428 43.68478506228186 255.0 +270 210 1.3635464264924109 43.68478547564337 255.0 +280 210 1.3636068461632709 43.684785888974496 255.0 +290 210 1.363667265956011 43.68478630227523 255.0 +0 220 1.36191537569212 43.68472918638069 255.0 +10 220 1.3619757920576014 43.68472960048752 255.0 +20 220 1.362036208544885 43.684730014563954 255.0 +30 220 1.3620966251539735 43.684730428609996 255.0 +40 220 1.36215704188487 43.68473084262563 255.0 +50 220 1.3622174587375775 43.68473125661088 255.0 +60 220 1.362277875712099 43.68473167056574 255.0 +70 220 1.3623382928084373 43.6847320844902 255.0 +80 220 1.3623987100265955 43.684732498384264 255.0 +90 220 1.3624591273665763 43.68473291224793 255.0 +100 220 1.362519544828383 43.68473332608121 255.0 +110 220 1.3625799624120183 43.684733739884095 255.0 +120 220 1.3626403801174851 43.684734153656585 255.0 +130 220 1.3627007979447867 43.684734567398685 255.0 +140 220 1.3627612158939257 43.68473498111039 255.0 +150 220 1.3628216339649053 43.6847353947917 255.0 +160 220 1.362882052157728 43.68473580844262 255.0 +170 220 1.3629424704723974 43.68473622206315 255.0 +180 220 1.3630028889089159 43.68473663565329 255.0 +190 220 1.3630633074672867 43.68473704921303 255.0 +200 220 1.3631237261475126 43.68473746274238 255.0 +210 220 1.3631841449495965 43.68473787624135 255.0 +220 220 1.3632445638735415 43.68473828970992 255.0 +230 220 1.3633049829193506 43.6847387031481 255.0 +240 220 1.3633654020870265 43.684739116555896 255.0 +250 220 1.3634258213765722 43.684739529933296 255.0 +260 220 1.3634862407879909 43.684739943280306 255.0 +270 220 1.3635466603212851 43.684740356596926 255.0 +280 220 1.363607079976458 43.68474076988316 255.0 +290 220 1.3636674997535123 43.684741183139 255.0 +0 230 1.3619156098973957 43.68468406852941 255.0 +10 230 1.3619760262471479 43.68468448259135 255.0 +20 230 1.362036442718704 43.68468489662289 255.0 +30 230 1.3620968593120664 43.68468531062404 255.0 +40 230 1.3621572760272382 43.68468572459479 255.0 +50 230 1.3622176928642227 43.68468613853515 255.0 +60 230 1.3622781098230228 43.684686552445115 255.0 +70 230 1.362338526903641 43.68468696632468 255.0 +80 230 1.3623989441060806 43.68468738017386 255.0 +90 230 1.3624593614303446 43.68468779399264 255.0 +100 230 1.362519778876436 43.68468820778103 255.0 +110 230 1.3625801964443573 43.68468862153902 255.0 +120 230 1.362640614134112 43.68468903526662 255.0 +130 230 1.3627010319457027 43.68468944896383 255.0 +140 230 1.3627614498791325 43.68468986263064 255.0 +150 230 1.3628218679344044 43.68469027626706 255.0 +160 230 1.362882286111521 43.684690689873094 255.0 +170 230 1.3629427044104856 43.68469110344873 255.0 +180 230 1.363003122831301 43.68469151699398 255.0 +190 230 1.3630635413739702 43.68469193050883 255.0 +200 230 1.3631239600384961 43.68469234399329 255.0 +210 230 1.3631843788248816 43.684692757447365 255.0 +220 230 1.3632447977331295 43.68469317087105 255.0 +230 230 1.3633052167632431 43.68469358426434 255.0 +240 230 1.363365635915225 43.684693997627235 255.0 +250 230 1.3634260551890784 43.68469441095975 255.0 +260 230 1.363486474584806 43.68469482426187 255.0 +270 230 1.363546894102411 43.684695237533596 255.0 +280 230 1.3636073137418958 43.68469565077494 255.0 +290 230 1.363667733503264 43.68469606398589 255.0 +0 240 1.361915844054929 43.68463895066126 255.0 +10 240 1.3619762603889514 43.68463936467831 255.0 +20 240 1.362036676844779 43.684639778664966 255.0 +30 240 1.3620970934224146 43.684640192621224 255.0 +40 240 1.3621575101218613 43.684640606547084 255.0 +50 240 1.3622179269431218 43.684641020442555 255.0 +60 240 1.3622783438861996 43.68464143430763 255.0 +70 240 1.3623387609510973 43.684641848142306 255.0 +80 240 1.3623991781378177 43.684642261946586 255.0 +90 240 1.362459595446364 43.684642675720475 255.0 +100 240 1.3625200128767394 43.684643089463975 255.0 +110 240 1.3625804304289462 43.68464350317708 255.0 +120 240 1.362640848102988 43.684643916859784 255.0 +130 240 1.362701265898867 43.6846443305121 255.0 +140 240 1.3627616838165868 43.684644744134026 255.0 +150 240 1.3628221018561502 43.684645157725555 255.0 +160 240 1.36288252001756 43.684645571286694 255.0 +170 240 1.3629429383008191 43.684645984817436 255.0 +180 240 1.3630033567059308 43.684646398317796 255.0 +190 240 1.3630637752328976 43.68464681178776 255.0 +200 240 1.3631241938817227 43.68464722522733 255.0 +210 240 1.363184612652409 43.684647638636505 255.0 +220 240 1.3632450315449594 43.6846480520153 255.0 +230 240 1.3633054505593765 43.68464846536369 255.0 +240 240 1.3633658696956639 43.684648878681706 255.0 +250 240 1.363426288953824 43.68464929196932 255.0 +260 240 1.36348670833386 43.68464970522655 255.0 +270 240 1.363547127835775 43.68465011845339 255.0 +280 240 1.3636075474595712 43.68465053164984 255.0 +290 240 1.3636679672052523 43.6846509448159 255.0 +0 250 1.3619160781647064 43.68459383277626 255.0 +10 250 1.3619764944829982 43.68459424674842 255.0 +20 250 1.3620369109230965 43.68459466069018 255.0 +30 250 1.3620973274850046 43.684595074601546 255.0 +40 250 1.3621577441687251 43.684595488482515 255.0 +50 250 1.3622181609742614 43.68459590233309 255.0 +60 250 1.3622785779016162 43.684596316153275 255.0 +70 250 1.3623389949507925 43.68459672994306 255.0 +80 250 1.362399412121793 43.684597143702455 255.0 +90 250 1.362459829414621 43.68459755743145 255.0 +100 250 1.3625202468292794 43.68459797113005 255.0 +110 250 1.362580664365771 43.684598384798264 255.0 +120 250 1.3626410820240988 43.684598798436085 255.0 +130 250 1.362701499804266 43.68459921204351 255.0 +140 250 1.3627619177062749 43.684599625620535 255.0 +150 250 1.3628223357301292 43.68460003916718 255.0 +160 250 1.3628827538758312 43.684600452683426 255.0 +170 250 1.3629431721433845 43.684600866169276 255.0 +180 250 1.3630035905327915 43.68460127962474 255.0 +190 250 1.3630640090440551 43.68460169304981 255.0 +200 250 1.3631244276771788 43.68460210644449 255.0 +210 250 1.363184846432165 43.68460251980878 255.0 +220 250 1.363245265309017 43.68460293314267 255.0 +230 250 1.3633056843077374 43.68460334644618 255.0 +240 250 1.3633661034283293 43.684603759719295 255.0 +250 250 1.3634265226707956 43.68460417296202 255.0 +260 250 1.3634869420351394 43.68460458617435 255.0 +270 250 1.3635473615213634 43.6846049993563 255.0 +280 250 1.3636077811294705 43.68460541250786 255.0 +290 250 1.3636682008594638 43.68460582562902 255.0 +0 260 1.3619163122267142 43.684548714874396 255.0 +10 260 1.3619767285292745 43.68454912880166 255.0 +20 260 1.362037144953643 43.684549542698534 255.0 +30 260 1.3620975614998228 43.68454995656501 255.0 +40 260 1.3621579781678166 43.68455037040109 255.0 +50 260 1.3622183949576276 43.68455078420677 255.0 +60 260 1.3622788118692586 43.68455119798206 255.0 +70 260 1.3623392289027128 43.68455161172696 255.0 +80 260 1.3623996460579928 43.684552025441455 255.0 +90 260 1.3624600633351016 43.68455243912556 255.0 +100 260 1.3625204807340425 43.68455285277928 255.0 +110 260 1.3625808982548182 43.684553266402595 255.0 +120 260 1.3626413158974315 43.68455367999552 255.0 +130 260 1.3627017336618856 43.68455409355805 255.0 +140 260 1.3627621515481834 43.68455450709019 255.0 +150 260 1.3628225695563276 43.684554920591935 255.0 +160 260 1.3628829876863213 43.68455533406329 255.0 +170 260 1.3629434059381678 43.68455574750425 255.0 +180 260 1.3630038243118694 43.684556160914816 255.0 +190 260 1.3630642428074295 43.684556574294994 255.0 +200 260 1.363124661424851 43.68455698764478 255.0 +210 260 1.3631850801641365 43.684557400964174 255.0 +220 260 1.3632454990252891 43.68455781425318 255.0 +230 260 1.363305918008312 43.68455822751179 255.0 +240 260 1.3633663371132079 43.684558640740015 255.0 +250 260 1.3634267563399796 43.684559053937846 255.0 +260 260 1.3634871756886302 43.68455946710529 255.0 +270 260 1.3635475951591627 43.68455988024234 255.0 +280 260 1.3636080147515799 43.684560293349 255.0 +290 260 1.3636684344658847 43.68456070642527 255.0 +0 270 1.3619165462409386 43.684503596955686 255.0 +10 270 1.361976962527767 43.68450401083806 255.0 +20 270 1.3620373789364049 43.68450442469004 255.0 +30 270 1.3620977954668556 43.68450483851162 255.0 +40 270 1.3621582121191218 43.68450525230281 255.0 +50 270 1.362218628893207 43.6845056660636 255.0 +60 270 1.3622790457891136 43.684506079794 255.0 +70 270 1.3623394628068448 43.684506493494 255.0 +80 270 1.3623998799464034 43.68450690716361 255.0 +90 270 1.3624602972077926 43.68450732080282 255.0 +100 270 1.3625207145910152 43.68450773441164 255.0 +110 270 1.3625811320960741 43.684508147990066 255.0 +120 270 1.3626415497229722 43.684508561538095 255.0 +130 270 1.3627019674717127 43.684508975055735 255.0 +140 270 1.362762385342298 43.68450938854298 255.0 +150 270 1.3628228033347318 43.68450980199983 255.0 +160 270 1.3628832214490167 43.68451021542629 255.0 +170 270 1.3629436396851555 43.68451062882236 255.0 +180 270 1.363004058043151 43.684511042188035 255.0 +190 270 1.3630644765230067 43.68451145552332 255.0 +200 270 1.3631248951247252 43.68451186882821 255.0 +210 270 1.3631853138483094 43.68451228210271 255.0 +220 270 1.3632457326937621 43.684512695346825 255.0 +230 270 1.3633061516610867 43.684513108560544 255.0 +240 270 1.3633665707502858 43.68451352174387 255.0 +250 270 1.3634269899613622 43.684513934896806 255.0 +260 270 1.3634874092943192 43.684514348019356 255.0 +270 270 1.3635478287491594 43.684514761111515 255.0 +280 270 1.3636082483258858 43.68451517417328 255.0 +290 270 1.3636686680245016 43.68451558720466 255.0 +0 280 1.3619167802073662 43.68445847902013 255.0 +10 280 1.3619771964784615 43.68445889285761 255.0 +20 280 1.3620376128713683 43.6844593066647 255.0 +30 280 1.3620980293860891 43.68445972044139 255.0 +40 280 1.3621584460226275 43.68446013418768 255.0 +50 280 1.3622188627809857 43.68446054790358 255.0 +60 280 1.3622792796611671 43.68446096158908 255.0 +70 280 1.362339696663175 43.68446137524419 255.0 +80 280 1.3624001137870114 43.68446178886891 255.0 +90 280 1.36246053103268 43.68446220246322 255.0 +100 280 1.3625209484001837 43.684462616027155 255.0 +110 280 1.3625813658895252 43.68446302956068 255.0 +120 280 1.3626417835007072 43.68446344306382 255.0 +130 280 1.3627022012337333 43.68446385653657 255.0 +140 280 1.3627626190886062 43.68446426997892 255.0 +150 280 1.3628230370653285 43.68446468339088 255.0 +160 280 1.3628834551639035 43.68446509677244 255.0 +170 280 1.362943873384334 43.684465510123616 255.0 +180 280 1.363004291726623 43.6844659234444 255.0 +190 280 1.3630647101907734 43.684466336734786 255.0 +200 280 1.3631251287767883 43.68446674999478 255.0 +210 280 1.3631855474846704 43.68446716322439 255.0 +220 280 1.3632459663144225 43.68446757642361 255.0 +230 280 1.3633063852660479 43.68446798959243 255.0 +240 280 1.3633668043395495 43.684468402730865 255.0 +250 280 1.36342722353493 43.684468815838905 255.0 +260 280 1.3634876428521925 43.68446922891656 255.0 +270 280 1.3635480622913396 43.68446964196382 255.0 +280 280 1.3636084818523748 43.68447005498069 255.0 +290 280 1.3636689015353007 43.68447046796718 255.0 +0 290 1.361917014125983 43.68441336106773 255.0 +10 290 1.361977430381345 43.684413774860325 255.0 +20 290 1.3620378467585197 43.68441418862252 255.0 +30 290 1.3620982632575103 43.68441460235431 255.0 +40 290 1.3621586798783194 43.68441501605571 255.0 +50 290 1.3622190966209504 43.68441542972671 255.0 +60 290 1.362279513485406 43.684415843367326 255.0 +70 290 1.3623399304716894 43.68441625697754 255.0 +80 290 1.3624003475798032 43.68441667055736 255.0 +90 290 1.3624607648097506 43.684417084106784 255.0 +100 290 1.3625211821615344 43.684417497625816 255.0 +110 290 1.3625815996351576 43.68441791111445 255.0 +120 290 1.3626420172306233 43.6844183245727 255.0 +130 290 1.3627024349479342 43.684418738000545 255.0 +140 290 1.3627628527870934 43.684419151398004 255.0 +150 290 1.3628232707481038 43.684419564765065 255.0 +160 290 1.362883688830968 43.68441997810174 255.0 +170 290 1.3629441070356898 43.68442039140802 255.0 +180 290 1.3630045253622713 43.6844208046839 255.0 +190 290 1.3630649438107159 43.6844212179294 255.0 +200 290 1.3631253623810262 43.6844216311445 255.0 +210 290 1.3631857810732055 43.68442204432921 255.0 +220 290 1.3632461998872565 43.684422457483535 255.0 +230 290 1.3633066188231822 43.68442287060746 255.0 +240 290 1.3633670378809855 43.684423283701 255.0 +250 290 1.3634274570606693 43.68442369676415 255.0 +260 290 1.3634878763622365 43.68442410979691 255.0 +270 290 1.3635482957856901 43.684424522799276 255.0 +280 290 1.3636087153310332 43.68442493577125 255.0 +290 290 1.3636691349982684 43.684425348712836 255.0 diff --git a/Data/Input/spot6/spot6-1.gcp2 b/Data/Input/spot6/spot6-1.gcp2 new file mode 100644 index 0000000000..3a18ceb077 --- /dev/null +++ b/Data/Input/spot6/spot6-1.gcp2 @@ -0,0 +1,901 @@ +#From file /work/scratch/osmanj/otb_valid/spot6-1.geom +0 0 1.7338304667177207 41.681598613425585 500.0 +10 0 1.7345895029992957 41.68160260991629 500.0 +20 0 1.7353485280057404 41.68160660099113 500.0 +30 0 1.7361075417393081 41.681610586650365 500.0 +40 0 1.7368665442022515 41.68161456689424 500.0 +50 0 1.7376255353968233 41.68161854172301 500.0 +60 0 1.7383845153252757 41.68162251113692 500.0 +70 0 1.739143483989861 41.68162647513622 500.0 +80 0 1.7399024413928317 41.68163043372117 500.0 +90 0 1.7406613875364398 41.681634386892 500.0 +100 0 1.7414203224229374 41.68163833464897 500.0 +110 0 1.7421792460545766 41.681642276992335 500.0 +120 0 1.7429381584336088 41.68164621392234 500.0 +130 0 1.7436970595622858 41.681650145439235 500.0 +140 0 1.744455949442859 41.68165407154327 500.0 +150 0 1.7452148280775805 41.68165799223469 500.0 +160 0 1.745973695468701 41.68166190751375 500.0 +170 0 1.746732551618472 41.6816658173807 500.0 +180 0 1.7474913965291445 41.68166972183578 500.0 +190 0 1.7482502302029697 41.681673620879245 500.0 +200 0 1.749009052642198 41.68167751451135 500.0 +210 0 1.7497678638490806 41.68168140273233 500.0 +220 0 1.7505266638258679 41.68168528554244 500.0 +230 0 1.7512854525748107 41.681689162941936 500.0 +240 0 1.7520442300981591 41.681693034931065 500.0 +250 0 1.7528029963981635 41.681696901510065 500.0 +260 0 1.7535617514770743 41.68170076267919 500.0 +270 0 1.7543204953371414 41.681704618438694 500.0 +280 0 1.7550792279806149 41.68170846878882 500.0 +290 0 1.7558379494097442 41.68171231372982 500.0 +0 10 1.7338356457135158 41.68103555876609 500.0 +10 10 1.7345946713155105 41.68103955441226 500.0 +20 10 1.7353536856459966 41.68104354464274 500.0 +30 10 1.7361126887072271 41.68104752945778 500.0 +40 10 1.7368716805014537 41.68105150885763 500.0 +50 10 1.7376306610309293 41.68105548284253 500.0 +60 10 1.7383896302979058 41.68105945141275 500.0 +70 10 1.739148588304635 41.68106341456853 500.0 +80 10 1.739907535053369 41.68106737231011 500.0 +90 10 1.7406664705463593 41.681071324637756 500.0 +100 10 1.7414253947858578 41.681075271551705 500.0 +110 10 1.742184307774116 41.68107921305222 500.0 +120 10 1.742943209513385 41.68108314913954 500.0 +130 10 1.7437021000059167 41.68108707981391 500.0 +140 10 1.7444609792539618 41.68109100507559 500.0 +150 10 1.7452198472597713 41.68109492492483 500.0 +160 10 1.7459787040255967 41.681098839361866 500.0 +170 10 1.7467375495536888 41.681102748386955 500.0 +180 10 1.7474963838462976 41.68110665200035 500.0 +190 10 1.7482552069056743 41.6811105502023 500.0 +200 10 1.7490140187340695 41.68111444299305 500.0 +210 10 1.7497728193337332 41.68111833037284 500.0 +220 10 1.7505316087069158 41.68112221234194 500.0 +230 10 1.7512903868558678 41.68112608890058 500.0 +240 10 1.7520491537828389 41.68112996004901 500.0 +250 10 1.7528079094900788 41.6811338257875 500.0 +260 10 1.753566653979838 41.68113768611627 500.0 +270 10 1.7543253872543656 41.681141541035586 500.0 +280 10 1.7550841093159115 41.68114539054569 500.0 +290 10 1.7558428201667249 41.68114923464683 500.0 +0 20 1.7338408230276385 41.68047250360779 500.0 +10 20 1.7345998379512135 41.68047649840954 500.0 +20 20 1.7353588416069015 41.680480487795776 500.0 +30 20 1.736117833996955 41.68048447176673 500.0 +40 20 1.736876815123625 41.68048845032267 500.0 +50 20 1.7376357849891642 41.68049242346383 500.0 +60 20 1.7383947435958238 41.680496391190474 500.0 +70 20 1.7391536909458558 41.68050035350284 500.0 +80 20 1.7399126270415117 41.68050431040119 500.0 +90 20 1.7406715518850424 41.68050826188576 500.0 +100 20 1.7414304654786998 41.68051220795681 500.0 +110 20 1.7421893678247349 41.68051614861458 500.0 +120 20 1.7429482589253984 41.68052008385932 500.0 +130 20 1.7437071387829415 41.6805240136913 500.0 +140 20 1.7444660073996152 41.680527938110735 500.0 +150 20 1.7452248647776696 41.6805318571179 500.0 +160 20 1.745983710919356 41.680535770713036 500.0 +170 20 1.7467425458269243 41.680539678896395 500.0 +180 20 1.7475013695026254 41.68054358166822 500.0 +190 20 1.748260181948709 41.68054747902877 500.0 +200 20 1.7490189831674257 41.68055137097828 500.0 +210 20 1.7497777731610251 41.680555257517 500.0 +220 20 1.7505365519317573 41.680559138645194 500.0 +230 20 1.7512953194818721 41.6805630143631 500.0 +240 20 1.7520540758136192 41.68056688467097 500.0 +250 20 1.7528128209292482 41.68057074956904 500.0 +260 20 1.7535715548310085 41.68057460905757 500.0 +270 20 1.7543302775211493 41.68057846313682 500.0 +280 20 1.75508898900192 41.680582311807015 500.0 +290 20 1.7558476892755694 41.68058615506841 500.0 +0 30 1.7338459986601353 41.67990944795114 500.0 +10 30 1.734605002906452 41.679913441908596 500.0 +20 30 1.7353639958885023 41.6799174304507 500.0 +30 30 1.7361229776085387 41.679921413577695 500.0 +40 30 1.736881948068812 41.67992539128984 500.0 +50 30 1.7376409072715742 41.67992936358738 500.0 +60 30 1.7383998552190765 41.67993333047056 500.0 +70 30 1.7391587919135703 41.67993729193964 500.0 +80 30 1.7399177173573066 41.679941247994854 500.0 +90 30 1.7406766315525362 41.679945198636474 500.0 +100 30 1.7414355345015105 41.67994914386473 500.0 +110 30 1.7421944262064797 41.679953083679884 500.0 +120 30 1.742953306669695 41.67995701808217 500.0 +130 30 1.7437121758934064 41.679960947071855 500.0 +140 30 1.744471033879865 41.67996487064918 500.0 +150 30 1.745229880631321 41.67996878881439 500.0 +160 30 1.745988716150024 41.67997270156774 500.0 +170 30 1.7467475404382249 41.67997660890948 500.0 +180 30 1.7475063534981732 41.67998051083985 500.0 +190 30 1.7482651553321187 41.67998440735911 500.0 +200 30 1.7490239459423116 41.6799882984675 500.0 +210 30 1.7497827253310012 41.67999218416527 500.0 +220 30 1.750541493500437 41.67999606445268 500.0 +230 30 1.7513002504528687 41.67999993932996 500.0 +240 30 1.7520589961905455 41.68000380879737 500.0 +250 30 1.7528177307157162 41.68000767285516 500.0 +260 30 1.7535764540306307 41.680011531503574 500.0 +270 30 1.7543351661375373 41.68001538474286 500.0 +280 30 1.7550938670386849 41.680019232573265 500.0 +290 30 1.7558525567363223 41.68002307499504 500.0 +0 40 1.733851172611054 41.679346391796614 500.0 +10 40 1.7346101661812727 41.67935038490989 500.0 +20 40 1.7353691484908458 41.67935437260798 500.0 +30 40 1.736128119542025 41.67935835489113 500.0 +40 40 1.7368870793370614 41.6793623317596 500.0 +50 40 1.7376460278782064 41.67936630321363 500.0 +60 40 1.7384049651677105 41.67937026925347 500.0 +70 40 1.7391638912078247 41.67937422987937 500.0 +80 40 1.7399228060007996 41.679378185091586 500.0 +90 40 1.7406817095488862 41.67938213489036 500.0 +100 40 1.7414406018543351 41.67938607927594 500.0 +110 40 1.7421994829193963 41.67939001824859 500.0 +120 40 1.7429583527463206 41.67939395180854 500.0 +130 40 1.7437172113373576 41.679397879956056 500.0 +140 40 1.7444760586947579 41.67940180269138 500.0 +150 40 1.745234894820771 41.679405720014756 500.0 +160 40 1.7459937197176472 41.67940963192643 500.0 +170 40 1.7467525333876357 41.679413538426665 500.0 +180 40 1.7475113358329866 41.6794174395157 500.0 +190 40 1.748270127055949 41.679421335193794 500.0 +200 40 1.7490289070587728 41.67942522546118 500.0 +210 40 1.749787675843707 41.67942911031812 500.0 +220 40 1.7505464334130005 41.679432989764855 500.0 +230 40 1.7513051797689025 41.679436863801634 500.0 +240 40 1.7520639149136623 41.67944073242871 500.0 +250 40 1.7528226388495283 41.67944459564632 500.0 +260 40 1.7535813515787493 41.67944845345473 500.0 +270 40 1.754340053103574 41.67945230585418 500.0 +280 40 1.7550987434262506 41.679456152844914 500.0 +290 40 1.755857422549028 41.679459994427184 500.0 +0 50 1.7338563448804416 41.67878333514467 500.0 +10 50 1.734615327775723 41.678787327413886 500.0 +20 50 1.7353742994139791 41.67879131426808 500.0 +30 50 1.7361332597974615 41.6787952957075 500.0 +40 50 1.7368922089284207 41.67879927173241 500.0 +50 50 1.7376511468091074 41.678803242343044 500.0 +60 50 1.738410073441772 41.67880720753966 500.0 +70 50 1.7391689888286654 41.67881116732251 500.0 +80 50 1.7399278929720379 41.678815121691834 500.0 +90 50 1.7406867858741395 41.67881907064788 500.0 +100 50 1.7414456675372207 41.67882301419092 500.0 +110 50 1.7422045379635314 41.678826952321174 500.0 +120 50 1.7429633971553216 41.678830885038906 500.0 +130 50 1.7437222451148406 41.67883481234437 500.0 +140 50 1.744481081844339 41.6788387342378 500.0 +150 50 1.7452399073460658 41.67884265071946 500.0 +160 50 1.7459987216222703 41.678846561789584 500.0 +170 50 1.7467575246752025 41.678850467448434 500.0 +180 50 1.7475163165071113 41.67885436769625 500.0 +190 50 1.7482750971202456 41.67885826253329 500.0 +200 50 1.7490338665168548 41.67886215195979 500.0 +210 50 1.7497926246991875 41.67886603597601 500.0 +220 50 1.7505513716694927 41.67886991458219 500.0 +230 50 1.7513101074300188 41.678873787778585 500.0 +240 50 1.7520688319830147 41.67887765556544 500.0 +250 50 1.752827545330729 41.678881517943 500.0 +260 50 1.7535862474754091 41.678885374911516 500.0 +270 50 1.7543449384193042 41.67888922647124 500.0 +280 50 1.7551036181646622 41.678893072622415 500.0 +290 50 1.7558622867137308 41.67889691336529 500.0 +0 60 1.733861515468345 41.678220277995784 500.0 +10 60 1.7346204876898499 41.67822426942105 500.0 +20 60 1.7353794486579492 41.67822825543146 500.0 +30 60 1.7361383983748946 41.67823223602728 500.0 +40 60 1.736897336842936 41.67823621120874 500.0 +50 60 1.7376562640643238 41.678240180976104 500.0 +60 60 1.7384151800413081 41.67824414532961 500.0 +70 60 1.7391740847761392 41.678248104269514 500.0 +80 60 1.7399329782710673 41.678252057796065 500.0 +90 60 1.7406918605283421 41.67825600590952 500.0 +100 60 1.7414507315502132 41.67825994861011 500.0 +110 60 1.7422095913389306 41.6782638858981 500.0 +120 60 1.7429684398967435 41.67826781777373 500.0 +130 60 1.743727277225902 41.67827174423725 500.0 +140 60 1.7444861033286545 41.678275665288915 500.0 +150 60 1.745244918207251 41.678279580928965 500.0 +160 60 1.7460037218639402 41.67828349115766 500.0 +170 60 1.746762514300971 41.67828739597524 500.0 +180 60 1.7475212955205925 41.67829129538195 500.0 +190 60 1.7482800655250534 41.678295189378055 500.0 +200 60 1.7490388243166024 41.678299077963786 500.0 +210 60 1.749797571897488 41.6783029611394 500.0 +220 60 1.7505563082699587 41.678306838905144 500.0 +230 60 1.7513150334362626 41.67831071126127 500.0 +240 60 1.7520737473986479 41.67831457820802 500.0 +250 60 1.7528324501593628 41.67831843974564 500.0 +260 60 1.7535911417206551 41.67832229587439 500.0 +270 60 1.7543498220847729 41.6783261465945 500.0 +280 60 1.7551084912539638 41.67832999190624 500.0 +290 60 1.7558671492304754 41.678333831809844 500.0 +0 70 1.7338666843748118 41.67765722035041 500.0 +10 70 1.7346256459237004 41.67766121093185 500.0 +20 70 1.7353845962228034 41.6776651960986 500.0 +30 70 1.7361435352743713 41.67766917585092 500.0 +40 70 1.7369024630806542 41.67767315018906 500.0 +50 70 1.7376613796439024 41.67767711911326 500.0 +60 70 1.7384202849663652 41.67768108262378 500.0 +70 70 1.7391791790502926 41.67768504072086 500.0 +80 70 1.7399380618979345 41.67768899340476 500.0 +90 70 1.74069693351154 41.67769294067572 500.0 +100 70 1.7414557938933588 41.677696882533986 500.0 +110 70 1.7422146430456402 41.67770081897982 500.0 +120 70 1.742973480970633 41.67770475001346 500.0 +130 70 1.7437323076705868 41.67770867563517 500.0 +140 70 1.7444911231477502 41.67771259584518 500.0 +150 70 1.7452499274043722 41.67771651064375 500.0 +160 70 1.7460087204427015 41.677720420031115 500.0 +170 70 1.7467675022649864 41.67772432400754 500.0 +180 70 1.747526272873476 41.67772822257327 500.0 +190 70 1.7482850322704182 41.67773211572855 500.0 +200 70 1.7490437804580614 41.67773600347363 500.0 +210 70 1.749802517438654 41.67773988580876 500.0 +220 70 1.7505612432144437 41.67774376273419 500.0 +230 70 1.7513199577876786 41.67774763425015 500.0 +240 70 1.7520786611606063 41.67775150035692 500.0 +250 70 1.7528373533354749 41.67775536105472 500.0 +260 70 1.7535960343145318 41.67775921634381 500.0 +270 70 1.7543547041000245 41.677763066224436 500.0 +280 70 1.7551133626942002 41.677766910696846 500.0 +290 70 1.7558720100993062 41.677770749761294 500.0 +0 80 1.7338718515998892 41.67709416220902 500.0 +10 80 1.7346308024773216 41.677098151946744 500.0 +20 80 1.7353897421085878 41.67710213626995 500.0 +30 80 1.7361486704959384 41.677106115178894 500.0 +40 80 1.7369075876416227 41.67711008867382 500.0 +50 80 1.73766649354789 41.67711405675498 500.0 +60 80 1.73842538821699 41.67711801942263 500.0 +70 80 1.7391842716511723 41.67712197667701 500.0 +80 80 1.7399431438526858 41.677125928518365 500.0 +90 80 1.74070200482378 41.67712987494695 500.0 +100 80 1.741460854566704 41.67713381596302 500.0 +110 80 1.7422196930837064 41.67713775156681 500.0 +120 80 1.742978520377036 41.677141681758584 500.0 +130 80 1.743737336448942 41.67714560653859 500.0 +140 80 1.7444961413016722 41.67714952590706 500.0 +150 80 1.7452549349374755 41.67715343986426 500.0 +160 80 1.7460137173586003 41.67715734841043 500.0 +170 80 1.7467724885672948 41.67716125154582 500.0 +180 80 1.747531248565807 41.67716514927068 500.0 +190 80 1.7482899973563852 41.67716904158526 500.0 +200 80 1.7490487349412769 41.6771729284898 500.0 +210 80 1.7498074613227301 41.67717680998456 500.0 +220 80 1.750566176502993 41.67718068606978 500.0 +230 80 1.751324880484312 41.677184556745715 500.0 +240 80 1.7520835732689353 41.677188422012605 500.0 +250 80 1.7528422548591105 41.6771922818707 500.0 +260 80 1.7536009252570839 41.677196136320255 500.0 +270 80 1.7543595844651032 41.677199985361504 500.0 +280 80 1.7551182324854155 41.677203828994706 500.0 +290 80 1.7558768693202675 41.67720766722011 500.0 +0 90 1.7338770171436237 41.676531103572074 500.0 +10 90 1.7346359573507604 41.6765350924662 500.0 +20 90 1.7353948863153503 41.67653907594598 500.0 +30 90 1.736153804039643 41.67654305401167 500.0 +40 90 1.7369127105258872 41.6765470266635 500.0 +50 90 1.737671605776333 41.67655099390174 500.0 +60 90 1.738430489793229 41.67655495572663 500.0 +70 90 1.7391893625788244 41.67655891213841 500.0 +80 90 1.7399482241353679 41.67656286313735 500.0 +90 90 1.7407070744651085 41.676566808723685 500.0 +100 90 1.7414659135702948 41.67657074889766 500.0 +110 90 1.742224741453175 41.67657468365954 500.0 +120 90 1.7429835581159983 41.67657861300956 500.0 +130 90 1.7437423635610125 41.676582536947976 500.0 +140 90 1.7445011577904657 41.676586455475025 500.0 +150 90 1.7452599408066063 41.67659036859097 500.0 +160 90 1.7460187126116824 41.67659427629606 500.0 +170 90 1.7467774732079413 41.67659817859053 500.0 +180 90 1.7475362225976312 41.67660207547464 500.0 +190 90 1.7482949607829996 41.67660596694863 500.0 +200 90 1.7490536877662943 41.676609853012756 500.0 +210 90 1.7498124035497622 41.67661373366726 500.0 +220 90 1.7505711081356512 41.676617608912395 500.0 +230 90 1.751329801526208 41.6766214787484 500.0 +240 90 1.7520884837236796 41.67662534317554 500.0 +250 90 1.7528471547303135 41.67662920219405 500.0 +260 90 1.7536058145483562 41.676633055804174 500.0 +270 90 1.7543644631800546 41.67663690400617 500.0 +280 90 1.755123100627655 41.67664074680029 500.0 +290 90 1.7558817268934042 41.67664458418676 500.0 +0 100 1.7338821810060632 41.67596804444004 500.0 +10 100 1.7346411105440642 41.67597203249069 500.0 +20 100 1.7354000288431375 41.67597601512716 500.0 +30 100 1.7361589359055314 41.6759799923497 500.0 +40 100 1.7369178317334955 41.67598396415856 500.0 +50 100 1.7376767163292783 41.675987930553994 500.0 +60 100 1.738435589695129 41.675991891536235 500.0 +70 100 1.7391944518332956 41.675995847105554 500.0 +80 100 1.7399533027460268 41.675999797262186 500.0 +90 100 1.7407121424355714 41.67600374200638 500.0 +100 100 1.7414709709041774 41.67600768133839 500.0 +110 100 1.742229788154093 41.67601161525846 500.0 +120 100 1.742988594187566 41.676015543766844 500.0 +130 100 1.743747389006845 41.67601946686379 500.0 +140 100 1.7445061726141773 41.676023384549545 500.0 +150 100 1.745264945011811 41.67602729682435 500.0 +160 100 1.7460237062019932 41.67603120368847 500.0 +170 100 1.7467824561869716 41.67603510514214 500.0 +180 100 1.747541194968994 41.67603900118561 500.0 +190 100 1.7482999225503073 41.67604289181914 500.0 +200 100 1.7490586389331586 41.676046777042956 500.0 +210 100 1.749817344119795 41.67605065685732 500.0 +220 100 1.7505760381124638 41.67605453126249 500.0 +230 100 1.7513347209134111 41.6760584002587 500.0 +240 100 1.7520933925248843 41.67606226384619 500.0 +250 100 1.7528520529491294 41.676066122025226 500.0 +260 100 1.7536107021883933 41.67606997479605 500.0 +270 100 1.7543693402449225 41.676073822158905 500.0 +280 100 1.7551279671209628 41.67607766411405 500.0 +290 100 1.7558865828187602 41.67608150066171 500.0 +0 110 1.7338873431872546 41.67540498481338 500.0 +10 110 1.7346462620572802 41.67540897202067 500.0 +20 110 1.735405169691996 41.67541295381395 500.0 +30 110 1.736164066093651 41.675416930193464 500.0 +40 110 1.736922951264494 41.67542090115946 500.0 +50 110 1.7376818252067727 41.675424866712206 500.0 +60 110 1.738440687922736 41.67542882685193 500.0 +70 110 1.7391995394146322 41.675432781578884 500.0 +80 110 1.7399583796847091 41.67543673089333 500.0 +90 110 1.740717208735215 41.6754406747955 500.0 +100 110 1.741476026568398 41.67544461328566 500.0 +110 110 1.7422348331865054 41.675448546364045 500.0 +120 110 1.7429936285917853 41.67545247403091 500.0 +130 110 1.7437524127864852 41.675456396286506 500.0 +140 110 1.7445111857728524 41.67546031313107 500.0 +150 110 1.7452699475531344 41.67546422456486 500.0 +160 110 1.7460286981295783 41.67546813058813 500.0 +170 110 1.7467874375044314 41.67547203120111 500.0 +180 110 1.747546165679941 41.67547592640406 500.0 +190 110 1.7483048826583532 41.67547981619723 500.0 +200 110 1.7490635884419152 41.67548370058087 500.0 +210 110 1.7498222830328738 41.67548757955522 500.0 +220 110 1.7505809664334757 41.67549145312053 500.0 +230 110 1.751339638645967 41.67549532127705 500.0 +240 110 1.7520982996725938 41.67549918402502 500.0 +250 110 1.752856949515603 41.6755030413647 500.0 +260 110 1.7536155881772402 41.67550689329634 500.0 +270 110 1.7543742156597515 41.67551073982017 500.0 +280 110 1.7551328319653832 41.675514580936444 500.0 +290 110 1.7558914370963805 41.675518416645424 500.0 +0 120 1.7338925036872446 41.674841924692565 500.0 +10 120 1.7346514118904546 41.67484591105661 500.0 +20 120 1.7354103088619734 41.674849892006804 500.0 +30 120 1.7361691946040487 41.67485386754341 500.0 +40 120 1.736928069118929 41.67485783766668 500.0 +50 120 1.7376869324088626 41.67486180237684 500.0 +60 120 1.7384457844760972 41.67486576167416 500.0 +70 120 1.7392046253228808 41.674869715558884 500.0 +80 120 1.739963454951461 41.67487366403125 500.0 +90 120 1.740722273364086 41.674877607091524 500.0 +100 120 1.7414810805630028 41.67488154473995 500.0 +110 120 1.742239876550459 41.67488547697676 500.0 +120 120 1.742998661328702 41.674889403802226 500.0 +130 120 1.743757434899979 41.67489332521658 500.0 +140 120 1.7445161972665368 41.67489724122008 500.0 +150 120 1.745274948430623 41.67490115181297 500.0 +160 120 1.7460336883944836 41.67490505699549 500.0 +170 120 1.7467924171603664 41.67490895676791 500.0 +180 120 1.747551134730517 41.67491285113046 500.0 +190 120 1.7483098411071827 41.6749167400834 500.0 +200 120 1.7490685362926095 41.67492062362696 500.0 +210 120 1.749827220289044 41.6749245017614 500.0 +220 120 1.750585893098732 41.674928374486974 500.0 +230 120 1.75134455472392 41.67493224180392 500.0 +240 120 1.7521032051668535 41.6749361037125 500.0 +250 120 1.7528618444297785 41.67493996021294 500.0 +260 120 1.7536204725149416 41.674943811305496 500.0 +270 120 1.754379089424587 41.67494765699042 500.0 +280 120 1.755137695160961 41.67495149726796 500.0 +290 120 1.755896289726309 41.67495533213836 500.0 +0 130 1.7338976625060807 41.67427886407805 500.0 +10 130 1.7346565600436352 41.67428284959897 500.0 +20 130 1.735415446353116 41.67428682970621 500.0 +30 130 1.736174321436771 41.67429080440002 500.0 +40 130 1.736933185296848 41.674294773680664 500.0 +50 130 1.7376920379355947 41.67429873754837 500.0 +60 130 1.7384508793552589 41.6743026960034 500.0 +70 130 1.7392097095580878 41.674306649046 500.0 +80 130 1.7399685285463293 41.67431059667642 500.0 +90 130 1.7407273363222302 41.674314538894905 500.0 +100 130 1.7414861328880382 41.6743184757017 500.0 +110 130 1.7422449182459996 41.674322407097065 500.0 +120 130 1.743003692398362 41.67432633308124 500.0 +130 130 1.743762455347372 41.67433025365448 500.0 +140 130 1.7445212070952765 41.674334168817026 500.0 +150 130 1.7452799476443217 41.67433807856913 500.0 +160 130 1.7460386769967549 41.67434198291104 500.0 +170 130 1.7467973951548212 41.674345881843 500.0 +180 130 1.7475561021207682 41.674349775365265 500.0 +190 130 1.7483147978968414 41.67435366347808 500.0 +200 130 1.7490734824852865 41.674357546181696 500.0 +210 130 1.7498321558883503 41.674361423476356 500.0 +220 130 1.7505908181082779 41.67436529536231 500.0 +230 130 1.7513494691473155 41.6743691618398 500.0 +240 130 1.7521081090077082 41.67437302290908 500.0 +250 130 1.7528667376917018 41.6743768785704 500.0 +260 130 1.7536253552015417 41.674380728824 500.0 +270 130 1.754383961539473 41.67438457367014 500.0 +280 130 1.7551425567077408 41.67438841310905 500.0 +290 130 1.7559011407085903 41.674392247140986 500.0 +0 140 1.7339028196438102 41.67371580297031 500.0 +10 140 1.734661706516869 41.67371978764822 500.0 +20 140 1.7354205821654713 41.673723766912616 500.0 +30 140 1.736179446591865 41.67372774076376 500.0 +40 140 1.7369382997982974 41.67373170920189 500.0 +50 140 1.737697141787016 41.67373567222726 500.0 +60 140 1.7384559725602675 41.673739629840114 500.0 +70 140 1.7392147921202998 41.67374358204071 500.0 +80 140 1.7399736004693598 41.67374752882929 500.0 +90 140 1.7407323976096944 41.673751470206106 500.0 +100 140 1.7414911835435498 41.6737554061714 500.0 +110 140 1.7422499582731734 41.673759336725425 500.0 +120 140 1.7430087218008115 41.67376326186844 500.0 +130 140 1.7437674741287108 41.673767181600674 500.0 +140 140 1.7445262152591172 41.67377109592238 500.0 +150 140 1.7452849451942771 41.673775004833814 500.0 +160 140 1.746043663936437 41.67377890833522 500.0 +170 140 1.7468023714878425 41.67378280642685 500.0 +180 140 1.7475610678507396 41.673786699108945 500.0 +190 140 1.7483197530273742 41.67379058638176 500.0 +200 140 1.7490784270199917 41.67379446824554 500.0 +210 140 1.749837089830838 41.67379834470052 500.0 +220 140 1.7505957414621582 41.673802215746974 500.0 +230 140 1.751354381916198 41.67380608138513 500.0 +240 140 1.7521130111952026 41.67380994161524 500.0 +250 140 1.7528716293014166 41.67381379643755 500.0 +260 140 1.7536302362370857 41.67381764585231 500.0 +270 140 1.754388832004454 41.673821489859776 500.0 +280 140 1.755147416605767 41.673825328460175 500.0 +290 140 1.755905990043269 41.67382916165377 500.0 +0 150 1.7339079751004798 41.673152741369805 500.0 +10 150 1.7346668513102024 41.67315672520482 500.0 +20 150 1.7354257162990858 41.67316070362649 500.0 +30 150 1.7361845700693772 41.673164676635075 500.0 +40 150 1.7369434126233239 41.67316864423081 500.0 +50 150 1.7377022439631724 41.673172606413964 500.0 +60 150 1.73846106409117 41.67317656318477 500.0 +70 150 1.7392198730095634 41.673180514543475 500.0 +80 150 1.7399786707205993 41.67318446049033 500.0 +90 150 1.7407374572265242 41.67318840102559 500.0 +100 150 1.7414962325295846 41.673192336149505 500.0 +110 150 1.7422549966320264 41.673196265862316 500.0 +120 150 1.7430137495360967 41.673200190164266 500.0 +130 150 1.7437724912440407 41.67320410905562 500.0 +140 150 1.7445312217581048 41.67320802253661 500.0 +150 150 1.7452899410805347 41.67321193060749 500.0 +160 150 1.7460486492135763 41.673215833268515 500.0 +170 150 1.746807346159475 41.673219730519925 500.0 +180 150 1.7475660319204769 41.67322362236197 500.0 +190 150 1.7483247064988268 41.673227508794895 500.0 +200 150 1.7490833698967703 41.67323138981895 500.0 +210 150 1.7498420221165525 41.673235265434386 500.0 +220 150 1.7506006631604183 41.673239135641445 500.0 +230 150 1.751359293030613 41.67324300044038 500.0 +240 150 1.7521179117293815 41.67324685983144 500.0 +250 150 1.7528765192589681 41.67325071381486 500.0 +260 150 1.753635115621618 41.673254562390895 500.0 +270 150 1.754393700819575 41.6732584055598 500.0 +280 150 1.755152274855084 41.67326224332181 500.0 +290 150 1.7559108377303891 41.673266075677176 500.0 +0 160 1.7339131288761371 41.672589679276996 500.0 +10 160 1.734671994423683 41.672593662269236 500.0 +20 160 1.7354308487540067 41.672597639848306 500.0 +30 160 1.7361896918693547 41.67260161201445 500.0 +40 160 1.7369485237719737 41.672605578767914 500.0 +50 160 1.737707344464111 41.67260954010896 500.0 +60 160 1.7384661539480124 41.67261349603782 500.0 +70 160 1.7392249522259247 41.67261744655476 500.0 +80 160 1.7399837393000939 41.672621391660016 500.0 +90 160 1.7407425151727662 41.672625331353835 500.0 +100 160 1.741501279846188 41.67262926563648 500.0 +110 160 1.742260033322605 41.67263319450819 500.0 +120 160 1.7430187756042628 41.6726371179692 500.0 +130 160 1.7437775066934076 41.67264103601978 500.0 +140 160 1.7445362265922846 41.67264494866018 500.0 +150 160 1.7452949353031397 41.67264885589062 500.0 +160 160 1.7460536328282181 41.672652757711376 500.0 +170 160 1.7468123191697649 41.67265665412268 500.0 +180 160 1.747570994330025 41.67266054512479 500.0 +190 160 1.7483296583112444 41.67266443071795 500.0 +200 160 1.7490883111156674 41.6726683109024 500.0 +210 160 1.7498469527455387 41.6726721856784 500.0 +220 160 1.750605583203103 41.67267605504619 500.0 +230 160 1.7513642024906053 41.67267991900602 500.0 +240 160 1.75212281061029 41.672683777558134 500.0 +250 160 1.7528814075644013 41.67268763070279 500.0 +260 160 1.7536399933551832 41.672691478440214 500.0 +270 160 1.7543985679848804 41.67269532077068 500.0 +280 160 1.7551571314557366 41.67269915769441 500.0 +290 160 1.7559156837699956 41.67270298921167 500.0 +0 170 1.7339182809708287 41.67202661669236 500.0 +10 170 1.7346771358573576 41.672030598841936 500.0 +20 170 1.7354359795302805 41.672034575578515 500.0 +30 170 1.736194811991844 41.672038546902336 500.0 +40 170 1.7369536332442947 41.67204251281365 500.0 +50 170 1.7377124432898785 41.6720464733127 500.0 +60 170 1.7384712421308417 41.67205042839974 500.0 +70 170 1.73923002976943 41.672054378075025 500.0 +80 170 1.7399888062078899 41.67205832233879 500.0 +90 170 1.7407475714484668 41.6720622611913 500.0 +100 170 1.7415063254934064 41.67206619463279 500.0 +110 170 1.7422650683449548 41.67207012266351 500.0 +120 170 1.7430238000053566 41.67207404528371 500.0 +130 170 1.7437825204768576 41.67207796249364 500.0 +140 170 1.7445412297617033 41.672081874293546 500.0 +150 170 1.7452999278621382 41.67208578068367 500.0 +160 170 1.7460586147804078 41.672089681664275 500.0 +170 170 1.746817290518757 41.6720935772356 500.0 +180 170 1.74757595507943 41.67209746739788 500.0 +190 170 1.7483346084646723 41.672101352151394 500.0 +200 170 1.749093250676728 41.67210523149636 500.0 +210 170 1.7498518817178417 41.67210910543304 500.0 +220 170 1.7506105015902576 41.672112973961674 500.0 +230 170 1.7513691102962199 41.67211683708251 500.0 +240 170 1.752127707837973 41.67212069479581 500.0 +250 170 1.7528862942177603 41.6721245471018 500.0 +260 170 1.7536448694378264 41.67212839400074 500.0 +270 170 1.7544034335004146 41.672132235492874 500.0 +280 170 1.7551619864077688 41.67213607157845 500.0 +290 170 1.7559205281621324 41.67213990225772 500.0 +0 180 1.7339234313846017 41.67146355361635 500.0 +10 180 1.7346822756112728 41.67146753492339 500.0 +20 180 1.7354411086279544 41.67147151081759 500.0 +30 180 1.7361999304368925 41.671475481299204 500.0 +40 180 1.7369587410403327 41.67147944636847 500.0 +50 180 1.7377175404405214 41.67148340602566 500.0 +60 180 1.7384763286397038 41.671487360270994 500.0 +70 180 1.7392351056401263 41.671491309104745 500.0 +80 180 1.7399938714440337 41.671495252527144 500.0 +90 180 1.740752626053672 41.67149919053845 500.0 +100 180 1.7415113694712865 41.6715031231389 500.0 +110 180 1.7422701016991218 41.67150705032875 500.0 +120 180 1.7430288227394235 41.67151097210825 500.0 +130 180 1.7437875325944368 41.671514888477645 500.0 +140 180 1.7445462312664057 41.67151879943718 500.0 +150 180 1.7453049187575758 41.67152270498711 500.0 +160 180 1.7460635950701913 41.671526605127674 500.0 +170 180 1.7468222602064971 41.67153049985913 500.0 +180 180 1.747580914168737 41.671534389181716 500.0 +190 180 1.748339556959156 41.671538273095685 500.0 +200 180 1.7490981885799979 41.67154215160128 500.0 +210 180 1.7498568090335067 41.671546024698756 500.0 +220 180 1.7506154183219267 41.67154989238835 500.0 +230 180 1.7513740164475016 41.67155375467032 500.0 +240 180 1.752132603412475 41.671557611544905 500.0 +250 180 1.7528911792190904 41.67156146301236 500.0 +260 180 1.7536497438695917 41.67156530907293 500.0 +270 180 1.7544082973662225 41.67156914972686 500.0 +280 180 1.7551668397112254 41.67157298497439 500.0 +290 180 1.7559253709068439 41.67157681481577 500.0 +0 190 1.7339285801175035 41.67090049004944 500.0 +10 190 1.7346874136854764 41.67090447051405 500.0 +20 190 1.7354462360470753 41.67090844556599 500.0 +30 190 1.7362050472045463 41.67091241520552 500.0 +40 190 1.7369638471601345 41.67091637943287 500.0 +50 190 1.7377226359160862 41.670920338248294 500.0 +60 190 1.738481413474646 41.67092429165205 500.0 +70 190 1.7392401798380595 41.670928239644375 500.0 +80 190 1.7399989350085718 41.67093218222552 500.0 +90 190 1.7407576789884283 41.67093611939574 500.0 +100 190 1.7415164117798736 41.67094005115527 500.0 +110 190 1.7422751333851525 41.67094397750437 500.0 +120 190 1.74303384380651 41.67094789844329 500.0 +130 190 1.7437925430461902 41.670951813972266 500.0 +140 190 1.7445512311064382 41.67095572409155 500.0 +150 190 1.745309907989498 41.67095962880139 500.0 +160 190 1.746068573697614 41.67096352810204 500.0 +170 190 1.7468272282330306 41.67096742199374 500.0 +180 190 1.7475858715979915 41.670971310476745 500.0 +190 190 1.7483445037947405 41.67097519355129 500.0 +200 190 1.7491031248255218 41.67097907121764 500.0 +210 190 1.7498617346925789 41.67098294347602 500.0 +220 190 1.7506203333981554 41.670986810326696 500.0 +230 190 1.751378920944495 41.670990671769914 500.0 +240 190 1.7521374973338408 41.67099452780591 500.0 +250 190 1.7528960625684362 41.67099837843494 500.0 +260 190 1.7536546166505245 41.67100222365725 500.0 +270 190 1.7544131595823482 41.67100606347308 500.0 +280 190 1.7551716913661508 41.67100989788269 500.0 +290 190 1.7559302120041747 41.671013726886315 500.0 +0 200 1.7339337271695807 41.67033742599209 500.0 +10 200 1.7346925500800146 41.670341405614394 500.0 +20 200 1.73545136178769 41.6703453798242 500.0 +30 200 1.7362101622948525 41.67034934862175 500.0 +40 200 1.7369689516037474 41.67035331200729 500.0 +50 200 1.7377277297166194 41.67035726998108 500.0 +60 200 1.7384864966357143 41.67036122254336 500.0 +70 200 1.7392452523632762 41.670365169694385 500.0 +80 200 1.7400039969015504 41.6703691114344 500.0 +90 200 1.7407627302527815 41.67037304776365 500.0 +100 200 1.741521452419214 41.67037697868238 500.0 +110 200 1.7422801634030927 41.67038090419084 500.0 +120 200 1.7430388632066613 41.670384824289286 500.0 +130 200 1.7437975518321644 41.67038873897796 500.0 +140 200 1.7445562292818464 41.67039264825711 500.0 +150 200 1.7453148955579507 41.67039655212699 500.0 +160 200 1.7460735506627216 41.670400450587834 500.0 +170 200 1.746832194598403 41.6704043436399 500.0 +180 200 1.7475908273672383 41.67040823128343 500.0 +190 200 1.7483494489714713 41.67041211351868 500.0 +200 200 1.749108059413345 41.67041599034589 500.0 +210 200 1.7498666586951035 41.6704198617653 500.0 +220 200 1.7506252468189891 41.67042372777718 500.0 +230 200 1.7513838237872454 41.67042758838175 500.0 +240 200 1.7521423896021158 41.670431443579275 500.0 +250 200 1.7529009442658425 41.67043529337 500.0 +260 200 1.7536594877806686 41.670439137754165 500.0 +270 200 1.7544180201488366 41.670442976732026 500.0 +280 200 1.7551765413725893 41.67044681030382 500.0 +290 200 1.755935051454169 41.6704506384698 500.0 +0 210 1.733938872540881 41.66977436144476 500.0 +10 210 1.7346976847949347 41.66977834022487 500.0 +20 210 1.7354564858498454 41.669782313592655 500.0 +30 210 1.736215275707858 41.66978628154835 500.0 +40 210 1.736974054371217 41.66979024409221 500.0 +50 210 1.7377328218421682 41.66979420122448 500.0 +60 210 1.738491578122955 41.669798152945404 500.0 +70 210 1.739250323215823 41.66980209925524 500.0 +80 210 1.7400090571230158 41.669806040154235 500.0 +90 210 1.7407677798467782 41.66980997564263 500.0 +100 210 1.7415264913893544 41.66981390572068 500.0 +110 210 1.7422851917529882 41.669817830388624 500.0 +120 210 1.7430438809399238 41.66982174964672 500.0 +130 210 1.743802558952405 41.66982566349521 500.0 +140 210 1.744561225792676 41.66982957193434 500.0 +150 210 1.7453198814629796 41.66983347496436 500.0 +160 210 1.7460785259655598 41.669837372585526 500.0 +170 210 1.74683715930266 41.66984126479807 500.0 +180 210 1.7475957814765235 41.66984515160225 500.0 +190 210 1.7483543924893934 41.669849032998314 500.0 +200 210 1.749112992343513 41.6698529089865 500.0 +210 210 1.7498715810411252 41.66985677956706 500.0 +220 210 1.7506301585844726 41.66986064474025 500.0 +230 210 1.751388724975798 41.6698645045063 500.0 +240 210 1.7521472802173441 41.669868358865465 500.0 +250 210 1.7529058243113538 41.669872207818 500.0 +260 210 1.753664357260069 41.66987605136414 500.0 +270 210 1.7544228790657321 41.66987988950414 500.0 +280 210 1.7551813897305855 41.66988372223824 500.0 +290 210 1.7559398892568712 41.669887549566695 500.0 +0 220 1.733944016231451 41.66921129640792 500.0 +10 220 1.7347028178302837 41.669215274345966 500.0 +20 220 1.735461608233588 41.66921924687184 500.0 +30 220 1.7362203874436093 41.669223213985795 500.0 +40 220 1.736979155462591 41.669227175688086 500.0 +50 220 1.7377379122927783 41.66923113197895 500.0 +60 220 1.738496657936415 41.66923508285864 500.0 +70 220 1.7392553923957457 41.66923902832741 500.0 +80 220 1.740014115673014 41.6692429683855 500.0 +90 220 1.7407728277704644 41.66924690303316 500.0 +100 220 1.7415315286903401 41.66925083227064 500.0 +110 220 1.7422902184348854 41.669254756098184 500.0 +120 220 1.7430488970063434 41.669258674516044 500.0 +130 220 1.743807564406958 41.669262587524464 500.0 +140 220 1.7445662206389725 41.66926649512369 500.0 +150 220 1.74532486570463 41.66927039731399 500.0 +160 220 1.7460834996061736 41.66927429409558 500.0 +170 220 1.7468421223458468 41.66927818546872 500.0 +180 220 1.747600733925892 41.66928207143366 500.0 +190 220 1.7483593343485526 41.66928595199065 500.0 +200 220 1.7491179236160705 41.66928982713994 500.0 +210 220 1.7498765017306892 41.669293696881766 500.0 +220 220 1.7506350686946504 41.669297561216375 500.0 +230 220 1.751393624510197 41.66930142014402 500.0 +240 220 1.7521521691795712 41.66930527366495 500.0 +250 220 1.752910702705015 41.66930912177941 500.0 +260 220 1.7536692250887704 41.669312964487645 500.0 +270 220 1.7544277363330796 41.669316801789904 500.0 +280 220 1.755186236440184 41.669320633686425 500.0 +290 220 1.7559447254123255 41.669324460177464 500.0 +0 230 1.7339491582413376 41.66864823088204 500.0 +10 230 1.7347079491861084 41.66865220797813 500.0 +20 230 1.7354667289389654 41.668656179662214 500.0 +30 230 1.7362254975021532 41.66866014593455 500.0 +40 230 1.7369842548779155 41.66866410679538 500.0 +50 230 1.7377430010684967 41.66866806224496 500.0 +60 230 1.7385017360761408 41.66867201228354 500.0 +70 230 1.7392604599030912 41.66867595691135 500.0 +80 230 1.7400191725515919 41.66867989612865 500.0 +90 230 1.7407778740238862 41.668683829935695 500.0 +100 230 1.7415365643222178 41.66868775833272 500.0 +110 230 1.74229524344883 41.668691681319984 500.0 +120 230 1.743053911405966 41.66869559889773 500.0 +130 230 1.743812568195869 41.668699511066194 500.0 +140 230 1.7445712138207818 41.66870341782564 500.0 +150 230 1.7453298482829478 41.66870731917631 500.0 +160 230 1.746088471584609 41.668711215118456 500.0 +170 230 1.746847083728009 41.66871510565231 500.0 +180 230 1.7476056847153896 41.66871899077814 500.0 +190 230 1.7483642745489933 41.668722870496175 500.0 +200 230 1.7491228532310632 41.66872674480667 500.0 +210 230 1.7498814207638407 41.668730613709876 500.0 +220 230 1.7506399771495682 41.66873447720603 500.0 +230 230 1.751398522390488 41.668738335295394 500.0 +240 230 1.7521570564888413 41.6687421879782 500.0 +250 230 1.7529155794468707 41.6687460352547 500.0 +260 230 1.7536740912668174 41.66874987712514 500.0 +270 230 1.754432591950923 41.668753713589766 500.0 +280 230 1.7551910815014289 41.668757544648834 500.0 +290 230 1.7559495599205766 41.668761370302576 500.0 +0 240 1.7339542985705882 41.668085164867584 500.0 +10 240 1.7347130788624556 41.66808914112183 500.0 +20 240 1.7354718479660238 41.66809311196425 500.0 +30 240 1.7362306058835364 41.668097077395075 500.0 +40 240 1.7369893526172373 41.66810103741457 500.0 +50 240 1.73774808816937 41.66810499202298 500.0 +60 240 1.7385068125421785 41.66810894122055 500.0 +70 240 1.7392655257379057 41.66811288500753 500.0 +80 240 1.7400242277587952 41.66811682338417 500.0 +90 240 1.74078291860709 41.6681207563507 500.0 +100 240 1.7415415982850333 41.6681246839074 500.0 +110 240 1.7423002667948682 41.66812860605449 500.0 +120 240 1.7430589241388375 41.668132522792234 500.0 +130 240 1.7438175703191838 41.66813643412087 500.0 +140 240 1.74457620533815 41.668140340040644 500.0 +150 240 1.7453348291979784 41.66814424055181 500.0 +160 240 1.7460934419009115 41.66814813565462 500.0 +170 240 1.7468520434491916 41.66815202534931 500.0 +180 240 1.747610633845061 41.668155909636134 500.0 +190 240 1.7483692130907618 41.66815978851533 500.0 +200 240 1.7491277811885357 41.66816366198716 500.0 +210 240 1.7498863381406247 41.66816753005186 500.0 +220 240 1.7506448839492708 41.66817139270968 500.0 +230 240 1.7514034186167153 41.66817524996087 500.0 +240 240 1.7521619421451997 41.66817910180566 500.0 +250 240 1.7529204545369657 41.66818294824432 500.0 +260 240 1.7536789557942545 41.66818678927709 500.0 +270 240 1.7544374459193073 41.668190624904206 500.0 +280 240 1.7551959249143647 41.66819445512593 500.0 +290 240 1.7559543927816685 41.668198279942494 500.0 +0 250 1.7339594372192497 41.66752209836501 500.0 +10 250 1.7347182068593725 41.66752607377754 500.0 +20 250 1.7354769653148103 41.66753004377839 500.0 +30 250 1.7362357125878058 41.66753400836784 500.0 +40 250 1.736994448680603 41.66753796754611 500.0 +50 250 1.7377531735954448 41.667541921313465 500.0 +60 250 1.7385118873345746 41.66754586967015 500.0 +70 250 1.7392705899002354 41.667549812616414 500.0 +80 250 1.7400292812946703 41.6675537501525 500.0 +90 250 1.7407879615201218 41.667557682278655 500.0 +100 250 1.7415466305788327 41.66756160899513 500.0 +110 250 1.7423052884730459 41.66756553030217 500.0 +120 250 1.7430639352050035 41.66756944620003 500.0 +130 250 1.7438225707769484 41.66757335668894 500.0 +140 250 1.7445811951911223 41.66757726176917 500.0 +150 250 1.7453398084497678 41.66758116144096 500.0 +160 250 1.7460984105551265 41.66758505570454 500.0 +170 250 1.7468570015094407 41.66758894456018 500.0 +180 250 1.747615581314952 41.66759282800812 500.0 +190 250 1.7483741499739025 41.6675967060486 500.0 +200 250 1.7491327074885337 41.66760057868187 500.0 +210 250 1.7498912538610865 41.66760444590818 500.0 +220 250 1.7506497890938029 41.66760830772778 500.0 +230 250 1.751408313188924 41.667612164140905 500.0 +240 250 1.7521668261486907 41.667616015147814 500.0 +250 250 1.7529253279753447 41.66761986074875 500.0 +260 250 1.7536838186711263 41.667623700943956 500.0 +270 250 1.7544422982382766 41.667627535733686 500.0 +280 250 1.7552007666790361 41.667631365118176 500.0 +290 250 1.7559592239956459 41.66763518909768 500.0 +0 260 1.733964574187369 41.66695903137479 500.0 +10 260 1.734723333176906 41.6669630059457 500.0 +20 260 1.7354820809853715 41.666966975105126 500.0 +30 260 1.7362408176150081 41.6669709388533 500.0 +40 260 1.7369995430680594 41.66697489719047 500.0 +50 260 1.7377582573467676 41.66697885011689 500.0 +60 260 1.7385169604533761 41.666982797632805 500.0 +70 260 1.7392756523901272 41.66698673973847 500.0 +80 260 1.7400343331592636 41.66699067643412 500.0 +90 260 1.740793002763028 41.66699460772 500.0 +100 260 1.7415516612036623 41.66699853359638 500.0 +110 260 1.7423103084834093 41.667002454063486 500.0 +120 260 1.7430689446045105 41.66700636912157 500.0 +130 260 1.7438275695692083 41.66701027877089 500.0 +140 260 1.7445861833797445 41.66701418301168 500.0 +150 260 1.745344786038361 41.6670180818442 500.0 +160 260 1.7461033775472994 41.66702197526868 500.0 +170 260 1.7468619579088012 41.66702586328539 500.0 +180 260 1.747620527125108 41.66702974589455 500.0 +190 260 1.748379085198461 41.66703362309643 500.0 +200 260 1.7491376321311016 41.66703749489127 500.0 +210 260 1.7498961679252707 41.66704136127931 500.0 +220 260 1.7506546925832096 41.667045222260796 500.0 +230 260 1.7514132061071588 41.66704907783599 500.0 +240 260 1.7521717084993595 41.66705292800513 500.0 +250 260 1.752930199762052 41.66705677276845 500.0 +260 260 1.7536886798974773 41.667060612126214 500.0 +270 260 1.7544471489078755 41.66706444607866 500.0 +280 260 1.755205606795487 41.66706827462604 500.0 +290 260 1.7559640535625523 41.667072097768596 500.0 +0 270 1.733969709474993 41.666395963897386 500.0 +10 270 1.734728457815103 41.666399937626814 500.0 +20 270 1.7354871949777544 41.66640390594491 500.0 +30 270 1.7362459209651901 41.66640786885193 500.0 +40 270 1.7370046357796527 41.66641182634812 500.0 +50 270 1.737763339423385 41.666415778433716 500.0 +60 270 1.7385220318986288 41.66641972510898 500.0 +70 270 1.739280713207627 41.66642366637415 500.0 +80 270 1.7400393833526213 41.66642760222948 500.0 +90 270 1.7407980423358544 41.66643153267522 500.0 +100 270 1.7415566901595678 41.666435457711614 500.0 +110 270 1.7423153268260037 41.666439377338904 500.0 +120 270 1.743073952337404 41.666443291557336 500.0 +130 270 1.7438325666960095 41.66644720036717 500.0 +140 270 1.7445911699040626 41.666451103768644 500.0 +150 270 1.745349761963804 41.66645500176201 500.0 +160 270 1.7461083428774757 41.666458894347514 500.0 +170 270 1.7468669126473189 41.6664627815254 500.0 +180 270 1.747625471275574 41.66646666329591 500.0 +190 270 1.7483840187644828 41.6664705396593 500.0 +200 270 1.7491425551162854 41.66647441061581 500.0 +210 270 1.749901080333223 41.6664782761657 500.0 +220 270 1.7506595944175358 41.666482136309206 500.0 +230 270 1.751418097371465 41.66648599104657 500.0 +240 270 1.7521765891972507 41.66648984037805 500.0 +250 270 1.752935069897133 41.66649368430388 500.0 +260 270 1.7536935394733524 41.66649752282432 500.0 +270 270 1.754451997928149 41.66650135593961 500.0 +280 270 1.7552104452637625 41.66650518364999 500.0 +290 270 1.7559688814824328 41.66650900595572 500.0 +0 280 1.733974843082169 41.66583289593326 500.0 +10 280 1.7347335807740103 41.665836868821316 500.0 +20 280 1.7354923072920059 41.66584083629821 500.0 +30 280 1.7362510226383983 41.66584479836419 500.0 +40 280 1.7370097268154299 41.66584875501951 500.0 +50 280 1.737768419825343 41.66585270626441 500.0 +60 280 1.7385271016703792 41.66585665209914 500.0 +70 280 1.7392857723527808 41.66586059252394 500.0 +80 280 1.7400444318747899 41.66586452753907 500.0 +90 280 1.7408030802386474 41.665868457144775 500.0 +100 280 1.7415617174465958 41.665872381341295 500.0 +110 280 1.742320343500876 41.665876300128886 500.0 +120 280 1.7430789584037296 41.66588021350779 500.0 +130 280 1.7438375621573976 41.66588412147825 500.0 +140 280 1.7445961547641218 41.66588802404053 500.0 +150 280 1.7453547362261428 41.665891921194856 500.0 +160 280 1.7461133065457015 41.665895812941486 500.0 +170 280 1.7468718657250388 41.66589969928067 500.0 +180 280 1.7476304137663956 41.66590358021265 500.0 +190 280 1.7483889506720123 41.66590745573767 500.0 +200 280 1.7491474764441295 41.66591132585598 500.0 +210 280 1.7499059910849875 41.66591519056783 500.0 +220 280 1.7506644945968266 41.66591904987346 500.0 +230 280 1.7514229869818871 41.665922903773115 500.0 +240 280 1.7521814682424088 41.665926752267055 500.0 +250 280 1.752939938380632 41.66593059535551 500.0 +260 280 1.753698397398796 41.66593443303874 500.0 +270 280 1.754456845299141 41.66593826531698 500.0 +280 280 1.7552152820839062 41.66594209219049 500.0 +290 280 1.7559737077553315 41.6659459136595 500.0 +0 290 1.733979975008944 41.665269827482874 500.0 +10 290 1.7347387020536746 41.66527379952968 500.0 +20 290 1.7354974179281726 41.66527776616549 500.0 +30 290 1.7362561226346795 41.66528172739055 500.0 +40 290 1.7370148161754377 41.66528568320511 500.0 +50 290 1.7377734985526887 41.665289633609426 500.0 +60 290 1.7385321697686742 41.66529357860374 500.0 +70 290 1.7392908298256358 41.66529751818829 500.0 +80 290 1.7400494787258152 41.66530145236334 500.0 +90 290 1.7408081164714533 41.66530538112912 500.0 +100 290 1.7415667430647916 41.665309304485895 500.0 +110 290 1.7423253585080714 41.6653132224339 500.0 +120 290 1.7430839628035335 41.665317134973385 500.0 +130 290 1.7438425559534187 41.6653210421046 500.0 +140 290 1.7446011379599682 41.66532494382779 500.0 +150 290 1.745359708825422 41.6653288401432 500.0 +160 290 1.7461182685520216 41.66533273105108 500.0 +170 290 1.7468768171420066 41.66533661655168 500.0 +180 290 1.747635354597618 41.665340496645236 500.0 +190 290 1.7483938809210955 41.665344371332004 500.0 +200 290 1.7491523961146795 41.665348240612225 500.0 +210 290 1.7499109001806101 41.66535210448615 500.0 +220 290 1.750669393121127 41.665355962954024 500.0 +230 290 1.7514278749384702 41.66535981601609 500.0 +240 290 1.752186345634879 41.66536366367261 500.0 +250 290 1.7529448052125933 41.665367505923804 500.0 +260 290 1.7537032536738526 41.665371342769944 500.0 +270 290 1.754461691020896 41.665375174211256 500.0 +280 290 1.755220117255963 41.665379000247995 500.0 +290 290 1.7559785323812924 41.66538282088041 500.0 diff --git a/Data/Input/wv2/wv2-1.gcp2 b/Data/Input/wv2/wv2-1.gcp2 new file mode 100644 index 0000000000..5001268e7c --- /dev/null +++ b/Data/Input/wv2/wv2-1.gcp2 @@ -0,0 +1,901 @@ +#From file /work/scratch/osmanj/otb_valid/wv2-1.geom +0 0 12.478020308441684 41.9002203915641 94.0 +10 0 12.478080529474209 41.900221714945744 94.0 +20 0 12.47814075051079 41.900223038295856 94.0 +30 0 12.478200971551427 41.90022436161443 94.0 +40 0 12.47826119259612 41.900225684901464 94.0 +50 0 12.478321413644872 41.90022700815696 94.0 +60 0 12.478381634697682 41.900228331380916 94.0 +70 0 12.478441855754548 41.900229654573344 94.0 +80 0 12.478502076815472 41.900230977734225 94.0 +90 0 12.478562297880455 41.90023230086358 94.0 +100 0 12.478622518949493 41.900233623961384 94.0 +110 0 12.47868274002259 41.900234947027656 94.0 +120 0 12.478742961099744 41.90023627006239 94.0 +130 0 12.478803182180958 41.90023759306559 94.0 +140 0 12.478863403266228 41.900238916037246 94.0 +150 0 12.478923624355557 41.90024023897737 94.0 +160 0 12.478983845448946 41.90024156188595 94.0 +170 0 12.479044066546392 41.900242884762996 94.0 +180 0 12.479104287647896 41.9002442076085 94.0 +190 0 12.479164508753458 41.900245530422474 94.0 +200 0 12.479224729863079 41.900246853204905 94.0 +210 0 12.479284950976758 41.900248175955795 94.0 +220 0 12.479345172094497 41.90024949867515 94.0 +230 0 12.479405393216295 41.90025082136297 94.0 +240 0 12.47946561434215 41.90025214401925 94.0 +250 0 12.479525835472066 41.90025346664399 94.0 +260 0 12.479586056606038 41.90025478923719 94.0 +270 0 12.479646277744072 41.90025611179885 94.0 +280 0 12.479706498886163 41.90025743432898 94.0 +290 0 12.479766720032313 41.90025875682757 94.0 +0 10 12.478022079848719 41.90017540115891 94.0 +10 10 12.478082300839052 41.90017672453848 94.0 +20 10 12.478142521833442 41.90017804788652 94.0 +30 10 12.47820274283189 41.900179371203016 94.0 +40 10 12.478262963834394 41.90018069448797 94.0 +50 10 12.478323184840956 41.9001820177414 94.0 +60 10 12.478383405851574 41.90018334096328 94.0 +70 10 12.47844362686625 41.90018466415363 94.0 +80 10 12.478503847884983 41.90018598731244 94.0 +90 10 12.478564068907774 41.90018731043971 94.0 +100 10 12.478624289934624 41.90018863353544 94.0 +110 10 12.47868451096553 41.90018995659964 94.0 +120 10 12.478744732000495 41.9001912796323 94.0 +130 10 12.478804953039516 41.900192602633425 94.0 +140 10 12.478865174082598 41.900193925603006 94.0 +150 10 12.478925395129735 41.90019524854105 94.0 +160 10 12.478985616180934 41.90019657144756 94.0 +170 10 12.479045837236189 41.90019789432253 94.0 +180 10 12.479106058295502 41.90019921716596 94.0 +190 10 12.479166279358873 41.90020053997786 94.0 +200 10 12.479226500426305 41.900201862758216 94.0 +210 10 12.479286721497793 41.90020318550703 94.0 +220 10 12.479346942573342 41.90020450822431 94.0 +230 10 12.479407163652949 41.90020583091005 94.0 +240 10 12.479467384736614 41.90020715356426 94.0 +250 10 12.479527605824337 41.900208476186926 94.0 +260 10 12.479587826916122 41.90020979877805 94.0 +270 10 12.479648048011963 41.90021112133764 94.0 +280 10 12.479708269111864 41.90021244386569 94.0 +290 10 12.479768490215825 41.90021376636221 94.0 +0 20 12.47802385125172 41.90013041075331 94.0 +10 20 12.478084072199863 41.90013173413081 94.0 +20 20 12.478144293152063 41.90013305747677 94.0 +30 20 12.478204514108318 41.900134380791194 94.0 +40 20 12.478264735068633 41.900135704074074 94.0 +50 20 12.478324956033005 41.90013702732542 94.0 +60 20 12.478385177001432 41.900138350545234 94.0 +70 20 12.478445397973918 41.900139673733506 94.0 +80 20 12.47850561895046 41.90014099689024 94.0 +90 20 12.478565839931061 41.90014232001543 94.0 +100 20 12.478626060915719 41.9001436431091 94.0 +110 20 12.478686281904436 41.90014496617121 94.0 +120 20 12.47874650289721 41.9001462892018 94.0 +130 20 12.478806723894042 41.90014761220085 94.0 +140 20 12.478866944894932 41.90014893516835 94.0 +150 20 12.478927165899881 41.900150258104325 94.0 +160 20 12.478987386908887 41.90015158100876 94.0 +170 20 12.479047607921952 41.900152903881654 94.0 +180 20 12.479107828939075 41.90015422672301 94.0 +190 20 12.479168049960256 41.900155549532826 94.0 +200 20 12.479228270985496 41.90015687231111 94.0 +210 20 12.479288492014796 41.900158195057855 94.0 +220 20 12.479348713048154 41.90015951777306 94.0 +230 20 12.47940893408557 41.90016084045673 94.0 +240 20 12.479469155127045 41.90016216310885 94.0 +250 20 12.479529376172579 41.90016348572944 94.0 +260 20 12.479589597222171 41.9001648083185 94.0 +270 20 12.479649818275822 41.900166130876016 94.0 +280 20 12.479710039333533 41.90016745340199 94.0 +290 20 12.479770260395304 41.900168775896425 94.0 +0 30 12.478025622650684 41.9000854203473 94.0 +10 30 12.478085843556636 41.900086743722724 94.0 +20 30 12.478146064466646 41.900088067066605 94.0 +30 30 12.478206285380713 41.90008939037895 94.0 +40 30 12.478266506298837 41.900090713659765 94.0 +50 30 12.478326727221017 41.90009203690903 94.0 +60 30 12.478386948147255 41.90009336012677 94.0 +70 30 12.47844716907755 41.900094683312965 94.0 +80 30 12.478507390011902 41.90009600646762 94.0 +90 30 12.478567610950313 41.90009732959074 94.0 +100 30 12.478627831892782 41.900098652682324 94.0 +110 30 12.478688052839308 41.90009997574237 94.0 +120 30 12.478748273789892 41.900101298770885 94.0 +130 30 12.478808494744532 41.90010262176785 94.0 +140 30 12.478868715703232 41.90010394473329 94.0 +150 30 12.47892893666599 41.90010526766718 94.0 +160 30 12.478989157632807 41.90010659056954 94.0 +170 30 12.479049378603682 41.90010791344036 94.0 +180 30 12.479109599578614 41.90010923627964 94.0 +190 30 12.479169820557606 41.90011055908739 94.0 +200 30 12.479230041540657 41.900111881863594 94.0 +210 30 12.479290262527764 41.90011320460826 94.0 +220 30 12.479350483518932 41.90011452732139 94.0 +230 30 12.479410704514157 41.90011585000298 94.0 +240 30 12.479470925513443 41.90011717265304 94.0 +250 30 12.479531146516786 41.900118495271556 94.0 +260 30 12.479591367524188 41.90011981785853 94.0 +270 30 12.47965158853565 41.90012114041397 94.0 +280 30 12.47971180955117 41.90012246293787 94.0 +290 30 12.47977203057075 41.90012378543024 94.0 +0 40 12.478027394045613 41.90004042994088 94.0 +10 40 12.478087614909375 41.90004175331423 94.0 +20 40 12.478147835777195 41.90004307665603 94.0 +30 40 12.478208056649072 41.900044399966305 94.0 +40 40 12.478268277525006 41.900045723245036 94.0 +50 40 12.478328498404995 41.90004704649223 94.0 +60 40 12.478388719289043 41.90004836970789 94.0 +70 40 12.478448940177149 41.90004969289201 94.0 +80 40 12.478509161069312 41.90005101604459 94.0 +90 40 12.478569381965531 41.90005233916564 94.0 +100 40 12.478629602865809 41.90005366225515 94.0 +110 40 12.478689823770145 41.90005498531312 94.0 +120 40 12.478750044678538 41.90005630833955 94.0 +130 40 12.47881026559099 41.90005763133445 94.0 +140 40 12.4788704865075 41.900058954297805 94.0 +150 40 12.478930707428066 41.90006027722963 94.0 +160 40 12.478990928352694 41.90006160012991 94.0 +170 40 12.479051149281377 41.90006292299865 94.0 +180 40 12.47911137021412 41.90006424583586 94.0 +190 40 12.479171591150921 41.90006556864153 94.0 +200 40 12.479231812091781 41.90006689141566 94.0 +210 40 12.4792920330367 41.90006821415825 94.0 +220 40 12.479352253985677 41.90006953686931 94.0 +230 40 12.479412474938712 41.900070859548826 94.0 +240 40 12.479472695895806 41.90007218219681 94.0 +250 40 12.47953291685696 41.90007350481325 94.0 +260 40 12.479593137822173 41.90007482739815 94.0 +270 40 12.479653358791444 41.900076149951516 94.0 +280 40 12.479713579764773 41.90007747247335 94.0 +290 40 12.479773800742164 41.90007879496363 94.0 +0 50 12.478029165436508 41.899995439534045 94.0 +10 50 12.47808938625808 41.89999676290531 94.0 +20 50 12.47814960708371 41.89999808624504 94.0 +30 50 12.478209827913396 41.89999940955324 94.0 +40 50 12.478270048747138 41.900000732829895 94.0 +50 50 12.478330269584939 41.90000205607501 94.0 +60 50 12.478390490426797 41.9000033792886 94.0 +70 50 12.478450711272712 41.90000470247064 94.0 +80 50 12.478510932122685 41.90000602562115 94.0 +90 50 12.478571152976714 41.90000734874012 94.0 +100 50 12.478631373834801 41.90000867182755 94.0 +110 50 12.478691594696947 41.90000999488345 94.0 +120 50 12.47875181556315 41.900011317907804 94.0 +130 50 12.478812036433412 41.90001264090063 94.0 +140 50 12.478872257307732 41.90001396386191 94.0 +150 50 12.47893247818611 41.90001528679166 94.0 +160 50 12.478992699068545 41.900016609689864 94.0 +170 50 12.47905291995504 41.90001793255653 94.0 +180 50 12.479113140845593 41.90001925539166 94.0 +190 50 12.479173361740203 41.90002057819526 94.0 +200 50 12.479233582638873 41.90002190096732 94.0 +210 50 12.479293803541601 41.900023223707834 94.0 +220 50 12.479354024448389 41.900024546416816 94.0 +230 50 12.479414245359234 41.90002586909426 94.0 +240 50 12.479474466274139 41.900027191740165 94.0 +250 50 12.479534687193102 41.90002851435453 94.0 +260 50 12.479594908116125 41.90002983693736 94.0 +270 50 12.479655129043206 41.90003115948865 94.0 +280 50 12.479715349974345 41.900032482008406 94.0 +290 50 12.479775570909544 41.900033804496616 94.0 +0 60 12.478030936823366 41.89995044912679 94.0 +10 60 12.47809115760275 41.89995177249598 94.0 +20 60 12.478151378386189 41.89995309583364 94.0 +30 60 12.478211599173685 41.89995441913976 94.0 +40 60 12.478271819965238 41.89995574241434 94.0 +50 60 12.478332040760849 41.89995706565738 94.0 +60 60 12.478392261560515 41.89995838886889 94.0 +70 60 12.47845248236424 41.89995971204886 94.0 +80 60 12.478512703172024 41.89996103519729 94.0 +90 60 12.478572923983863 41.899962358314184 94.0 +100 60 12.478633144799762 41.89996368139955 94.0 +110 60 12.478693365619717 41.899965004453364 94.0 +120 60 12.47875358644373 41.899966327475646 94.0 +130 60 12.478813807271802 41.899967650466394 94.0 +140 60 12.478874028103931 41.8999689734256 94.0 +150 60 12.478934248940119 41.899970296353274 94.0 +160 60 12.478994469780364 41.899971619249406 94.0 +170 60 12.479054690624668 41.899972942114 94.0 +180 60 12.479114911473031 41.899974264947055 94.0 +190 60 12.479175132325453 41.89997558774858 94.0 +200 60 12.479235353181933 41.89997691051856 94.0 +210 60 12.479295574042471 41.899978233257 94.0 +220 60 12.479355794907068 41.89997955596391 94.0 +230 60 12.479416015775723 41.899980878639276 94.0 +240 60 12.479476236648438 41.89998220128311 94.0 +250 60 12.479536457525212 41.8999835238954 94.0 +260 60 12.479596678406043 41.89998484647615 94.0 +270 60 12.479656899290934 41.89998616902537 94.0 +280 60 12.479717120179885 41.899987491543044 94.0 +290 60 12.479777341072893 41.899988814029186 94.0 +0 70 12.47803270820619 41.899905458719125 94.0 +10 70 12.478092928943383 41.89990678208624 94.0 +20 70 12.478153149684632 41.89990810542182 94.0 +30 70 12.478213370429938 41.89990942872586 94.0 +40 70 12.478273591179303 41.89991075199837 94.0 +50 70 12.478333811932723 41.89991207523934 94.0 +60 70 12.4783940326902 41.899913398448774 94.0 +70 70 12.478454253451735 41.899914721626665 94.0 +80 70 12.478514474217327 41.89991604477302 94.0 +90 70 12.478574694986978 41.899917367887845 94.0 +100 70 12.478634915760686 41.89991869097113 94.0 +110 70 12.478695136538452 41.89992001402287 94.0 +120 70 12.478755357320274 41.899921337043075 94.0 +130 70 12.478815578106156 41.89992266003175 94.0 +140 70 12.478875798896096 41.89992398298888 94.0 +150 70 12.478936019690094 41.89992530591447 94.0 +160 70 12.47899624048815 41.89992662880853 94.0 +170 70 12.479056461290265 41.89992795167105 94.0 +180 70 12.479116682096437 41.899929274502036 94.0 +190 70 12.479176902906667 41.89993059730148 94.0 +200 70 12.479237123720958 41.899931920069385 94.0 +210 70 12.479297344539306 41.89993324280575 94.0 +220 70 12.479357565361713 41.899934565510584 94.0 +230 70 12.47941778618818 41.899935888183876 94.0 +240 70 12.479478007018704 41.899937210825634 94.0 +250 70 12.479538227853286 41.89993853343585 94.0 +260 70 12.47959844869193 41.899939856014534 94.0 +270 70 12.479658669534631 41.899941178561676 94.0 +280 70 12.47971889038139 41.89994250107728 94.0 +290 70 12.47977911123221 41.899943823561344 94.0 +0 80 12.478034479584979 41.89986046831105 94.0 +10 80 12.478094700279982 41.89986179167609 94.0 +20 80 12.47815492097904 41.899863115009595 94.0 +30 80 12.478215141682158 41.89986443831156 94.0 +40 80 12.478275362389331 41.89986576158199 94.0 +50 80 12.478335583100561 41.89986708482088 94.0 +60 80 12.47839580381585 41.89986840802824 94.0 +70 80 12.478456024535195 41.899869731204056 94.0 +80 80 12.478516245258598 41.89987105434834 94.0 +90 80 12.478576465986057 41.89987237746108 94.0 +100 80 12.478636686717577 41.89987370054229 94.0 +110 80 12.478696907453152 41.89987502359196 94.0 +120 80 12.478757128192786 41.89987634661009 94.0 +130 80 12.478817348936477 41.899877669596684 94.0 +140 80 12.478877569684228 41.89987899255174 94.0 +150 80 12.478937790436035 41.899880315475265 94.0 +160 80 12.478998011191901 41.89988163836725 94.0 +170 80 12.479058231951825 41.89988296122769 94.0 +180 80 12.47911845271581 41.8998842840566 94.0 +190 80 12.479178673483851 41.89988560685397 94.0 +200 80 12.47923889425595 41.8998869296198 94.0 +210 80 12.47929911503211 41.899888252354096 94.0 +220 80 12.479359335812326 41.899889575056854 94.0 +230 80 12.479419556596602 41.89989089772807 94.0 +240 80 12.479479777384936 41.89989222036775 94.0 +250 80 12.47953999817733 41.899893542975896 94.0 +260 80 12.479600218973783 41.8998948655525 94.0 +270 80 12.479660439774294 41.899896188097564 94.0 +280 80 12.479720660578865 41.89989751061109 94.0 +290 80 12.479780881387493 41.89989883309308 94.0 +0 90 12.478036250959732 41.89981547790255 94.0 +10 90 12.478096471612545 41.899816801265516 94.0 +20 90 12.478156692269415 41.89981812459695 94.0 +30 90 12.47821691293034 41.89981944789684 94.0 +40 90 12.478277133595325 41.899820771165196 94.0 +50 90 12.478337354264367 41.89982209440201 94.0 +60 90 12.478397574937464 41.899823417607294 94.0 +70 90 12.47845779561462 41.899824740781035 94.0 +80 90 12.478518016295833 41.89982606392324 94.0 +90 90 12.478578236981104 41.89982738703391 94.0 +100 90 12.478638457670431 41.89982871011304 94.0 +110 90 12.478698678363818 41.89983003316063 94.0 +120 90 12.478758899061262 41.89983135617669 94.0 +130 90 12.478819119762765 41.899832679161214 94.0 +140 90 12.478879340468325 41.8998340021142 94.0 +150 90 12.478939561177942 41.89983532503564 94.0 +160 90 12.47899978189162 41.89983664792555 94.0 +170 90 12.479060002609353 41.89983797078391 94.0 +180 90 12.479120223331147 41.899839293610746 94.0 +190 90 12.479180444056999 41.899840616406046 94.0 +200 90 12.479240664786909 41.8998419391698 94.0 +210 90 12.479300885520878 41.89984326190202 94.0 +220 90 12.479361106258905 41.899844584602704 94.0 +230 90 12.479421327000992 41.899845907271846 94.0 +240 90 12.479481547747136 41.899847229909454 94.0 +250 90 12.47954176849734 41.89984855251552 94.0 +260 90 12.479601989251604 41.89984987509005 94.0 +270 90 12.479662210009925 41.89985119763304 94.0 +280 90 12.479722430772306 41.8998525201445 94.0 +290 90 12.479782651538745 41.89985384262441 94.0 +0 100 12.47803802233045 41.89977048749365 94.0 +10 100 12.478098242941073 41.89977181085454 94.0 +20 100 12.478158463555753 41.89977313418389 94.0 +30 100 12.478218684174491 41.899774457481705 94.0 +40 100 12.478278904797286 41.89977578074799 94.0 +50 100 12.478339125424137 41.89977710398273 94.0 +60 100 12.478399346055046 41.89977842718593 94.0 +70 100 12.478459566690011 41.899779750357595 94.0 +80 100 12.478519787329034 41.89978107349773 94.0 +90 100 12.478580007972115 41.89978239660632 94.0 +100 100 12.478640228619254 41.89978371968338 94.0 +110 100 12.47870044927045 41.8997850427289 94.0 +120 100 12.478760669925705 41.89978636574288 94.0 +130 100 12.478820890585018 41.899787688725326 94.0 +140 100 12.478881111248388 41.89978901167623 94.0 +150 100 12.478941331915816 41.8997903345956 94.0 +160 100 12.479001552587304 41.89979165748343 94.0 +170 100 12.479061773262849 41.899792980339726 94.0 +180 100 12.479121993942453 41.899794303164484 94.0 +190 100 12.479182214626114 41.89979562595771 94.0 +200 100 12.479242435313834 41.899796948719384 94.0 +210 100 12.479302656005615 41.899798271449534 94.0 +220 100 12.479362876701451 41.899799594148135 94.0 +230 100 12.479423097401348 41.89980091681521 94.0 +240 100 12.479483318105304 41.899802239450736 94.0 +250 100 12.479543538813319 41.89980356205473 94.0 +260 100 12.479603759525391 41.89980488462719 94.0 +270 100 12.479663980241524 41.899806207168105 94.0 +280 100 12.479724200961714 41.89980752967749 94.0 +290 100 12.479784421685965 41.899808852155324 94.0 +0 110 12.478039793697132 41.899725497084326 94.0 +10 110 12.478100014265566 41.89972682044314 94.0 +20 110 12.478160234838057 41.89972814377042 94.0 +30 110 12.478220455414604 41.89972946706616 94.0 +40 110 12.47828067599521 41.89973079033036 94.0 +50 110 12.478340896579871 41.899732113563026 94.0 +60 110 12.478401117168591 41.89973343676416 94.0 +70 110 12.478461337761367 41.89973475993375 94.0 +80 110 12.478521558358201 41.8997360830718 94.0 +90 110 12.478581778959093 41.899737406178325 94.0 +100 110 12.478641999564042 41.8997387292533 94.0 +110 110 12.478702220173048 41.89974005229675 94.0 +120 110 12.478762440786113 41.89974137530865 94.0 +130 110 12.478822661403235 41.899742698289025 94.0 +140 110 12.478882882024417 41.89974402123785 94.0 +150 110 12.478943102649657 41.89974534415515 94.0 +160 110 12.479003323278954 41.89974666704091 94.0 +170 110 12.479063543912309 41.899747989895125 94.0 +180 110 12.479123764549724 41.89974931271781 94.0 +190 110 12.479183985191195 41.89975063550895 94.0 +200 110 12.479244205836727 41.89975195826856 94.0 +210 110 12.479304426486317 41.89975328099663 94.0 +220 110 12.479364647139965 41.89975460369316 94.0 +230 110 12.479424867797672 41.899755926358154 94.0 +240 110 12.479485088459437 41.89975724899161 94.0 +250 110 12.479545309125262 41.89975857159353 94.0 +260 110 12.479605529795146 41.899759894163914 94.0 +270 110 12.479665750469088 41.89976121670276 94.0 +280 110 12.47972597114709 41.89976253921006 94.0 +290 110 12.47978619182915 41.89976386168583 94.0 +0 120 12.47804156505978 41.89968050667459 94.0 +10 120 12.478101785586025 41.899681830031334 94.0 +20 120 12.478162006116326 41.899683153356534 94.0 +30 120 12.478222226650685 41.899684476650194 94.0 +40 120 12.478282447189098 41.899685799912326 94.0 +50 120 12.478342667731571 41.89968712314292 94.0 +60 120 12.4784028882781 41.89968844634197 94.0 +70 120 12.478463108828688 41.899689769509486 94.0 +80 120 12.478523329383332 41.89969109264546 94.0 +90 120 12.478583549942035 41.89969241574991 94.0 +100 120 12.478643770504794 41.89969373882281 94.0 +110 120 12.478703991071612 41.89969506186418 94.0 +120 120 12.478764211642488 41.89969638487401 94.0 +130 120 12.47882443221742 41.899697707852305 94.0 +140 120 12.478884652796413 41.89969903079906 94.0 +150 120 12.478944873379463 41.89970035371428 94.0 +160 120 12.47900509396657 41.899701676597964 94.0 +170 120 12.479065314557737 41.899702999450106 94.0 +180 120 12.479125535152962 41.899704322270715 94.0 +190 120 12.479185755752244 41.89970564505979 94.0 +200 120 12.479245976355585 41.899706967817316 94.0 +210 120 12.479306196962986 41.899708290543316 94.0 +220 120 12.479366417574445 41.89970961323777 94.0 +230 120 12.479426638189963 41.89971093590069 94.0 +240 120 12.479486858809539 41.89971225853207 94.0 +250 120 12.479547079433175 41.89971358113192 94.0 +260 120 12.479607300060868 41.89971490370022 94.0 +270 120 12.479667520692622 41.89971622623699 94.0 +280 120 12.479727741328434 41.899717548742224 94.0 +290 120 12.479787961968304 41.89971887121592 94.0 +0 130 12.478043336418391 41.899635516264446 94.0 +10 130 12.478103556902447 41.899636839619106 94.0 +20 130 12.47816377739056 41.89963816294223 94.0 +30 130 12.478223997882727 41.89963948623382 94.0 +40 130 12.478284218378954 41.899640809493874 94.0 +50 130 12.478344438879237 41.89964213272239 94.0 +60 130 12.478404659383578 41.89964345591937 94.0 +70 130 12.478464879891975 41.89964477908481 94.0 +80 130 12.47852510040443 41.89964610221871 94.0 +90 130 12.478585320920944 41.89964742532108 94.0 +100 130 12.478645541441514 41.89964874839191 94.0 +110 130 12.478705761966141 41.8996500714312 94.0 +120 130 12.478765982494828 41.89965139443896 94.0 +130 130 12.478826203027571 41.89965271741518 94.0 +140 130 12.478886423564374 41.899654040359856 94.0 +150 130 12.478946644105235 41.899655363273006 94.0 +160 130 12.479006864650154 41.89965668615461 94.0 +170 130 12.47906708519913 41.89965800900468 94.0 +180 130 12.479127305752165 41.89965933182321 94.0 +190 130 12.479187526309259 41.89966065461021 94.0 +200 130 12.479247746870412 41.89966197736567 94.0 +210 130 12.479307967435624 41.899663300089586 94.0 +220 130 12.479368188004893 41.89966462278197 94.0 +230 130 12.47942840857822 41.89966594544281 94.0 +240 130 12.479488629155608 41.89966726807212 94.0 +250 130 12.479548849737053 41.89966859066989 94.0 +260 130 12.479609070322558 41.89966991323612 94.0 +270 130 12.479669290912122 41.89967123577081 94.0 +280 130 12.479729511505745 41.89967255827397 94.0 +290 130 12.479789732103427 41.89967388074559 94.0 +0 140 12.478045107772969 41.89959052585388 94.0 +10 140 12.478105328214834 41.89959184920647 94.0 +20 140 12.478165548660758 41.89959317252752 94.0 +30 140 12.478225769110738 41.899594495817034 94.0 +40 140 12.478285989564775 41.89959581907501 94.0 +50 140 12.478346210022869 41.89959714230145 94.0 +60 140 12.47840643048502 41.899598465496354 94.0 +70 140 12.478466650951228 41.89959978865972 94.0 +80 140 12.478526871421494 41.89960111179155 94.0 +90 140 12.478587091895816 41.89960243489184 94.0 +100 140 12.478647312374198 41.89960375796059 94.0 +110 140 12.478707532856637 41.89960508099781 94.0 +120 140 12.478767753343135 41.89960640400349 94.0 +130 140 12.47882797383369 41.899607726977635 94.0 +140 140 12.478888194328302 41.899609049920244 94.0 +150 140 12.478948414826974 41.89961037283131 94.0 +160 140 12.479008635329702 41.89961169571084 94.0 +170 140 12.479068855836491 41.89961301855884 94.0 +180 140 12.479129076347336 41.89961434137529 94.0 +190 140 12.479189296862241 41.899615664160216 94.0 +200 140 12.479249517381204 41.89961698691359 94.0 +210 140 12.479309737904225 41.89961830963544 94.0 +220 140 12.479369958431306 41.89961963232575 94.0 +230 140 12.479430178962446 41.89962095498452 94.0 +240 140 12.479490399497644 41.89962227761175 94.0 +250 140 12.4795506200369 41.89962360020745 94.0 +260 140 12.479610840580216 41.8996249227716 94.0 +270 140 12.47967106112759 41.89962624530422 94.0 +280 140 12.479731281679022 41.899627567805304 94.0 +290 140 12.479791502234516 41.89962889027485 94.0 +0 150 12.47804687912351 41.89954553544291 94.0 +10 150 12.478107099523188 41.89954685879342 94.0 +20 150 12.478167319926921 41.89954818211239 94.0 +30 150 12.478227540334712 41.89954950539983 94.0 +40 150 12.478287760746559 41.899550828655734 94.0 +50 150 12.478347981162464 41.899552151880094 94.0 +60 150 12.478408201582425 41.89955347507292 94.0 +70 150 12.478468422006445 41.89955479823421 94.0 +80 150 12.478528642434522 41.899556121363965 94.0 +90 150 12.478588862866657 41.89955744446218 94.0 +100 150 12.478649083302848 41.89955876752886 94.0 +110 150 12.478709303743099 41.899560090564 94.0 +120 150 12.478769524187406 41.89956141356761 94.0 +130 150 12.478829744635773 41.89956273653968 94.0 +140 150 12.478889965088197 41.89956405948021 94.0 +150 150 12.478950185544678 41.899565382389206 94.0 +160 150 12.479010406005218 41.89956670526666 94.0 +170 150 12.479070626469817 41.89956802811258 94.0 +180 150 12.479130846938475 41.89956935092696 94.0 +190 150 12.47919106741119 41.8995706737098 94.0 +200 150 12.479251287887964 41.89957199646111 94.0 +210 150 12.479311508368795 41.89957331918088 94.0 +220 150 12.479371728853687 41.899574641869116 94.0 +230 150 12.479431949342636 41.89957596452581 94.0 +240 150 12.479492169835646 41.89957728715097 94.0 +250 150 12.479552390332714 41.89957860974459 94.0 +260 150 12.47961261083384 41.89957993230667 94.0 +270 150 12.479672831339025 41.899581254837216 94.0 +280 150 12.47973305184827 41.899582577336226 94.0 +290 150 12.479793272361572 41.899583899803694 94.0 +0 160 12.478048650470017 41.89950054503152 94.0 +10 160 12.478108870827505 41.89950186837996 94.0 +20 160 12.47816909118905 41.89950319169685 94.0 +30 160 12.478229311554651 41.89950451498221 94.0 +40 160 12.47828953192431 41.89950583823604 94.0 +50 160 12.478349752298026 41.89950716145833 94.0 +60 160 12.478409972675799 41.89950848464908 94.0 +70 160 12.478470193057628 41.89950980780829 94.0 +80 160 12.478530413443517 41.89951113093597 94.0 +90 160 12.478590633833463 41.89951245403211 94.0 +100 160 12.478650854227466 41.899513777096715 94.0 +110 160 12.478711074625526 41.89951510012978 94.0 +120 160 12.478771295027645 41.89951642313132 94.0 +130 160 12.478831515433821 41.89951774610131 94.0 +140 160 12.478891735844057 41.89951906903976 94.0 +150 160 12.47895195625835 41.89952039194668 94.0 +160 160 12.4790121766767 41.899521714822065 94.0 +170 160 12.47907239709911 41.89952303766591 94.0 +180 160 12.479132617525577 41.89952436047822 94.0 +190 160 12.479192837956104 41.899525683258986 94.0 +200 160 12.47925305839069 41.89952700600822 94.0 +210 160 12.479313278829332 41.899528328725914 94.0 +220 160 12.479373499272034 41.899529651412074 94.0 +230 160 12.479433719718795 41.89953097406669 94.0 +240 160 12.479493940169615 41.89953229668978 94.0 +250 160 12.479554160624494 41.89953361928132 94.0 +260 160 12.479614381083431 41.89953494184133 94.0 +270 160 12.479674601546428 41.8995362643698 94.0 +280 160 12.479734822013482 41.899537586866735 94.0 +290 160 12.479795042484596 41.89953890933213 94.0 +0 170 12.478050421812489 41.89945555461972 94.0 +10 170 12.478110642127788 41.899456877966074 94.0 +20 170 12.478170862447143 41.8994582012809 94.0 +30 170 12.478231082770556 41.899459524564186 94.0 +40 170 12.478291303098025 41.89946084781594 94.0 +50 170 12.478351523429552 41.89946217103615 94.0 +60 170 12.478411743765136 41.899463494224825 94.0 +70 170 12.478471964104777 41.89946481738196 94.0 +80 170 12.478532184448476 41.89946614050756 94.0 +90 170 12.478592404796233 41.89946746360163 94.0 +100 170 12.478652625148047 41.89946878666416 94.0 +110 170 12.47871284550392 41.89947010969515 94.0 +120 170 12.478773065863848 41.899471432694604 94.0 +130 170 12.478833286227836 41.89947275566252 94.0 +140 170 12.478893506595883 41.89947407859891 94.0 +150 170 12.478953726967987 41.89947540150375 94.0 +160 170 12.479013947344148 41.89947672437705 94.0 +170 170 12.47907416772437 41.89947804721882 94.0 +180 170 12.479134388108648 41.899479370029056 94.0 +190 170 12.479194608496986 41.89948069280775 94.0 +200 170 12.479254828889381 41.89948201555491 94.0 +210 170 12.479315049285836 41.89948333827053 94.0 +220 170 12.479375269686349 41.89948466095461 94.0 +230 170 12.479435490090921 41.89948598360716 94.0 +240 170 12.479495710499553 41.89948730622817 94.0 +250 170 12.479555930912241 41.899488628817636 94.0 +260 170 12.47961615132899 41.89948995137557 94.0 +270 170 12.479676371749797 41.899491273901965 94.0 +280 170 12.479736592174664 41.899492596396826 94.0 +290 170 12.479796812603588 41.899493918860145 94.0 +0 180 12.478052193150925 41.8994105642075 94.0 +10 180 12.478112413424034 41.899411887551786 94.0 +20 180 12.478172633701202 41.89941321086453 94.0 +30 180 12.478232853982425 41.89941453414574 94.0 +40 180 12.478293074267706 41.89941585739542 94.0 +50 180 12.478353294557044 41.899417180613554 94.0 +60 180 12.47841351485044 41.899418503800156 94.0 +70 180 12.478473735147892 41.89941982695522 94.0 +80 180 12.478533955449402 41.899421150078744 94.0 +90 180 12.478594175754969 41.89942247317074 94.0 +100 180 12.478654396064595 41.89942379623119 94.0 +110 180 12.478714616378278 41.8994251192601 94.0 +120 180 12.478774836696019 41.899426442257486 94.0 +130 180 12.478835057017818 41.89942776522333 94.0 +140 180 12.478895277343675 41.89942908815763 94.0 +150 180 12.47895549767359 41.8994304110604 94.0 +160 180 12.479015718007563 41.89943173393163 94.0 +170 180 12.479075938345595 41.89943305677133 94.0 +180 180 12.479136158687686 41.89943437957948 94.0 +190 180 12.479196379033834 41.8994357023561 94.0 +200 180 12.47925659938404 41.899437025101186 94.0 +210 180 12.479316819738306 41.89943834781473 94.0 +220 180 12.479377040096631 41.89943967049674 94.0 +230 180 12.479437260459013 41.89944099314721 94.0 +240 180 12.479497480825456 41.899442315766144 94.0 +250 180 12.479557701195956 41.89944363835354 94.0 +260 180 12.479617921570517 41.8994449609094 94.0 +270 180 12.479678141949135 41.89944628343372 94.0 +280 180 12.479738362331812 41.899447605926504 94.0 +290 180 12.479798582718548 41.89944892838775 94.0 +0 190 12.478053964485326 41.899365573794874 94.0 +10 190 12.478114184716247 41.89936689713708 94.0 +20 190 12.478174404951226 41.89936822044775 94.0 +30 190 12.47823462519026 41.899369543726884 94.0 +40 190 12.478294845433352 41.899370866974486 94.0 +50 190 12.478355065680502 41.89937219019055 94.0 +60 190 12.478415285931707 41.89937351337507 94.0 +70 190 12.478475506186971 41.89937483652806 94.0 +80 190 12.478535726446292 41.899376159649506 94.0 +90 190 12.478595946709671 41.899377482739425 94.0 +100 190 12.478656166977109 41.8993788057978 94.0 +110 190 12.478716387248602 41.899380128824646 94.0 +120 190 12.478776607524155 41.89938145181995 94.0 +130 190 12.478836827803764 41.89938277478372 94.0 +140 190 12.478897048087433 41.899384097715945 94.0 +150 190 12.47895726837516 41.89938542061664 94.0 +160 190 12.479017488666944 41.89938674348579 94.0 +170 190 12.479077708962787 41.89938806632341 94.0 +180 190 12.479137929262688 41.899389389129496 94.0 +190 190 12.479198149566649 41.89939071190404 94.0 +200 190 12.479258369874668 41.89939203464705 94.0 +210 190 12.479318590186743 41.89939335735852 94.0 +220 190 12.47937881050288 41.899394680038455 94.0 +230 190 12.479439030823073 41.89939600268685 94.0 +240 190 12.479499251147327 41.89939732530371 94.0 +250 190 12.479559471475639 41.89939864788903 94.0 +260 190 12.47961969180801 41.899399970442815 94.0 +270 190 12.479679912144439 41.89940129296506 94.0 +280 190 12.479740132484928 41.89940261545577 94.0 +290 190 12.479800352829475 41.89940393791494 94.0 +0 200 12.47805573581569 41.89932058338183 94.0 +10 200 12.478115956004423 41.89932190672196 94.0 +20 200 12.478176176197213 41.899323230030554 94.0 +30 200 12.47823639639406 41.899324553307615 94.0 +40 200 12.478296616594964 41.899325876553135 94.0 +50 200 12.478356836799923 41.89932719976712 94.0 +60 200 12.478417057008942 41.899328522949574 94.0 +70 200 12.478477277222016 41.899329846100485 94.0 +80 200 12.478537497439149 41.89933116921986 94.0 +90 200 12.478597717660339 41.8993324923077 94.0 +100 200 12.478657937885588 41.899333815364 94.0 +110 200 12.478718158114892 41.89933513838877 94.0 +120 200 12.478778378348256 41.899336461382 94.0 +130 200 12.478838598585678 41.899337784343686 94.0 +140 200 12.478898818827158 41.899339107273846 94.0 +150 200 12.478959039072695 41.899340430172465 94.0 +160 200 12.47901925932229 41.89934175303954 94.0 +170 200 12.479079479575946 41.89934307587509 94.0 +180 200 12.479139699833658 41.8993443986791 94.0 +190 200 12.47919992009543 41.89934572145157 94.0 +200 200 12.479260140361259 41.899347044192496 94.0 +210 200 12.479320360631148 41.8993483669019 94.0 +220 200 12.479380580905095 41.89934968957975 94.0 +230 200 12.4794408011831 41.89935101222608 94.0 +240 200 12.479501021465165 41.899352334840856 94.0 +250 200 12.479561241751288 41.89935365742411 94.0 +260 200 12.47962146204147 41.89935497997581 94.0 +270 200 12.47968168233571 41.89935630249599 94.0 +280 200 12.47974190263401 41.899357624984624 94.0 +290 200 12.47980212293637 41.89935894744172 94.0 +0 210 12.478057507142022 41.89927559296837 94.0 +10 210 12.478117727288566 41.89927691630643 94.0 +20 210 12.478177947439166 41.89927823961295 94.0 +30 210 12.478238167593824 41.89927956288793 94.0 +40 210 12.47829838775254 41.89928088613138 94.0 +50 210 12.478358607915311 41.89928220934328 94.0 +60 210 12.478418828082141 41.89928353252366 94.0 +70 210 12.478479048253027 41.8992848556725 94.0 +80 210 12.478539268427971 41.8992861787898 94.0 +90 210 12.478599488606973 41.89928750187556 94.0 +100 210 12.478659708790032 41.89928882492979 94.0 +110 210 12.47871992897715 41.89929014795248 94.0 +120 210 12.478780149168324 41.89929147094363 94.0 +130 210 12.478840369363557 41.89929279390325 94.0 +140 210 12.478900589562848 41.89929411683133 94.0 +150 210 12.478960809766198 41.89929543972787 94.0 +160 210 12.479021029973605 41.89929676259288 94.0 +170 210 12.479081250185072 41.89929808542635 94.0 +180 210 12.479141470400595 41.89929940822828 94.0 +190 210 12.479201690620178 41.899300730998675 94.0 +200 210 12.47926191084382 41.899302053737536 94.0 +210 210 12.479322131071518 41.899303376444855 94.0 +220 210 12.479382351303277 41.89930469912064 94.0 +230 210 12.479442571539094 41.899306021764886 94.0 +240 210 12.47950279177897 41.8993073443776 94.0 +250 210 12.479563012022904 41.89930866695877 94.0 +260 210 12.479623232270898 41.8993099895084 94.0 +270 210 12.47968345252295 41.8993113120265 94.0 +280 210 12.479743672779062 41.89931263451306 94.0 +290 210 12.479803893039232 41.89931395696808 94.0 +0 220 12.478059278464317 41.8992306025545 94.0 +10 220 12.478119498568672 41.89923192589048 94.0 +20 220 12.478179718677085 41.89923324919492 94.0 +30 220 12.478239938789555 41.89923457246783 94.0 +40 220 12.47830015890608 41.899235895709204 94.0 +50 220 12.478360379026665 41.89923721891904 94.0 +60 220 12.478420599151304 41.899238542097336 94.0 +70 220 12.478480819280003 41.8992398652441 94.0 +80 220 12.47854103941276 41.89924118835932 94.0 +90 220 12.478601259549572 41.89924251144301 94.0 +100 220 12.478661479690443 41.89924383449516 94.0 +110 220 12.478721699835372 41.89924515751578 94.0 +120 220 12.478781919984359 41.89924648050486 94.0 +130 220 12.478842140137402 41.899247803462394 94.0 +140 220 12.478902360294505 41.899249126388405 94.0 +150 220 12.478962580455667 41.89925044928287 94.0 +160 220 12.479022800620886 41.8992517721458 94.0 +170 220 12.479083020790162 41.8992530949772 94.0 +180 220 12.479143240963499 41.89925441777705 94.0 +190 220 12.479203461140893 41.89925574054537 94.0 +200 220 12.479263681322346 41.89925706328216 94.0 +210 220 12.479323901507856 41.8992583859874 94.0 +220 220 12.479384121697427 41.89925970866111 94.0 +230 220 12.479444341891055 41.89926103130328 94.0 +240 220 12.479504562088742 41.89926235391392 94.0 +250 220 12.479564782290488 41.899263676493014 94.0 +260 220 12.479625002496293 41.899264999040575 94.0 +270 220 12.479685222706157 41.899266321556595 94.0 +280 220 12.47974544292008 41.89926764404108 94.0 +290 220 12.479805663138062 41.899268966494034 94.0 +0 230 12.478061049782577 41.899185612140215 94.0 +10 230 12.478121269844744 41.89918693547412 94.0 +20 230 12.478181489910968 41.89918825877649 94.0 +30 230 12.47824170998125 41.89918958204732 94.0 +40 230 12.478301930055586 41.899190905286616 94.0 +50 230 12.478362150133982 41.89919222849437 94.0 +60 230 12.478422370216435 41.8991935516706 94.0 +70 230 12.478482590302944 41.89919487481529 94.0 +80 230 12.478542810393511 41.89919619792843 94.0 +90 230 12.478603030488136 41.899197521010045 94.0 +100 230 12.47866325058682 41.89919884406012 94.0 +110 230 12.478723470689559 41.89920016707866 94.0 +120 230 12.478783690796357 41.899201490065664 94.0 +130 230 12.478843910907214 41.899202813021134 94.0 +140 230 12.478904131022128 41.89920413594506 94.0 +150 230 12.4789643511411 41.89920545883746 94.0 +160 230 12.479024571264132 41.89920678169831 94.0 +170 230 12.47908479139122 41.89920810452763 94.0 +180 230 12.479145011522368 41.89920942732541 94.0 +190 230 12.479205231657573 41.899210750091655 94.0 +200 230 12.479265451796838 41.899212072826366 94.0 +210 230 12.47932567194016 41.899213395529536 94.0 +220 230 12.479385892087542 41.89921471820117 94.0 +230 230 12.479446112238982 41.89921604084127 94.0 +240 230 12.47950633239448 41.89921736344983 94.0 +250 230 12.47956655255404 41.89921868602685 94.0 +260 230 12.479626772717657 41.899220008572335 94.0 +270 230 12.479686992885332 41.89922133108628 94.0 +280 230 12.479747213057067 41.89922265356869 94.0 +290 230 12.47980743323286 41.89922397601957 94.0 +0 240 12.478062821096803 41.899140621725515 94.0 +10 240 12.478123041116781 41.899141945057345 94.0 +20 240 12.478183261140817 41.89914326835764 94.0 +30 240 12.47824348116891 41.899144591626396 94.0 +40 240 12.478303701201058 41.89914591486362 94.0 +50 240 12.478363921237266 41.8991472380693 94.0 +60 240 12.47842414127753 41.89914856124344 94.0 +70 240 12.478484361321852 41.899149884386055 94.0 +80 240 12.47854458137023 41.89915120749713 94.0 +90 240 12.478604801422668 41.899152530576664 94.0 +100 240 12.478665021479161 41.89915385362467 94.0 +110 240 12.478725241539713 41.89915517664113 94.0 +120 240 12.478785461604323 41.89915649962606 94.0 +130 240 12.478845681672992 41.899157822579454 94.0 +140 240 12.478905901745717 41.89915914550131 94.0 +150 240 12.478966121822502 41.89916046839162 94.0 +160 240 12.479026341903344 41.89916179125041 94.0 +170 240 12.479086561988245 41.899163114077645 94.0 +180 240 12.479146782077203 41.899164436873356 94.0 +190 240 12.479207002170222 41.899165759637526 94.0 +200 240 12.479267222267298 41.89916708237016 94.0 +210 240 12.479327442368431 41.89916840507126 94.0 +220 240 12.479387662473625 41.89916972774081 94.0 +230 240 12.479447882582877 41.89917105037884 94.0 +240 240 12.479508102696188 41.89917237298532 94.0 +250 240 12.479568322813558 41.89917369556027 94.0 +260 240 12.479628542934986 41.89917501810368 94.0 +270 240 12.479688763060473 41.899176340615554 94.0 +280 240 12.479748983190019 41.89917766309589 94.0 +290 240 12.479809203323624 41.899178985544694 94.0 +0 250 12.47806459240699 41.8990956313104 94.0 +10 250 12.478124812384783 41.89909695464016 94.0 +20 250 12.47818503236663 41.89909827793837 94.0 +30 250 12.478245252352535 41.89909960120505 94.0 +40 250 12.478305472342496 41.8991009244402 94.0 +50 250 12.478365692336515 41.8991022476438 94.0 +60 250 12.47842591233459 41.899103570815875 94.0 +70 250 12.478486132336723 41.89910489395641 94.0 +80 250 12.478546352342915 41.89910621706541 94.0 +90 250 12.478606572353163 41.89910754014287 94.0 +100 250 12.47866679236747 41.8991088631888 94.0 +110 250 12.478727012385834 41.89911018620319 94.0 +120 250 12.478787232408255 41.89911150918604 94.0 +130 250 12.478847452434735 41.899112832137355 94.0 +140 250 12.478907672465272 41.899114155057134 94.0 +150 250 12.478967892499869 41.89911547794538 94.0 +160 250 12.479028112538522 41.899116800802084 94.0 +170 250 12.479088332581235 41.899118123627254 94.0 +180 250 12.479148552628006 41.89911944642088 94.0 +190 250 12.479208772678836 41.89912076918298 94.0 +200 250 12.479268992733724 41.89912209191354 94.0 +210 250 12.47932921279267 41.89912341461256 94.0 +220 250 12.479389432855674 41.89912473728005 94.0 +230 250 12.479449652922739 41.89912605991599 94.0 +240 250 12.47950987299386 41.899127382520405 94.0 +250 250 12.479570093069043 41.899128705093275 94.0 +260 250 12.479630313148283 41.89913002763461 94.0 +270 250 12.479690533231581 41.899131350144415 94.0 +280 250 12.47975075331894 41.89913267262268 94.0 +290 250 12.479810973410357 41.8991339950694 94.0 +0 260 12.478066363713145 41.89905064089488 94.0 +10 260 12.478126583648748 41.89905196422256 94.0 +20 260 12.478186803588407 41.8990532875187 94.0 +30 260 12.478247023532125 41.8990546107833 94.0 +40 260 12.478307243479899 41.89905593401637 94.0 +50 260 12.478367463431729 41.899057257217905 94.0 +60 260 12.478427683387617 41.899058580387894 94.0 +70 260 12.478487903347562 41.89905990352636 94.0 +80 260 12.478548123311565 41.89906122663328 94.0 +90 260 12.478608343279625 41.89906254970867 94.0 +100 260 12.478668563251743 41.89906387275252 94.0 +110 260 12.478728783227918 41.899065195764834 94.0 +120 260 12.478789003208153 41.899066518745606 94.0 +130 260 12.478849223192444 41.89906784169485 94.0 +140 260 12.478909443180793 41.899069164612555 94.0 +150 260 12.478969663173201 41.89907048749872 94.0 +160 260 12.479029883169668 41.89907181035335 94.0 +170 260 12.479090103170192 41.899073133176444 94.0 +180 260 12.479150323174775 41.899074455968005 94.0 +190 260 12.479210543183417 41.899075778728026 94.0 +200 260 12.479270763196116 41.899077101456506 94.0 +210 260 12.479330983212876 41.89907842415345 94.0 +220 260 12.47939120323369 41.89907974681886 94.0 +230 260 12.479451423258567 41.899081069452734 94.0 +240 260 12.479511643287502 41.89908239205507 94.0 +250 260 12.479571863320496 41.89908371462587 94.0 +260 260 12.479632083357547 41.89908503716513 94.0 +270 260 12.479692303398659 41.89908635967286 94.0 +280 260 12.479752523443828 41.899087682149045 94.0 +290 260 12.479812743493058 41.89908900459369 94.0 +0 270 12.478068135015265 41.89900565047894 94.0 +10 270 12.47812835490868 41.89900697380454 94.0 +20 270 12.47818857480615 41.899008297098604 94.0 +30 270 12.47824879470768 41.899009620361134 94.0 +40 270 12.478309014613265 41.899010943592124 94.0 +50 270 12.478369234522908 41.89901226679159 94.0 +60 270 12.478429454436608 41.8990135899595 94.0 +70 270 12.478489674354366 41.89901491309589 94.0 +80 270 12.47854989427618 41.89901623620074 94.0 +90 270 12.478610114202052 41.89901755927405 94.0 +100 270 12.478670334131982 41.89901888231582 94.0 +110 270 12.47873055406597 41.89902020532606 94.0 +120 270 12.478790774004016 41.899021528304765 94.0 +130 270 12.47885099394612 41.89902285125193 94.0 +140 270 12.478911213892282 41.89902417416756 94.0 +150 270 12.478971433842501 41.899025497051646 94.0 +160 270 12.47903165379678 41.89902681990421 94.0 +170 270 12.479091873755117 41.89902814272522 94.0 +180 270 12.479152093717511 41.89902946551471 94.0 +190 270 12.479212313683965 41.899030788272654 94.0 +200 270 12.479272533654475 41.89903211099906 94.0 +210 270 12.479332753629047 41.89903343369393 94.0 +220 270 12.479392973607675 41.89903475635727 94.0 +230 270 12.479453193590363 41.89903607898906 94.0 +240 270 12.47951341357711 41.899037401589325 94.0 +250 270 12.479573633567915 41.899038724158046 94.0 +260 270 12.47963385356278 41.899040046695234 94.0 +270 270 12.479694073561703 41.89904136920089 94.0 +280 270 12.479754293564683 41.899042691675 94.0 +290 270 12.479814513571725 41.89904401411758 94.0 +0 280 12.47806990631335 41.898960660062585 94.0 +10 280 12.478130126164576 41.89896198338611 94.0 +20 280 12.47819034601986 41.8989633066781 94.0 +30 280 12.4782505658792 41.898964629938554 94.0 +40 280 12.478310785742599 41.89896595316747 94.0 +50 280 12.478371005610052 41.89896727636485 94.0 +60 280 12.478431225481565 41.8989685995307 94.0 +70 280 12.478491445357134 41.898969922665 94.0 +80 280 12.478551665236761 41.898971245767775 94.0 +90 280 12.478611885120445 41.898972568839014 94.0 +100 280 12.478672105008188 41.89897389187871 94.0 +110 280 12.478732324899987 41.898975214886875 94.0 +120 280 12.478792544795846 41.898976537863504 94.0 +130 280 12.47885276469576 41.89897786080859 94.0 +140 280 12.478912984599734 41.89897918372215 94.0 +150 280 12.478973204507767 41.89898050660416 94.0 +160 280 12.479033424419857 41.89898182945464 94.0 +170 280 12.479093644336006 41.89898315227359 94.0 +180 280 12.479153864256213 41.89898447506099 94.0 +190 280 12.479214084180478 41.89898579781686 94.0 +200 280 12.479274304108802 41.8989871205412 94.0 +210 280 12.479334524041185 41.898988443233996 94.0 +220 280 12.479394743977625 41.89898976589526 94.0 +230 280 12.479454963918126 41.89899108852498 94.0 +240 280 12.479515183862684 41.89899241112317 94.0 +250 280 12.479575403811301 41.898993733689814 94.0 +260 280 12.47963562376398 41.898995056224926 94.0 +270 280 12.479695843720714 41.898996378728505 94.0 +280 280 12.479756063681508 41.89899770120054 94.0 +290 280 12.479816283646361 41.89899902364104 94.0 +0 290 12.478071677607398 41.89891566964582 94.0 +10 290 12.478131897416437 41.898916992967266 94.0 +20 290 12.478192117229533 41.89891831625718 94.0 +30 290 12.478252337046685 41.89891963951556 94.0 +40 290 12.478312556867895 41.8989209627424 94.0 +50 290 12.478372776693163 41.89892228593771 94.0 +60 290 12.478432996522487 41.89892360910147 94.0 +70 290 12.478493216355869 41.898924932233705 94.0 +80 290 12.478553436193307 41.8989262553344 94.0 +90 290 12.478613656034804 41.898927578403566 94.0 +100 290 12.478673875880359 41.89892890144119 94.0 +110 290 12.47873409572997 41.89893022444728 94.0 +120 290 12.478794315583642 41.89893154742183 94.0 +130 290 12.47885453544137 41.898932870364845 94.0 +140 290 12.478914755303155 41.898934193276325 94.0 +150 290 12.478974975168999 41.898935516156264 94.0 +160 290 12.479035195038902 41.89893683900467 94.0 +170 290 12.479095414912862 41.89893816182154 94.0 +180 290 12.479155634790882 41.89893948460687 94.0 +190 290 12.47921585467296 41.89894080736067 94.0 +200 290 12.479276074559095 41.89894213008292 94.0 +210 290 12.47933629444929 41.89894345277364 94.0 +220 290 12.479396514343543 41.89894477543283 94.0 +230 290 12.479456734241856 41.89894609806048 94.0 +240 290 12.479516954144227 41.89894742065659 94.0 +250 290 12.479577174050656 41.89894874322117 94.0 +260 290 12.479637393961145 41.89895006575421 94.0 +270 290 12.479697613875691 41.8989513882557 94.0 +280 290 12.479757833794299 41.898952710725666 94.0 +290 290 12.479818053716963 41.898954033164095 94.0 diff --git a/Modules/Filtering/Projection/test/otbSensorModel.cxx b/Modules/Filtering/Projection/test/otbSensorModel.cxx index 02ef9e8311..22713f8c97 100644 --- a/Modules/Filtering/Projection/test/otbSensorModel.cxx +++ b/Modules/Filtering/Projection/test/otbSensorModel.cxx @@ -26,7 +26,6 @@ #include #include "otbVectorImage.h" -#include "otbImageFileReader.h" #include "otbImageMetadata.h" #include "otbRPCForwardTransform.h" #include "otbRPCInverseTransform.h" diff --git a/Modules/IO/IOGDAL/otb-module.cmake b/Modules/IO/IOGDAL/otb-module.cmake index 5b185de6ab..84003b7e8c 100644 --- a/Modules/IO/IOGDAL/otb-module.cmake +++ b/Modules/IO/IOGDAL/otb-module.cmake @@ -38,6 +38,7 @@ ENABLE_SHARED TEST_DEPENDS OTBTestKernel OTBImageIO + OTBProjection DESCRIPTION "${DOCUMENTATION}" diff --git a/Modules/IO/IOGDAL/test/CMakeLists.txt b/Modules/IO/IOGDAL/test/CMakeLists.txt index bc78528aae..fd29305dd3 100644 --- a/Modules/IO/IOGDAL/test/CMakeLists.txt +++ b/Modules/IO/IOGDAL/test/CMakeLists.txt @@ -33,6 +33,7 @@ otbMultiDatasetReadingInfo.cxx otbOGRVectorDataIOCanRead.cxx otbGDALImageIOImportExportMetadata.cxx otbGDALRPCTransformerTest.cxx +otbGDALRPCTransformerTest2.cxx ) add_executable(otbIOGDALTestDriver ${OTBIOGDALTests}) @@ -267,3 +268,49 @@ otb_add_test(NAME TuGDALRPCTransformerTest otbGDALRPCTransformerTest ${INPUTDATA}/TuGDALRPCTransformerTest_DEM.tif ) + +otb_add_test(NAME ioTvGDALRPCTransformerTest_ikonos + COMMAND otbIOGDALTestDriver + otbGDALRPCTransformerTest2 + ${INPUTDATA}/ikonos/ikonos-1.geom # Geom + ${INPUTDATA}/ikonos/ikonos-1.gcp2 # GCP + 1 # GeoTol + 1 # ImgTol + ) + +otb_add_test(NAME ioTvGDALRPCTransformerTest_quickbird + COMMAND otbIOGDALTestDriver + otbGDALRPCTransformerTest2 + ${INPUTDATA}/QB/qb-1.geom # Geom + ${INPUTDATA}/QB/qb-1.gcp2 # GCP + 1 # GeoTol + 1 # ImgTol + ) + +otb_add_test(NAME ioTvGDALRPCTransformerTest_spot6 + COMMAND otbIOGDALTestDriver + otbGDALRPCTransformerTest2 + ${INPUTDATA}/spot6/spot6-1.geom # Geom + ${INPUTDATA}/spot6/spot6-1.gcp2 # GCP + 1 # GeoTol + 1 # ImgTol + ) + +otb_add_test(NAME ioTvGDALRPCTransformerTest_worldview2 + COMMAND otbIOGDALTestDriver + otbGDALRPCTransformerTest2 + ${INPUTDATA}/wv2/wv2-1.geom # Geom + ${INPUTDATA}/wv2/wv2-1.gcp2 # GCP + 1 # GeoTol + 1 # ImgTol + ) + +otb_add_test(NAME ioTvGDALRPCTransformerTest_pl_hnord + COMMAND otbIOGDALTestDriver + otbGDALRPCTransformerTest2 + ${INPUTDATA}/pleiades/pleiades-1.geom # Geom + ${INPUTDATA}/pleiades/pleiades-1.gcp2 # GCP + 1 # GeoTol + 1 # ImgTol + ) + diff --git a/Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest.cxx b/Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest.cxx index f50c1ac3a9..a790797846 100644 --- a/Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest.cxx +++ b/Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest.cxx @@ -20,16 +20,11 @@ #include "otbGDALRPCTransformer.h" #include "otbMacro.h" -#include "otbImage.h" -#include "otbImageFileReader.h" #include "otbImageMetadata.h" #include "gdal_utils.h" #include #include "otbDEMHandler.h" -typedef otb::Image ImageType; -typedef otb::ImageFileReader ReaderType; - int otbGDALRPCTransformerTest(int itkNotUsed(argc), char* argv[]) { bool success = true; diff --git a/Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest2.cxx b/Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest2.cxx new file mode 100644 index 0000000000..6ceae6e044 --- /dev/null +++ b/Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest2.cxx @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2005-2020 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "itkPoint.h" +#include "otbGDALRPCTransformer.h" +#include "itkEuclideanDistanceMetric.h" +#include "otbGeographicalDistance.h" +#include "otbImageMetadata.h" +#include "otbMetaDataKey.h" +#include "otbGeomMetadataSupplier.h" +#include "otbImageMetadataInterfaceFactory.h" +#include "otbMacro.h" + +//typedef otb::Image ImageType; +typedef std::list> pointsContainerType; +typedef itk::Statistics::EuclideanDistanceMetric DistanceType; +typedef otb::GeographicalDistance GeographicalDistanceType; + +int otbGDALRPCTransformerTest2(int itkNotUsed(argc), char* argv[]) +{ + bool success = true; + + // Inputs + std::string inputGeomFile(argv[1]); + std::string gcpFileName(argv[2]); + double geoTol(atof(argv[3])); + double imgTol(atof(argv[4])); + + // Tools + auto distance = DistanceType::New(); + auto geoDistance = GeographicalDistanceType::New(); + + // Fetching the RPC model from the product + otb::ImageMetadata imd; + otb::GeomMetadataSupplier geomSupplier(inputGeomFile); + for (int loop = 0 ; loop < geomSupplier.GetNbBands() ; ++loop) + imd.Bands.emplace_back(); + auto imi = otb::ImageMetadataInterfaceFactory::CreateIMI(imd, geomSupplier); + imd = imi->GetImageMetadata(); + geomSupplier.FetchRPC(imd); + auto rpcModel = boost::any_cast(imd[otb::MDGeom::RPC]); + + // Setting the RPCTransformer + otb::GDALRPCTransformer transformer(rpcModel.LineOffset, rpcModel.SampleOffset, rpcModel.LatOffset, rpcModel.LonOffset, rpcModel.HeightOffset, + rpcModel.LineScale, rpcModel.SampleScale, rpcModel.LatScale, rpcModel.LonScale, rpcModel.HeightScale, + rpcModel.LineNum, rpcModel.LineDen, rpcModel.SampleNum, rpcModel.SampleDen, false); + + // Loading the GCP + pointsContainerType pointsContainer; + pointsContainerType geo3dPointsContainer; + std::ifstream file(gcpFileName, std::ios::in); + if (file) + { + otb::GDALRPCTransformer::PointType imagePoint; + otb::GDALRPCTransformer::PointType geo3dPoint; + std::string line; + imagePoint[2] = rpcModel.HeightOffset; + while (getline(file, line)) + { + if (line.find_first_of("#") != 0) + { + std::istringstream iss(line); + + iss >> imagePoint[0] >> imagePoint[1] >> geo3dPoint[0] >> geo3dPoint[1] >> geo3dPoint[2]; + + pointsContainer.push_back(imagePoint); + geo3dPointsContainer.push_back(geo3dPoint); + } + } + file.close(); + } + + // For each CGP + pointsContainerType::iterator pointsIt = pointsContainer.begin(); + pointsContainerType::iterator geo3dPointsIt = geo3dPointsContainer.begin(); + while ((pointsIt != pointsContainer.end()) && (geo3dPointsIt != geo3dPointsContainer.end())) + { + otbLogMacro(Debug, << "Point: " << *pointsIt << " GeoPoint: " << *geo3dPointsIt); + // Testing forward transform + otbLogMacro(Debug, << "ForwardTransform: " << transformer.ForwardTransform(*pointsIt)); + auto forwardPointDistance = geoDistance->Evaluate(transformer.ForwardTransform(*pointsIt), *geo3dPointsIt); + otbLogMacro(Debug, << "forwardPointDistance: " << forwardPointDistance); + if (forwardPointDistance > geoTol) + { + std::cerr << "Geo distance between otbGDALRPCTransformer->ForwardTransform and GCP too high : " + << "dist = " << forwardPointDistance << " (tol = " << geoTol << ")" << std::endl; + success = false; + } + + // Testing inverse transform + otbLogMacro(Debug, << "InverseTransform: " << transformer.InverseTransform(*geo3dPointsIt)); + auto inversePointDistance = distance->Evaluate(transformer.InverseTransform(*geo3dPointsIt), *pointsIt); + otbLogMacro(Debug, << "inversePointDistance: " << inversePointDistance); + if (inversePointDistance > imgTol) + { + std::cerr << "Distance between otbGDALRPCTransformer->InverseTransform and GCP too high : " + << "dist = " << inversePointDistance << " (tol = " << imgTol << ")" << std::endl; + success = false; + } + + ++pointsIt; + ++geo3dPointsIt; + } + + if (success) + return EXIT_SUCCESS; + else + return EXIT_FAILURE; +} diff --git a/Modules/IO/IOGDAL/test/otbIOGDALTestDriver.cxx b/Modules/IO/IOGDAL/test/otbIOGDALTestDriver.cxx index b29c95d4e6..bb98f59e82 100644 --- a/Modules/IO/IOGDAL/test/otbIOGDALTestDriver.cxx +++ b/Modules/IO/IOGDAL/test/otbIOGDALTestDriver.cxx @@ -35,4 +35,5 @@ void RegisterTests() REGISTER_TEST(otbOGRVectorDataIOTestCanRead); REGISTER_TEST(otbGDALImageIOImportExportMetadata); REGISTER_TEST(otbGDALRPCTransformerTest); + REGISTER_TEST(otbGDALRPCTransformerTest2); } -- GitLab From e615d94f781d7aebbae6f3908fa22a3ffdba58e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Thu, 21 Jan 2021 10:23:24 +0100 Subject: [PATCH 093/123] REFAC: adds a constructor to GDALRPCTransformer taking a RPCParam struct as input --- Modules/Core/Transform/include/otbRPCTransformBase.hxx | 5 +---- Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h | 4 ++++ Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx | 8 ++++++++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Modules/Core/Transform/include/otbRPCTransformBase.hxx b/Modules/Core/Transform/include/otbRPCTransformBase.hxx index a49bf4416e..e723d1f936 100644 --- a/Modules/Core/Transform/include/otbRPCTransformBase.hxx +++ b/Modules/Core/Transform/include/otbRPCTransformBase.hxx @@ -44,10 +44,7 @@ bool RPCTransformBase::SetMeta } constexpr bool useDEM = NInputDimensions == 2 ? true : false; - this->m_Transformer = std::make_unique( - m_RPCParam->LineOffset, m_RPCParam->SampleOffset, m_RPCParam->LatOffset, m_RPCParam->LonOffset, m_RPCParam->HeightOffset, - m_RPCParam->LineScale, m_RPCParam->SampleScale, m_RPCParam->LatScale, m_RPCParam->LonScale, m_RPCParam->HeightScale, - m_RPCParam->LineNum, m_RPCParam->LineDen, m_RPCParam->SampleNum, m_RPCParam->SampleDen, useDEM); + this->m_Transformer = std::make_unique(*m_RPCParam, useDEM); return true; } diff --git a/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h b/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h index facde156b0..8fd1315969 100644 --- a/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h +++ b/Modules/IO/IOGDAL/include/otbGDALRPCTransformer.h @@ -24,6 +24,7 @@ #include "gdal_alg.h" #include "otbDEMHandler.h" +#include "otbGeometryMetadata.h" #include @@ -66,6 +67,9 @@ public: GDALRPCTransformer(double LineOffset, double SampleOffset, double LatOffset, double LonOffset, double HeightOffset, double LineScale, double SampleScale, double LatScale, double LonScale, double HeightScale, const double (&LineNum)[20], const double (&LineDen)[20], const double (&SampleNum)[20], const double (&SampleDen)[20], bool useDEM); + + GDALRPCTransformer(const Projection::RPCParam &, bool useDEM); + ~GDALRPCTransformer(); /** diff --git a/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx b/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx index b118f09ce1..fcc370a18e 100644 --- a/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx +++ b/Modules/IO/IOGDAL/src/otbGDALRPCTransformer.cxx @@ -61,6 +61,14 @@ GDALRPCTransformer::GDALRPCTransformer(double LineOffset, double SampleOffset, d this->SetOption("RPC_PIXEL_ERROR_THRESHOLD", "0.000001"); } +GDALRPCTransformer::GDALRPCTransformer(const Projection::RPCParam & param, bool useDEM) + : GDALRPCTransformer( param.LineOffset, param.SampleOffset, param.LatOffset, param.LonOffset, param.HeightOffset, + param.LineScale, param.SampleScale, param.LatScale, param.LonScale, param.HeightScale, + param.LineNum, param.LineDen, param.SampleNum, param.SampleDen, + useDEM) +{ +} + GDALRPCTransformer::~GDALRPCTransformer() { if(m_TransformArg != nullptr) -- GitLab From 2d6aa87c7fd465b27c5a66199cd64f23f5ff5a6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Thu, 21 Jan 2021 12:22:20 +0100 Subject: [PATCH 094/123] REFAC: implements various improvements in RPCSolver (code review) --- .../Filtering/Projection/src/otbRPCSolver.cxx | 133 ++++++++++-------- .../Filtering/Projection/test/CMakeLists.txt | 8 +- 2 files changed, 77 insertions(+), 64 deletions(-) diff --git a/Modules/Filtering/Projection/src/otbRPCSolver.cxx b/Modules/Filtering/Projection/src/otbRPCSolver.cxx index 9bd4fd2528..eb5582a11d 100644 --- a/Modules/Filtering/Projection/src/otbRPCSolver.cxx +++ b/Modules/Filtering/Projection/src/otbRPCSolver.cxx @@ -24,20 +24,22 @@ #include "vnl/algo/vnl_svd.h" #include "vnl/algo/vnl_matrix_inverse.h" +#include "otbGDALRPCTransformer.h" + namespace otb { -const double epsilon = 1e-7; - using PrecisionType = double; using VectorType = vnl_vector; using MatrixType = vnl_matrix; using DiagonalMatrixType = vnl_diag_matrix; +const PrecisionType epsilon = 1e-7; + void UpdateMatrix(const VectorType & f, - const std::vector & x, - const std::vector & y, - const std::vector & z, + const std::vector & x, + const std::vector & y, + const std::vector & z, MatrixType & M) { for(unsigned int i = 0; i < f.size(); i++) @@ -84,13 +86,13 @@ void UpdateMatrix(const VectorType & f, } } -void UpdateWeights(const std::vector & x, - const std::vector & y, - const std::vector & z, +void UpdateWeights(const std::vector & x, + const std::vector & y, + const std::vector & z, const VectorType & coeff, DiagonalMatrixType & W) { - std::vector row(coeff.size()); + std::vector row(coeff.size()); for(unsigned int i = 0; i < x.size(); i++) { @@ -129,11 +131,11 @@ void UpdateWeights(const std::vector & x, } } -void computeCoefficients(const std::vector & f, - const std::vector & x, - const std::vector & y, - const std::vector & z, - std::vector & outCoeffs) +void computeCoefficients(const std::vector & f, + const std::vector & x, + const std::vector & y, + const std::vector & z, + std::vector & outCoeffs) { auto numberOfPoints = f.size(); @@ -143,12 +145,15 @@ void computeCoefficients(const std::vector & f, VectorType r(numberOfPoints, numberOfPoints, f.data()); DiagonalMatrixType weights(numberOfPoints, 1.); - double res = std::numeric_limits::max(); + PrecisionType res = std::numeric_limits::max(); VectorType coeffs; - int i =0; - while (res > epsilon && i < 10) + for (int i =0; i<10; i++) { + if (res < epsilon) + { + break; + } auto w2 = weights * weights; UpdateMatrix(r, x, y ,z ,M); @@ -168,6 +173,7 @@ void computeCoefficients(const std::vector & f, } } + // "svd.V() * diag * svd.U().transpose()" is the inverse of M.transpose()*w2*M coeffs = svd.V() * diag * svd.U().transpose() * M.transpose()*w2*r; auto denominator = VectorType(&(coeffs[19]), 20); @@ -179,37 +185,31 @@ void computeCoefficients(const std::vector & f, auto residual = M.transpose()*w2*(M*coeffs-r); auto residualValue = inner_product(residual,residual); - i++; } - outCoeffs.resize(coeffs.size()); - std::copy(coeffs.begin(), coeffs.end(), outCoeffs.begin()); + outCoeffs.assign(coeffs.begin(), coeffs.end()); } - - - - -void RPCSolver::Solve(const GCPsContainerType& gcpContainer, double& rmsError, Projection::RPCParam& outputParams) +void RPCSolver::Solve(const GCPsContainerType& gcpContainer, PrecisionType& rmsError, Projection::RPCParam& outputParams) { // By default, use elevation provided with ground control points bool useElevation = true; auto numberOfPoints = gcpContainer.size(); - std::vector colNorm; + std::vector colNorm; colNorm.reserve(numberOfPoints); - std::vector lineNorm; + std::vector lineNorm; lineNorm.reserve(numberOfPoints); - std::vector lonNorm; + std::vector lonNorm; lonNorm.reserve(numberOfPoints); - std::vector latNorm; + std::vector latNorm; latNorm.reserve(numberOfPoints); - std::vector altNorm; + std::vector altNorm; altNorm.reserve(numberOfPoints); // Check for enough points @@ -235,9 +235,9 @@ void RPCSolver::Solve(const GCPsContainerType& gcpContainer, double& rmsError, P // Compute Offsets // Find the ground points center of mass - double accLat = 0.; - double accLon = 0.; - double accAlt = 0.; + PrecisionType accLat = 0.; + PrecisionType accLon = 0.; + PrecisionType accAlt = 0.; for (const auto & gcp : gcpContainer) { @@ -257,10 +257,10 @@ void RPCSolver::Solve(const GCPsContainerType& gcpContainer, double& rmsError, P groundCenter[2] = useElevation ? accAlt / numberOfPoints : 0.; - double minc = std::numeric_limits::max(); - double minl = std::numeric_limits::max(); - double maxc = std::numeric_limits::min(); - double maxl = std::numeric_limits::min(); + PrecisionType minc = std::numeric_limits::max(); + PrecisionType minl = std::numeric_limits::max(); + PrecisionType maxc = std::numeric_limits::min(); + PrecisionType maxl = std::numeric_limits::min(); for (const auto & gcp : gcpContainer) { @@ -280,9 +280,9 @@ void RPCSolver::Solve(const GCPsContainerType& gcpContainer, double& rmsError, P auto height = std::abs(minl - maxl) +1; auto width = std::abs(minc - maxc) +1; - double maxDeltaLon = std::numeric_limits::min(); - double maxDeltaLat = std::numeric_limits::min(); - double maxDeltaAlt = std::numeric_limits::min(); + PrecisionType maxDeltaLon = std::numeric_limits::min(); + PrecisionType maxDeltaLat = std::numeric_limits::min(); + PrecisionType maxDeltaAlt = std::numeric_limits::min(); for (const auto & gcp : gcpContainer) { @@ -308,40 +308,43 @@ void RPCSolver::Solve(const GCPsContainerType& gcpContainer, double& rmsError, P { maxDeltaLat = 1.0; } + else + { + for (auto & lat: latNorm) + { + lat /= maxDeltaLat; + } + } + if(maxDeltaLon < 1.0) { maxDeltaLon = 1.0; } - - if(fabs(maxDeltaAlt) < epsilon) + else { - maxDeltaAlt = false; + for (auto & lon: lonNorm) + { + lon /= maxDeltaLon; + } } if(maxDeltaAlt < 1.0) { maxDeltaAlt = 1.0; } - - // Normalize ground coordinates - for (auto & lon: lonNorm) - { - lon /= maxDeltaLon; - } - for (auto & lat: latNorm) - { - lat /= maxDeltaLat; - } - for (auto & alt: altNorm) + else { - alt /= maxDeltaAlt; + for (auto & alt: altNorm) + { + alt /= maxDeltaAlt; + } } - std::vector colCoeffs; + std::vector colCoeffs; computeCoefficients(colNorm, lonNorm, latNorm, altNorm, colCoeffs); - std::vector lineCoeffs; + std::vector lineCoeffs; computeCoefficients(lineNorm, lonNorm, latNorm, altNorm, lineCoeffs); // Offsets @@ -367,12 +370,22 @@ void RPCSolver::Solve(const GCPsContainerType& gcpContainer, double& rmsError, P // Sample numerator coefficients std::copy(colCoeffs.begin(), colCoeffs.begin() +20, outputParams.SampleNum); // Sample denominator coefficients - outputParams.SampleDen[0] = 1.; + outputParams.SampleDen[0] = 1.; std::copy(colCoeffs.begin()+20, colCoeffs.end(), outputParams.SampleDen +1); - // TODO instantiate a model a compute error on input tie points - rmsError = std::numeric_limits::max(); + // Compute rmse between input ground point and transformed image points + GDALRPCTransformer transformer(outputParams, false); + + PrecisionType rmseAcc = 0.; + + for (const auto & gcp : gcpContainer) + { + auto outPoint = transformer.InverseTransform(gcp.second); + rmseAcc += (gcp.first[0] - outPoint[0]) * (gcp.first[0] - outPoint[0]) + + (gcp.first[1] - outPoint[1]) * (gcp.first[1] - outPoint[1]); + } + rmsError = std::sqrt(rmseAcc)/numberOfPoints; } } \ No newline at end of file diff --git a/Modules/Filtering/Projection/test/CMakeLists.txt b/Modules/Filtering/Projection/test/CMakeLists.txt index 0ff1a36bdd..7a7998b8d3 100644 --- a/Modules/Filtering/Projection/test/CMakeLists.txt +++ b/Modules/Filtering/Projection/test/CMakeLists.txt @@ -583,7 +583,7 @@ otb_add_test(NAME prTvLeastSquareAffineTransformEstimator COMMAND otbProjectionT ) -otb_add_test(NAME uaTvRPCSolverNoDEMValidationTest COMMAND otbProjectionTestDriver +otb_add_test(NAME prTvRPCSolverNoDEMValidationTest COMMAND otbProjectionTestDriver otbRPCSolverTest LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF} 10 0.25 0.35 @@ -591,7 +591,7 @@ otb_add_test(NAME uaTvRPCSolverNoDEMValidationTest COMMAND otbProjectionTestDriv no ) -otb_add_test(NAME uaTvRPCSolverNotEnoughPointsForElevationTest COMMAND otbProjectionTestDriver +otb_add_test(NAME prTvRPCSolverNotEnoughPointsForElevationTest COMMAND otbProjectionTestDriver otbRPCSolverTest LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF} 5 0.25 0.35 @@ -599,7 +599,7 @@ otb_add_test(NAME uaTvRPCSolverNotEnoughPointsForElevationTest COMMAND otbProjec no ) -otb_add_test(NAME uaTvRPCSolverNotEnoughPointsTest COMMAND otbProjectionTestDriver +otb_add_test(NAME prTvRPCSolverNotEnoughPointsTest COMMAND otbProjectionTestDriver otbRPCSolverTest LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF} 4 0.25 0.35 @@ -607,7 +607,7 @@ otb_add_test(NAME uaTvRPCSolverNotEnoughPointsTest COMMAND otbProjectionTestDriv ${INPUTDATA}/DEM/egm96.grd ) if (OTB_DATA_USE_LARGEINPUT) - set_property(TEST uaTvRPCSolverNotEnoughPointsTest PROPERTY WILL_FAIL TRUE) + set_property(TEST prTvRPCSolverNotEnoughPointsTest PROPERTY WILL_FAIL TRUE) endif() -- GitLab From 7d24cd4057411f91130cd08324897bcdab851319 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Mon, 25 Jan 2021 14:53:21 +0100 Subject: [PATCH 095/123] REFAC: use otb::RPCSolver instead of Ossim in GCPsToRPCSensorModelImageFilter --- ...SensorModelImageFilterWithoutDEMOutput.txt | 132 +----------------- .../otbGCPsToRPCSensorModelImageFilter.h | 7 +- .../otbGCPsToRPCSensorModelImageFilter.hxx | 53 +++---- ...otbPhysicalToRPCSensorModelImageFilter.hxx | 5 +- ...RPCSensorModelImageFilterCheckRpcModel.cxx | 38 ++--- ...sToRPCSensorModelImageFilterWithoutDEM.cxx | 4 +- 6 files changed, 43 insertions(+), 196 deletions(-) diff --git a/Data/Baseline/OTB/Files/otbGCPsToRPCSensorModelImageFilterWithoutDEMOutput.txt b/Data/Baseline/OTB/Files/otbGCPsToRPCSensorModelImageFilterWithoutDEMOutput.txt index 7761f86a7b..69e6a3f6dd 100644 --- a/Data/Baseline/OTB/Files/otbGCPsToRPCSensorModelImageFilterWithoutDEMOutput.txt +++ b/Data/Baseline/OTB/Files/otbGCPsToRPCSensorModelImageFilterWithoutDEMOutput.txt @@ -1,130 +1,2 @@ - Ossim Keyword list: - adjustment_0.adj_param_0.center: 0 -adjustment_0.adj_param_0.description: intrack_offset -adjustment_0.adj_param_0.lock_flag: 0 -adjustment_0.adj_param_0.parameter: 0 -adjustment_0.adj_param_0.sigma: 50 -adjustment_0.adj_param_0.units: pixel -adjustment_0.adj_param_1.center: 0 -adjustment_0.adj_param_1.description: crtrack_offset -adjustment_0.adj_param_1.lock_flag: 0 -adjustment_0.adj_param_1.parameter: 0 -adjustment_0.adj_param_1.sigma: 50 -adjustment_0.adj_param_1.units: pixel -adjustment_0.adj_param_2.center: 0 -adjustment_0.adj_param_2.description: intrack_scale -adjustment_0.adj_param_2.lock_flag: 0 -adjustment_0.adj_param_2.parameter: 0 -adjustment_0.adj_param_2.sigma: 50 -adjustment_0.adj_param_2.units: unknown -adjustment_0.adj_param_3.center: 0 -adjustment_0.adj_param_3.description: crtrack_scale -adjustment_0.adj_param_3.lock_flag: 0 -adjustment_0.adj_param_3.parameter: 0 -adjustment_0.adj_param_3.sigma: 50 -adjustment_0.adj_param_3.units: unknown -adjustment_0.adj_param_4.center: 0 -adjustment_0.adj_param_4.description: map_rotation -adjustment_0.adj_param_4.lock_flag: 0 -adjustment_0.adj_param_4.parameter: 0 -adjustment_0.adj_param_4.sigma: 0.1 -adjustment_0.adj_param_4.units: degrees -adjustment_0.description: Initial adjustment -adjustment_0.dirty_flag: 0 -adjustment_0.number_of_params: 5 -current_adjustment: 0 -height_off: 0 -height_scale: 4.5035996273705e+15 -lat_off: 43.608891 -lat_scale: 1 -line_den_coeff_0: 1 -line_den_coeff_1: 0.116647929191405 -line_den_coeff_10: 0 -line_den_coeff_11: 4.24205291306071e-06 -line_den_coeff_12: -1.22170433593066e-05 -line_den_coeff_13: 0 -line_den_coeff_14: -1.62292152211888e-05 -line_den_coeff_15: -1.11751035274519e-05 -line_den_coeff_16: 0 -line_den_coeff_17: 0 -line_den_coeff_18: 0 -line_den_coeff_19: 0 -line_den_coeff_2: -0.795796952135346 -line_den_coeff_3: 0 -line_den_coeff_4: -0.00176250458824308 -line_den_coeff_5: 0 -line_den_coeff_6: 0 -line_den_coeff_7: -0.69205662487881 -line_den_coeff_8: -0.725158534735126 -line_den_coeff_9: 0 -line_num_coeff_0: 0.00176507025129761 -line_num_coeff_1: 0.469825903760047 -line_num_coeff_10: 0 -line_num_coeff_11: 4.1371912315397e-05 -line_num_coeff_12: -2.66115593034605e-05 -line_num_coeff_13: 0 -line_num_coeff_14: -0.00378322572708931 -line_num_coeff_15: -0.00397219871280679 -line_num_coeff_16: 0 -line_num_coeff_17: 0 -line_num_coeff_18: 0 -line_num_coeff_19: 0 -line_num_coeff_2: -182.988749105524 -line_num_coeff_3: 1.00711799423683e-14 -line_num_coeff_4: 0.000167599353017481 -line_num_coeff_5: 4.23534328933673e-23 -line_num_coeff_6: 0 -line_num_coeff_7: -0.000132255684215101 -line_num_coeff_8: -0.00299521983182487 -line_num_coeff_9: 0 -line_off: 2224.5 -line_scale: 225.5 -long_off: 1.4252414 -long_scale: 1 -number_of_adjustments: 1 -polynomial_format: B -samp_den_coeff_0: 1 -samp_den_coeff_1: -0.0140652497583194 -samp_den_coeff_10: 0 -samp_den_coeff_11: -2.11567008497461e-07 -samp_den_coeff_12: -2.52699758468156e-06 -samp_den_coeff_13: 0 -samp_den_coeff_14: 1.28729228360665e-06 -samp_den_coeff_15: 7.0821267053196e-06 -samp_den_coeff_16: 0 -samp_den_coeff_17: 0 -samp_den_coeff_18: 0 -samp_den_coeff_19: 0 -samp_den_coeff_2: 0.056111938809245 -samp_den_coeff_3: 0 -samp_den_coeff_4: -0.00165427540398437 -samp_den_coeff_5: 0 -samp_den_coeff_6: 0 -samp_den_coeff_7: -0.720295418717795 -samp_den_coeff_8: -0.238046475331491 -samp_den_coeff_9: 0 -samp_num_coeff_0: -4.03022891014623e-05 -samp_num_coeff_1: 140.122696755472 -samp_num_coeff_10: 0 -samp_num_coeff_11: 0.00514045286544423 -samp_num_coeff_12: 0.00169871244049508 -samp_num_coeff_13: 0 -samp_num_coeff_14: 3.04771969411287e-06 -samp_num_coeff_15: 3.0597489842213e-05 -samp_num_coeff_16: 0 -samp_num_coeff_17: 0 -samp_num_coeff_18: 0 -samp_num_coeff_19: 0 -samp_num_coeff_2: 0.720548641464637 -samp_num_coeff_3: 1.72815049746881e-14 -samp_num_coeff_4: -0.000307017880169014 -samp_num_coeff_5: -1.67843825237436e-25 -samp_num_coeff_6: 0 -samp_num_coeff_7: 7.0629169037717e-05 -samp_num_coeff_8: 0.000393857191344697 -samp_num_coeff_9: 0 -samp_off: 2224.5 -samp_scale: 225.5 -type: ossimRpcProjection - -Residual ground error: 1.2432282311 +{"LineOffset": "2224.5", "SampleOffset": "2224.5", "LatOffset": "43.6089", "LonOffset": "1.42524", "HeightOffset": "0", "LineScale": "225.5", "SampleScale": "225.5", "LatScale": "1", "LonScale": "1", "HeightScale": "1", "LineNum": [ "0.00174891", "0.469879", "-182.989", "-4.38776e-15", "0.000183514", "3.26103e-23", "1.88011e-36", "-0.000133312", "-0.00295522", "0", "0", "4.13724e-05", "-2.66117e-05", "0", "-0.0037833", "-0.00397229", "0", "0", "0", "0", ], "LineDen": [ "1", "0.119555", "-0.788492", "0", "-0.00176245", "0", "0", "-0.69207", "-0.725175", "0", "0", "4.36024e-06", "-1.21576e-05", "0", "-1.60709e-05", "-1.09766e-05", "0", "0", "0", "0", ], "SampleNum": [ "-4.02927e-05", "140.123", "0.720552", "-6.37125e-15", "-0.000306972", "3.63979e-25", "7.44761e-39", "7.06041e-05", "0.000393491", "0", "0", "0.0051405", "0.00169872", "0", "3.04758e-06", "3.05976e-05", "0", "0", "0", "0", ], "SampleDen": [ "1", "-0.0140619", "0.0561058", "0", "-0.00165426", "0", "0", "-0.720302", "-0.238048", "0", "0", "-2.11371e-07", "-2.52599e-06", "0", "1.28711e-06", "7.08205e-06", "0", "0", "0", "0", ], } +Residual ground error: 0.1243213845 diff --git a/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.h b/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.h index eb167b2fa4..993063ba96 100644 --- a/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.h +++ b/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.h @@ -140,9 +140,6 @@ public: /** Set the GCP container */ void SetGCPsContainer(const GCPsContainerType& container); - /** Get Keywordlist */ - itkGetConstReferenceMacro(Keywordlist, ImageKeywordlist); - /** Add a GCP to the GCPContainer. This version of the AddGCP method * accepts a 3D ground point and does not use DEM or MeanElevation * to handle the elevation */ @@ -205,8 +202,8 @@ private: /** Container of GCPs */ GCPsContainerType m_GCPsContainer; - /** Keywordlist */ - ImageKeywordlist m_Keywordlist; + /** ImageMetadata */ + ImageMetadata m_ImageMetadata; /** Flag to see if model is up-to-date */ mutable bool m_ModelUpToDate; diff --git a/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.hxx b/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.hxx index 7199a52d93..75ab2ab087 100644 --- a/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.hxx +++ b/Modules/Filtering/Projection/include/otbGCPsToRPCSensorModelImageFilter.hxx @@ -219,17 +219,12 @@ void GCPsToRPCSensorModelImageFilter::LoadImageGCPs() template void GCPsToRPCSensorModelImageFilter::ComputeErrors() { - typedef GenericRSTransform RSTransformType; + using RSTransformType = GenericRSTransform; RSTransformType::Pointer rsTransform = RSTransformType::New(); - rsTransform->SetInputImageMetadata(&(this->GetOutput()->GetImageMetadata())); - rsTransform->InstantiateTransform(); - - ContinuousIndexType idFix, idOut; - Continuous3DIndexType idOut3D, idTrans3D; + rsTransform->SetInputImageMetadata(&m_ImageMetadata); - Point2DType sensorPoint; - Point3DType groundPoint; + rsTransform->InstantiateTransform(); double sum = 0.; m_MeanError = 0.; @@ -240,30 +235,22 @@ void GCPsToRPCSensorModelImageFilter::ComputeErrors() for (unsigned int i = 0; i < m_GCPsContainer.size(); ++i) { // GCP value - sensorPoint = m_GCPsContainer[i].first; - groundPoint = m_GCPsContainer[i].second; + const auto & sensorPoint = m_GCPsContainer[i].first; + const auto & groundPoint = m_GCPsContainer[i].second; // Compute Transform Point3DType groundPointTemp, sensorPointTemp; sensorPointTemp[0] = sensorPoint[0]; sensorPointTemp[1] = sensorPoint[1]; - sensorPointTemp[2] = groundPoint[2]; - - groundPointTemp = rsTransform->TransformPoint(sensorPointTemp); - // Compute Euclidian distance - idFix[0] = sensorPoint[0]; - idFix[1] = sensorPoint[1]; + auto outPoint = rsTransform->TransformPoint(sensorPoint); - idOut3D[0] = groundPoint[0]; - idOut3D[1] = groundPoint[1]; - idOut3D[2] = groundPoint[2]; + Point2DType groundPoint2D; - idTrans3D[0] = groundPointTemp[0]; - idTrans3D[1] = groundPointTemp[1]; - idTrans3D[2] = groundPointTemp[2]; + groundPoint2D[0] = groundPoint[0]; + groundPoint2D[1] = groundPoint[1]; - double error = idOut3D.EuclideanDistanceTo(idTrans3D); + double error = outPoint.EuclideanDistanceTo(outPoint); // Add error to the container m_ErrorsContainer.push_back(error); @@ -282,30 +269,28 @@ void GCPsToRPCSensorModelImageFilter::GenerateOutputInformation() Superclass::GenerateOutputInformation(); // First, retrieve the image pointer - typename TImage::Pointer imagePtr = this->GetOutput(); + auto imagePtr = this->GetOutput(); if (!m_ModelUpToDate) { - double rmsError; - ImageKeywordlist otb_kwl; - otb::RPCSolverAdapter::Solve(m_GCPsContainer, rmsError, otb_kwl); + double rmsError; + + Projection::RPCParam rpcParams; + otb::RPCSolver::Solve(m_GCPsContainer, rmsError, rpcParams); // Retrieve the residual ground error m_RMSGroundError = rmsError; + m_ImageMetadata = imagePtr->GetImageMetadata(); + m_ImageMetadata.Add(MDGeom::RPC, rpcParams); + // Compute errors this->ComputeErrors(); - m_Keywordlist = otb_kwl; - m_ModelUpToDate = true; } - // Update image keywordlist. We need to do it at each stream - // because it will be overwritten by up-stream - // GenerateOutputInformation() calls. - itk::MetaDataDictionary& dict = imagePtr->GetMetaDataDictionary(); - itk::EncapsulateMetaData(dict, MetaDataKey::OSSIMKeywordlistKey, m_Keywordlist); + imagePtr->SetImageMetadata(m_ImageMetadata); } template diff --git a/Modules/Filtering/Projection/include/otbPhysicalToRPCSensorModelImageFilter.hxx b/Modules/Filtering/Projection/include/otbPhysicalToRPCSensorModelImageFilter.hxx index b2237b444f..07535bf781 100644 --- a/Modules/Filtering/Projection/include/otbPhysicalToRPCSensorModelImageFilter.hxx +++ b/Modules/Filtering/Projection/include/otbPhysicalToRPCSensorModelImageFilter.hxx @@ -91,9 +91,8 @@ void PhysicalToRPCSensorModelImageFilter::GenerateOutputInformation() otbGenericMsgDebugMacro(<< "RPC model estimated. RMS ground error: " << m_GCPsToSensorModelFilter->GetRMSGroundError() << ", Mean error: " << m_GCPsToSensorModelFilter->GetMeanError()); - // Encapsulate the keywordlist - itk::MetaDataDictionary& dict = this->GetOutput()->GetMetaDataDictionary(); - itk::EncapsulateMetaData(dict, MetaDataKey::OSSIMKeywordlistKey, m_GCPsToSensorModelFilter->GetKeywordlist()); + + this->GetOutput()->SetImageMetadata(m_GCPsToSensorModelFilter->GetOutput()->GetImageMetadata()); // put the flag to true m_OutputInformationGenerated = true; diff --git a/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx index 494f74df63..1cf120dbf0 100644 --- a/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx +++ b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx @@ -37,9 +37,14 @@ int otbGCPsToRPCSensorModelImageFilterCheckRpcModel(int argc, char* argv[]) nbPoints--; // last argument in not a gcp pairs point tol = stoi(s_tol.substr(s_tol.find("=") + 1)); } + + // Set the DEM Directory + if (std::string(argv[2]).compare("no_output") != 0) + { + otb::DEMHandler::GetInstance().OpenDEMDirectory(argv[2]); + } + // Check if the number of gcp pairs point is consistent - - if (nbPoints % 5 != 0) { std::cerr << "Inconsistent GCPs description!" << std::endl; @@ -51,7 +56,7 @@ int otbGCPsToRPCSensorModelImageFilterCheckRpcModel(int argc, char* argv[]) typedef otb::GCPsToRPCSensorModelImageFilter GCPsToSensorModelFilterType; typedef GCPsToSensorModelFilterType::Point2DType Point2DType; typedef GCPsToSensorModelFilterType::Point3DType Point3DType; - typedef otb::GenericRSTransform GenericRSTransformType; + typedef otb::GenericRSTransform GenericRSTransformType; typedef otb::GeographicalDistance GeoDistanceType; ReaderType::Pointer reader = ReaderType::New(); @@ -90,15 +95,8 @@ int otbGCPsToRPCSensorModelImageFilterCheckRpcModel(int argc, char* argv[]) // geographical coordinates. GenericRSTransformType::Pointer grsTrasnform = GenericRSTransformType::New(); - //TODO OSSIM:Update GCPsToRPCSensorModelImageFilter so it uses ImageMetdata instead of KeywordList - //grsTrasnform->SetInputKeywordList(rpcEstimator->GetKeywordlist()); - otbLogMacro(Debug, << rpcEstimator->GetKeywordlist()); + grsTrasnform->SetInputImageMetadata(&rpcEstimator->GetOutput()->GetImageMetadata()); grsTrasnform->SetOutputProjectionRef("EPSG:4326"); - - // Set the DEM Directory - if (std::string(argv[2]).compare("no_output") != 0) - otb::DEMHandler::GetInstance().OpenDEMDirectory(argv[2]); - grsTrasnform->InstantiateTransform(); // Test @@ -107,17 +105,11 @@ int otbGCPsToRPCSensorModelImageFilterCheckRpcModel(int argc, char* argv[]) for (unsigned int gcpId = 0; gcpId < nbGCPs; ++gcpId) { - Point3DType point; + Point2DType point; point[0] = std::stof(argv[3 + gcpId * 5]); point[1] = std::stof(argv[4 + gcpId * 5]); - point[2] = std::stof(argv[7 + gcpId * 5]); - - Point3DType transformedPoint; - transformedPoint = grsTrasnform->TransformPoint(point); - Point2DType transformedPoint2D; - transformedPoint2D[0] = transformedPoint[0]; - transformedPoint2D[1] = transformedPoint[1]; + auto transformedPoint = grsTrasnform->TransformPoint(point); // reference point Point2DType geoPoint; @@ -125,18 +117,18 @@ int otbGCPsToRPCSensorModelImageFilterCheckRpcModel(int argc, char* argv[]) geoPoint[1] = std::stof(argv[6 + gcpId * 5]); // Search for nans - if (vnl_math_isnan(transformedPoint2D[0]) || vnl_math_isnan(transformedPoint2D[1])) + if (vnl_math_isnan(transformedPoint[0]) || vnl_math_isnan(transformedPoint[1])) { - otbLogMacro(Warning, << "Reference : " << geoPoint << " --> Result of the reprojection using the estimated RpcModel " << transformedPoint2D); + otbLogMacro(Warning, << "Reference : " << geoPoint << " --> Result of the reprojection using the estimated RpcModel " << transformedPoint); otbLogMacro(Warning, << "The result of the projection is nan, there is a problem with the estimated RpcModel"); isErrorDetected = true; } // Search for wrong projection results - double residual = geoDistance->Evaluate(geoPoint, transformedPoint2D); + double residual = geoDistance->Evaluate(geoPoint, transformedPoint); if (residual > tol) { - otbLogMacro(Warning, << "Reference : " << geoPoint << " --> Result of the reprojection using the estimated RpcModel " << transformedPoint2D << std::endl + otbLogMacro(Warning, << "Reference : " << geoPoint << " --> Result of the reprojection using the estimated RpcModel " << transformedPoint << std::endl << " Residual [" << residual << "] is higher than the tolerance [" << tol << "], there is a problem with the estimated RpcModel"); isErrorDetected = true; } diff --git a/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterWithoutDEM.cxx b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterWithoutDEM.cxx index 4320d792e7..b2bce33a3c 100644 --- a/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterWithoutDEM.cxx +++ b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterWithoutDEM.cxx @@ -80,7 +80,9 @@ int otbGCPsToRPCSensorModelImageFilterWithoutDEM(int argc, char* argv[]) ofs.setf(std::ios::fixed, std::ios::floatfield); ofs.precision(10); - ofs << rpcEstimator->GetOutput()->GetImageKeywordlist() << std::endl; + auto outputRPC = boost::any_cast(rpcEstimator->GetOutput()->GetImageMetadata()[otb::MDGeom::RPC]); + + ofs << outputRPC.ToJSON() << std::endl; ofs << "Residual ground error: " << rpcEstimator->GetRMSGroundError() << std::endl; ofs.close(); -- GitLab From 4b48ea30951adbc61e577f90608b8b783138384b Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Tue, 26 Jan 2021 10:25:44 +0100 Subject: [PATCH 096/123] TEST: Regenerate the baseline for the new tests GDALRPCTransformer2 --- Data/Input/QB/qb-1.gcp2 | 866 +----------------- Data/Input/ikonos/ikonos-1.gcp2 | 866 +----------------- Data/Input/pleiades/pleiades-1.gcp2 | 866 +----------------- Data/Input/spot6/spot6-1.gcp2 | 866 +----------------- Data/Input/wv2/wv2-1.gcp2 | 866 +----------------- Modules/IO/IOGDAL/test/CMakeLists.txt | 20 +- .../test/otbGDALRPCTransformerTest2.cxx | 37 +- 7 files changed, 33 insertions(+), 4354 deletions(-) diff --git a/Data/Input/QB/qb-1.gcp2 b/Data/Input/QB/qb-1.gcp2 index 06eda3e686..1fe3edbef7 100644 --- a/Data/Input/QB/qb-1.gcp2 +++ b/Data/Input/QB/qb-1.gcp2 @@ -1,901 +1,37 @@ -#From file /work/scratch/osmanj/otb_valid/qb-1.geom -0 0 1.3541065878393608 43.654566906071395 242.0 -10 0 1.3541860246729207 43.65456711611387 242.0 -20 0 1.3542654614960283 43.65456732608195 242.0 -30 0 1.354344898308687 43.654567535975644 242.0 -40 0 1.3544243351108998 43.65456774579495 242.0 -50 0 1.35450377190267 43.65456795553987 242.0 -60 0 1.354583208684001 43.6545681652104 242.0 -70 0 1.3546626454548958 43.654568374806544 242.0 -80 0 1.354742082215358 43.654568584328295 242.0 -90 0 1.3548215189653905 43.65456879377566 242.0 -100 0 1.3549009557049965 43.65456900314864 242.0 -110 0 1.3549803924341797 43.65456921244723 242.0 -120 0 1.3550598291529428 43.654569421671425 242.0 -130 0 1.3551392658612895 43.654569630821236 242.0 -140 0 1.3552187025592226 43.65456983989666 242.0 -150 0 1.3552981392467458 43.654570048897696 242.0 -160 0 1.355377575923862 43.654570257824346 242.0 -170 0 1.3554570125905745 43.6545704666766 242.0 -180 0 1.3555364492468867 43.65457067545447 242.0 -190 0 1.3556158858928018 43.654570884157955 242.0 -200 0 1.3556953225283228 43.65457109278705 242.0 -210 0 1.3557747591534532 43.65457130134176 242.0 -220 0 1.3558541957681964 43.65457150982208 242.0 -230 0 1.3559336323725553 43.65457171822801 242.0 -240 0 1.356013068966533 43.654571926559555 242.0 -250 0 1.3560925055501334 43.65457213481671 242.0 -260 0 1.3561719421233591 43.65457234299948 242.0 -270 0 1.3562513786862136 43.65457255110786 242.0 -280 0 1.3563308152387001 43.65457275914185 242.0 -290 0 1.356410251780822 43.65457296710146 242.0 -0 10 1.354107024641273 43.654506008612195 242.0 +# column row longitude latitude elevation 10 10 1.3541864611935914 43.65450621864526 242.0 -20 10 1.3542658977354693 43.65450642860394 242.0 -30 10 1.3543453342669098 43.65450663848823 242.0 -40 10 1.3544247707879162 43.65450684829813 242.0 -50 10 1.354504207298492 43.654507058033644 242.0 60 10 1.35458364379864 43.654507267694775 242.0 -70 10 1.3546630802883637 43.65450747728151 242.0 -80 10 1.3547425167676663 43.65450768679387 242.0 -90 10 1.3548219532365513 43.654507896231834 242.0 -100 10 1.3549013896950213 43.65450810559542 242.0 110 10 1.35498082614308 43.65450831488461 242.0 -120 10 1.3550602625807309 43.65450852409941 242.0 -130 10 1.3551396990079765 43.65450873323983 242.0 -140 10 1.3552191354248206 43.65450894230586 242.0 -150 10 1.3552985718312665 43.65450915129751 242.0 160 10 1.355378008227317 43.65450936021477 242.0 -170 10 1.3554574446129757 43.65450956905764 242.0 -180 10 1.3555368809882455 43.65450977782612 242.0 -190 10 1.3556163173531302 43.65450998652022 242.0 -200 10 1.3556957537076324 43.65451019513992 242.0 210 10 1.3557751900517558 43.654510403685244 242.0 -220 10 1.3558546263855036 43.65451061215618 242.0 -230 10 1.355934062708879 43.65451082055273 242.0 -240 10 1.3560134990218848 43.65451102887489 242.0 -250 10 1.356092935324525 43.65451123712267 242.0 260 10 1.3561723716168024 43.65451144529606 242.0 -270 10 1.3562518078987202 43.65451165339506 242.0 -280 10 1.356331244170282 43.65451186141968 242.0 -290 10 1.3564106804314906 43.65451206936991 242.0 -0 20 1.3541074615794975 43.654445111580536 242.0 -10 20 1.3541868978505829 43.65444532160419 242.0 -20 20 1.3542663341112395 43.65444553155347 242.0 -30 20 1.3543457703614705 43.654445741428354 242.0 -40 20 1.3544252066012792 43.65444595122886 242.0 -50 20 1.3545046428306686 43.654446160954976 242.0 -60 20 1.3545840790496424 43.654446370606706 242.0 -70 20 1.3546635152582036 43.65444658018404 242.0 -80 20 1.3547429514563551 43.654446789687 242.0 -90 20 1.3548223876441008 43.65444699911558 242.0 -100 20 1.3549018238214434 43.65444720846976 242.0 -110 20 1.3549812599883866 43.65444741774956 242.0 -120 20 1.3550606961449332 43.654447626954976 242.0 -130 20 1.3551401322910865 43.654447836086 242.0 -140 20 1.3552195684268502 43.654448045142644 242.0 -150 20 1.355299004552227 43.654448254124894 242.0 -160 20 1.3553784406672205 43.654448463032764 242.0 -170 20 1.3554578767718337 43.65444867186625 242.0 -180 20 1.3555373128660702 43.65444888062535 242.0 -190 20 1.3556167489499327 43.65444908931006 242.0 -200 20 1.3556961850234248 43.65444929792039 242.0 -210 20 1.3557756210865497 43.65444950645633 242.0 -220 20 1.3558550571393106 43.65444971491789 242.0 -230 20 1.3559344931817108 43.65444992330506 242.0 -240 20 1.3560139292137536 43.65445013161784 242.0 -250 20 1.356093365235442 43.65445033985624 242.0 -260 20 1.3561728012467795 43.65445054802025 242.0 -270 20 1.3562522372477692 43.65445075610988 242.0 -280 20 1.3563316732384143 43.654450964125125 242.0 -290 20 1.3564111092187183 43.654451172065976 242.0 -0 30 1.3541078986540156 43.654384214976105 242.0 -10 30 1.3541873346438766 43.65438442499037 242.0 -20 30 1.3542667706233205 43.65438463493024 242.0 -30 30 1.3543462065923504 43.65438484479573 242.0 -40 30 1.3544256425509698 43.65438505458683 242.0 -50 30 1.354505078499182 43.65438526430355 242.0 -60 30 1.3545845144369897 43.65438547394589 242.0 -70 30 1.3546639503643967 43.65438568351383 242.0 -80 30 1.354743386281406 43.654385893007394 242.0 -90 30 1.354822822188021 43.65438610242658 242.0 -100 30 1.3549022580842447 43.65438631177137 242.0 -110 30 1.3549816939700805 43.65438652104178 242.0 -120 30 1.3550611298455315 43.6543867302378 242.0 -130 30 1.3551405657106013 43.65438693935944 242.0 -140 30 1.3552200015652929 43.6543871484067 242.0 -150 30 1.3552994374096092 43.65438735737957 242.0 -160 30 1.355378873243554 43.654387566278054 242.0 -170 30 1.3554583090671306 43.65438777510215 242.0 -180 30 1.3555377448803416 43.65438798385187 242.0 -190 30 1.355617180683191 43.6543881925272 242.0 -200 30 1.3556966164756812 43.654388401128145 242.0 -210 30 1.3557760522578162 43.65438860965471 242.0 -220 30 1.355855488029599 43.65438881810689 242.0 -230 30 1.3559349237910325 43.65438902648468 242.0 -240 30 1.3560143595421204 43.65438923478809 242.0 -250 30 1.3560937952828658 43.654389443017116 242.0 -260 30 1.356173231013272 43.654389651171755 242.0 -270 30 1.3562526667333419 43.654389859252014 242.0 -280 30 1.3563321024430792 43.654390067257886 242.0 -290 30 1.356411538142487 43.65439027518937 242.0 -0 40 1.3541083358648092 43.65432331879862 242.0 -10 40 1.3541877715734543 43.65432352880348 242.0 -20 40 1.354267207271694 43.65432373873396 242.0 -30 40 1.3543466429595314 43.65432394859005 242.0 -40 40 1.35442607863697 43.65432415837176 242.0 -50 40 1.354505514304013 43.65432436807908 242.0 -60 40 1.3545849499606635 43.65432457771202 242.0 -70 40 1.354664385606925 43.654324787270575 242.0 -80 40 1.3547438212428002 43.65432499675475 242.0 -90 40 1.354823256868293 43.65432520616454 242.0 -100 40 1.3549026924834064 43.65432541549995 242.0 -110 40 1.3549821280881436 43.654325624760965 242.0 -120 40 1.3550615636825076 43.6543258339476 242.0 -130 40 1.355140999266502 43.65432604305986 242.0 -140 40 1.35522043484013 43.65432625209773 242.0 -150 40 1.3552998704033947 43.65432646106122 242.0 -160 40 1.3553793059562995 43.65432666995032 242.0 -170 40 1.3554587414988475 43.65432687876504 242.0 -180 40 1.3555381770310422 43.65432708750538 242.0 -190 40 1.3556176125528863 43.65432729617133 242.0 -200 40 1.3556970480643835 43.654327504762904 242.0 -210 40 1.355776483565537 43.65432771328009 242.0 -220 40 1.35585591905635 43.654327921722896 242.0 -230 40 1.3559353545368256 43.654328130091315 242.0 -240 40 1.3560147900069672 43.65432833838535 242.0 -250 40 1.356094225466778 43.654328546605 242.0 -260 40 1.3561736609162613 43.654328754750274 242.0 -270 40 1.3562530963554202 43.65432896282116 242.0 -280 40 1.356332531784258 43.65432917081767 242.0 -290 40 1.3564119672027781 43.65432937873979 242.0 -0 50 1.3541087732118597 43.65426242304777 242.0 -10 50 1.3541882086392973 43.65426263304323 242.0 -20 50 1.3542676440563413 43.654262842964314 242.0 -30 50 1.3543470794629948 43.65426305281101 242.0 -40 50 1.3544265148592611 43.65426326258333 242.0 -50 50 1.3545059502451438 43.654263472281265 242.0 -60 50 1.3545853856206453 43.654263681904816 242.0 -70 50 1.3546648209857697 43.65426389145398 242.0 -80 50 1.3547442563405199 43.65426410092876 242.0 -90 50 1.3548236916848988 43.65426431032917 242.0 -100 50 1.3549031270189102 43.654264519655186 242.0 -110 50 1.3549825623425573 43.654264728906824 242.0 -120 50 1.355061997655843 43.65426493808408 242.0 -130 50 1.3551414329587708 43.654265147186955 242.0 -140 50 1.3552208682513436 43.65426535621544 242.0 -150 50 1.3553003035335651 43.65426556516955 242.0 -160 50 1.3553797388054383 43.65426577404928 242.0 -170 50 1.3554591740669664 43.65426598285462 242.0 -180 50 1.3555386093181527 43.65426619158558 242.0 -190 50 1.3556180445590007 43.65426640024216 242.0 -200 50 1.3556974797895132 43.65426660882435 242.0 -210 50 1.3557769150096937 43.654266817332164 242.0 -220 50 1.3558563502195455 43.6542670257656 242.0 -230 50 1.3559357854190717 43.654267234124646 242.0 -240 50 1.3560152206082754 43.654267442409314 242.0 -250 50 1.3560946557871603 43.6542676506196 242.0 -260 50 1.3561740909557292 43.6542678587555 242.0 -270 50 1.3562535261139854 43.654268066817025 242.0 -280 50 1.3563329612619324 43.65426827480417 242.0 -290 50 1.3564123963995733 43.65426848271692 242.0 -0 60 1.354109210695149 43.65420152772325 242.0 10 60 1.3541886458413877 43.65420173770933 242.0 -20 60 1.3542680809772445 43.65420194762102 242.0 -30 60 1.3543475161027225 43.65420215745832 242.0 -40 60 1.354426951217825 43.65420236722125 242.0 -50 60 1.3545063863225555 43.654202576909796 242.0 60 60 1.354585821416917 43.65420278652396 242.0 -70 60 1.3546652565009127 43.65420299606374 242.0 -80 60 1.354744691574546 43.65420320552914 242.0 -90 60 1.35482412663782 43.65420341492016 242.0 -100 60 1.3549035616907381 43.6542036242368 242.0 110 60 1.3549829967333034 43.65420383347905 242.0 -120 60 1.355062431765519 43.65420404264693 242.0 -130 60 1.3551418667873887 43.654204251740424 242.0 -140 60 1.355221301798915 43.65420446075954 242.0 -150 60 1.3553007368001018 43.654204669704264 242.0 160 60 1.355380171790952 43.65420487857462 242.0 -170 60 1.3554596067714688 43.654205087370585 242.0 -180 60 1.3555390417416555 43.65420529609217 242.0 -190 60 1.3556184767015156 43.65420550473937 242.0 -200 60 1.355697911651052 43.6542057133122 242.0 210 60 1.355777346590268 43.65420592181064 242.0 -220 60 1.355856781519167 43.654206130234705 242.0 -230 60 1.3559362164377522 43.65420633858439 242.0 -240 60 1.3560156513460269 43.65420654685969 242.0 -250 60 1.356095086243994 43.65420675506061 242.0 260 60 1.3561745211316572 43.65420696318715 242.0 -270 60 1.3562539560090194 43.65420717123931 242.0 -280 60 1.356333390876084 43.654207379217084 242.0 -290 60 1.3564128257328543 43.65420758712048 242.0 -0 70 1.3541096483146584 43.654140632824785 242.0 -10 70 1.3541890831797068 43.65414084280146 242.0 -20 70 1.3542685180343847 43.654141052703764 242.0 -30 70 1.354347952878696 43.65414126253168 242.0 -40 70 1.3544273877126434 43.654141472285225 242.0 -50 70 1.3545068225362302 43.65414168196438 242.0 -60 70 1.35458625734946 43.65414189156916 242.0 -70 70 1.3546656921523357 43.65414210109956 242.0 -80 70 1.3547451269448607 43.65414231055558 242.0 -90 70 1.354824561727038 43.65414251993722 242.0 -100 70 1.3549039964988712 43.65414272924448 242.0 -110 70 1.3549834312603632 43.65414293847736 242.0 -120 70 1.3550628660115176 43.65414314763585 242.0 -130 70 1.3551423007523375 43.65414335671997 242.0 -140 70 1.355221735482826 43.654143565729704 242.0 -150 70 1.3553011702029865 43.65414377466506 242.0 -160 70 1.355380604912822 43.65414398352604 242.0 -170 70 1.355460039612336 43.654144192312636 242.0 -180 70 1.3555394743015319 43.65414440102485 242.0 -190 70 1.3556189089804125 43.65414460966269 242.0 -200 70 1.3556983436489813 43.65414481822614 242.0 -210 70 1.3557777783072413 43.65414502671522 242.0 -220 70 1.3558572129551962 43.65414523512992 242.0 -230 70 1.355936647592849 43.654145443470235 242.0 -240 70 1.3560160822202028 43.65414565173617 242.0 -250 70 1.356095516837261 43.65414585992773 242.0 -260 70 1.3561749514440269 43.65414606804491 242.0 -270 70 1.3562543860405036 43.65414627608771 242.0 -280 70 1.3563338206266944 43.65414648405613 242.0 -290 70 1.3564132552026025 43.65414669195016 242.0 -0 80 1.3541100860703696 43.654079738352046 242.0 -10 80 1.354189520654236 43.65407994831934 242.0 -20 80 1.354268955227744 43.65408015821226 242.0 -30 80 1.3543483897908968 43.65408036803079 242.0 -40 80 1.3544278243436976 43.65408057777495 242.0 -50 80 1.3545072588861495 43.65408078744473 242.0 -60 80 1.354586693418256 43.654080997040126 242.0 -70 80 1.35466612794002 43.654081206561145 242.0 -80 80 1.3547455624514453 43.654081416007784 242.0 -90 80 1.3548249969525346 43.654081625380044 242.0 -100 80 1.3549044314432914 43.654081834677925 242.0 -110 80 1.354983865923719 43.654082043901425 242.0 -120 80 1.3550633003938204 43.65408225305055 242.0 -130 80 1.355142734853599 43.654082462125295 242.0 -140 80 1.355222169303058 43.65408267112566 242.0 -150 80 1.3553016037422008 43.65408288005164 242.0 -160 80 1.3553810381710303 43.65408308890325 242.0 -170 80 1.35546047258955 43.65408329768048 242.0 -180 80 1.3555399069977632 43.65408350638333 242.0 -190 80 1.355619341395673 43.654083715011794 242.0 -200 80 1.3556987757832828 43.654083923565885 242.0 -210 80 1.3557782101605955 43.654084132045604 242.0 -220 80 1.3558576445276147 43.654084340450936 242.0 -230 80 1.3559370788843434 43.65408454878189 242.0 -240 80 1.356016513230785 43.65408475703847 242.0 -250 80 1.3560959475669427 43.65408496522066 242.0 -260 80 1.3561753818928197 43.65408517332848 242.0 -270 80 1.3562548162084194 43.654085381361924 242.0 -280 80 1.3563342505137448 43.654085589320985 242.0 -290 80 1.3564136848087993 43.654085797205674 242.0 -0 90 1.3541105239622646 43.65401884430476 242.0 -10 90 1.3541899582649575 43.65401905426267 242.0 -20 90 1.354269392557304 43.6540192641462 242.0 -30 90 1.3543488268393067 43.65401947395535 242.0 -40 90 1.3544282611109693 43.65401968369013 242.0 -50 90 1.3545076953722948 43.65401989335052 242.0 -60 90 1.3545871296232865 43.65402010293654 242.0 -70 90 1.3546665638639477 43.65402031244819 242.0 -80 90 1.3547459980942815 43.65402052188545 242.0 -90 90 1.3548254323142912 43.65402073124834 242.0 -100 90 1.3549048665239802 43.65402094053684 242.0 -110 90 1.3549843007233517 43.65402114975097 242.0 -120 90 1.3550637349124086 43.65402135889072 242.0 -130 90 1.3551431690911546 43.65402156795609 242.0 -140 90 1.3552226032595929 43.65402177694709 242.0 -150 90 1.3553020374177263 43.65402198586371 242.0 -160 90 1.3553814715655583 43.65402219470595 242.0 -170 90 1.3554609057030924 43.65402240347381 242.0 -180 90 1.3555403398303314 43.654022612167296 242.0 -190 90 1.3556197739472788 43.6540228207864 242.0 -200 90 1.355699208053938 43.65402302933113 242.0 -210 90 1.355778642150312 43.65402323780148 242.0 -220 90 1.3558580762364039 43.654023446197456 242.0 -230 90 1.3559375103122173 43.65402365451905 242.0 -240 90 1.3560169443777552 43.65402386276627 242.0 -250 90 1.3560963784330209 43.654024070939116 242.0 -260 90 1.3561758124780177 43.65402427903758 242.0 -270 90 1.3562552465127489 43.65402448706166 242.0 -280 90 1.3563346805372174 43.65402469501137 242.0 -290 90 1.3564141145514268 43.654024902886704 242.0 -0 100 1.3541109619903244 43.65395795068261 242.0 -10 100 1.3541903960118526 43.653958160631134 242.0 -20 100 1.354269830023046 43.653958370505286 242.0 -30 100 1.3543492640239074 43.653958580305066 242.0 -40 100 1.3544286980144402 43.653958790030465 242.0 -50 100 1.3545081319946477 43.653958999681485 242.0 -60 100 1.3545875659645332 43.653959209258126 242.0 -70 100 1.3546669999241 43.653959418760394 242.0 -80 100 1.354746433873351 43.65395962818828 242.0 -90 100 1.3548258678122898 43.6539598375418 242.0 -100 100 1.3549053017409194 43.653960046820934 242.0 -110 100 1.3549847356592433 43.65396025602569 242.0 -120 100 1.3550641695672643 43.653960465156075 242.0 -130 100 1.3551436034649862 43.65396067421208 242.0 -140 100 1.355223037352412 43.65396088319371 242.0 -150 100 1.3553024712295445 43.653961092100964 242.0 -160 100 1.3553819050963878 43.65396130093384 242.0 -170 100 1.3554613389529444 43.65396150969234 242.0 -180 100 1.3555407727992181 43.65396171837646 242.0 -190 100 1.3556202066352117 43.653961926986206 242.0 -200 100 1.3556996404609287 43.653962135521574 242.0 -210 100 1.3557790742763722 43.65396234398257 242.0 -220 100 1.3558585080815455 43.65396255236919 242.0 -230 100 1.355937941876452 43.65396276068143 242.0 -240 100 1.3560173756610947 43.65396296891929 242.0 -250 100 1.356096809435477 43.65396317708278 242.0 -260 100 1.356176243199602 43.65396338517189 242.0 -270 100 1.356255676953473 43.653963593186624 242.0 -280 100 1.3563351106970933 43.653963801126984 242.0 -290 100 1.3564145444304663 43.653964008992965 242.0 -0 110 1.3541114001545311 43.65389705748531 242.0 10 110 1.3541908338949031 43.653897267424455 242.0 -20 110 1.3542702676249516 43.653897477289235 242.0 -30 110 1.3543497013446801 43.65389768707963 242.0 -40 110 1.354429135054092 43.653897896795655 242.0 -50 110 1.3545085687531901 43.6538981064373 242.0 60 110 1.3545880024419779 43.65389831600457 242.0 -70 110 1.3546674361204585 43.65389852549747 242.0 -80 110 1.3547468697886353 43.653898734915984 242.0 -90 110 1.3548263034465116 43.65389894426013 242.0 -100 110 1.3549057370940905 43.6538991535299 242.0 110 110 1.3549851707313751 43.65389936272529 242.0 -120 110 1.355064604358369 43.65389957184631 242.0 -130 110 1.355144037975075 43.65389978089295 242.0 -140 110 1.3552234715814968 43.65389998986522 242.0 -150 110 1.3553029051776373 43.653900198763104 242.0 160 110 1.3553823387635 43.65390040758662 242.0 -170 110 1.355461772339088 43.65390061633576 242.0 -180 110 1.3555412059044047 43.653900825010524 242.0 -190 110 1.355620639459453 43.653901033610914 242.0 -200 110 1.3557000730042363 43.653901242136925 242.0 210 110 1.3557795065387581 43.65390145058856 242.0 -220 110 1.3558589400630212 43.65390165896583 242.0 -230 110 1.3559383735770294 43.653901867268715 242.0 -240 110 1.3560178070807853 43.65390207549723 242.0 -250 110 1.3560972405742926 43.65390228365136 242.0 260 110 1.3561766740575545 43.653902491731124 242.0 -270 110 1.356256107530574 43.65390269973651 242.0 -280 110 1.3563355409933544 43.65390290766752 242.0 -290 110 1.3564149744458993 43.65390311552416 242.0 -0 120 1.3541118384548663 43.65383616471255 242.0 -10 120 1.3541912719140903 43.653836374642324 242.0 -20 120 1.354270705363003 43.653836584497725 242.0 -30 120 1.354350138801607 43.65383679427875 242.0 -40 120 1.3544295722299062 43.6538370039854 242.0 -50 120 1.3545090056479034 43.65383721361768 242.0 -60 120 1.354588439055602 43.65383742317558 242.0 -70 120 1.3546678724530052 43.65383763265911 242.0 -80 120 1.3547473058401163 43.65383784206826 242.0 -90 120 1.3548267392169384 43.65383805140304 242.0 -100 120 1.354906172583475 43.65383826066344 242.0 -110 120 1.3549856059397292 43.65383846984947 242.0 -120 120 1.355065039285704 43.65383867896112 242.0 -130 120 1.355144472621403 43.653838887998404 242.0 -140 120 1.3552239059468294 43.65383909696131 242.0 -150 120 1.3553033392619864 43.65383930584984 242.0 -160 120 1.355382772566877 43.653839514664 242.0 -170 120 1.3554622058615047 43.65383972340378 242.0 -180 120 1.3555416391458728 43.65383993206919 242.0 -190 120 1.3556210724199844 43.65384014066022 242.0 -200 120 1.3557005056838427 43.65384034917688 242.0 -210 120 1.355779938937451 43.65384055761917 242.0 -220 120 1.3558593721808128 43.65384076598708 242.0 -230 120 1.3559388054139307 43.65384097428061 242.0 -240 120 1.3560182386368087 43.653841182499775 242.0 -250 120 1.3560976718494495 43.653841390644565 242.0 -260 120 1.3561771050518565 43.65384159871498 242.0 -270 120 1.356256538244033 43.65384180671102 242.0 -280 120 1.3563359714259824 43.65384201463269 242.0 -290 120 1.3564154045977075 43.65384222247998 242.0 -0 130 1.3541122768913114 43.653775272364044 242.0 -10 130 1.3541917100693963 43.65377548228445 242.0 -20 130 1.3542711432371812 43.65377569213048 242.0 -30 130 1.3543505763946695 43.65377590190214 242.0 -40 130 1.3544300095418644 43.65377611159941 242.0 -50 130 1.3545094426787694 43.653776321222324 242.0 -60 130 1.3545888758053872 43.65377653077086 242.0 -70 130 1.3546683089217215 43.65377674024502 242.0 -80 130 1.3547477420277754 43.65377694964481 242.0 -90 130 1.3548271751235519 43.65377715897022 242.0 -100 130 1.3549066082090546 43.65377736822126 242.0 -110 130 1.3549860412842867 43.65377757739793 242.0 -120 130 1.3550654743492514 43.65377778650023 242.0 -130 130 1.3551449074039517 43.653777995528145 242.0 -140 130 1.3552243404483912 43.653778204481696 242.0 -150 130 1.3553037734825728 43.65377841336087 242.0 -160 130 1.3553832065065001 43.65377862216567 242.0 -170 130 1.355462639520176 43.6537788308961 242.0 -180 130 1.3555420725236043 43.653779039552155 242.0 -190 130 1.3556215055167875 43.65377924813384 242.0 -200 130 1.3557009384997294 43.653779456641146 242.0 -210 130 1.3557803714724328 43.65377966507408 242.0 -220 130 1.3558598044349013 43.65377987343264 242.0 -230 130 1.355939237387138 43.65378008171683 242.0 -240 130 1.3560186703291461 43.65378028992665 242.0 -250 130 1.3560981032609292 43.65378049806209 242.0 -260 130 1.35617753618249 43.653780706123165 242.0 -270 130 1.356256969093832 43.653780914109866 242.0 -280 130 1.3563364019949584 43.65378112202219 242.0 -290 130 1.3564158348858726 43.65378132986014 242.0 -0 140 1.3541127154638484 43.653714380439496 242.0 -10 140 1.3541921483608024 43.653714590350525 242.0 -20 140 1.3542715812474682 43.65371480018719 242.0 -30 140 1.354351014123849 43.65371500994948 242.0 -40 140 1.3544304469899486 43.65371521963739 242.0 -50 140 1.3545098798457693 43.65371542925094 242.0 -60 140 1.354589312691315 43.65371563879011 242.0 -70 140 1.354668745526589 43.653715848254905 242.0 -80 140 1.354748178351594 43.65371605764533 242.0 -90 140 1.3548276111663338 43.65371626696139 242.0 -100 140 1.354907043970811 43.653716476203066 242.0 -110 140 1.3549864767650297 43.65371668537038 242.0 -120 140 1.3550659095489923 43.653716894463315 242.0 -130 140 1.3551453423227027 43.65371710348188 242.0 -140 140 1.3552247750861637 43.653717312426075 242.0 -150 140 1.3553042078393789 43.653717521295896 242.0 -160 140 1.3553836405823512 43.653717730091344 242.0 -170 140 1.3554630733150839 43.65371793881242 242.0 -180 140 1.3555425060375805 43.653718147459124 242.0 -190 140 1.355621938749844 43.65371835603146 242.0 -200 140 1.3557013714518777 43.65371856452942 242.0 -210 140 1.355780804143685 43.653718772953006 242.0 -220 140 1.3558602368252688 43.65371898130223 242.0 -230 140 1.3559396694966326 43.653719189577075 242.0 -240 140 1.3560191021577797 43.65371939777754 242.0 -250 140 1.3560985348087131 43.653719605903646 242.0 -260 140 1.3561779674494363 43.65371981395538 242.0 -270 140 1.3562574000799523 43.653720021932735 242.0 -280 140 1.3563368327002645 43.65372022983572 242.0 -290 140 1.3564162653103762 43.65372043766434 242.0 -0 150 1.3541131541724585 43.6536534889386 242.0 -10 150 1.3541925867882902 43.653653698840266 242.0 -20 150 1.3542720193938456 43.65365390866756 242.0 -30 150 1.3543514519891278 43.653654118420484 242.0 -40 150 1.35443088457414 43.65365432809904 242.0 -50 150 1.3545103171488855 43.65365453770322 242.0 -60 150 1.3545897497133674 43.65365474723303 242.0 -70 150 1.3546691822675894 43.65365495668847 242.0 -80 150 1.3547486148115542 43.653655166069534 242.0 -90 150 1.3548280473452654 43.65365537537623 242.0 -100 150 1.354907479868726 43.65365558460856 242.0 -110 150 1.3549869123819394 43.65365579376651 242.0 -120 150 1.355066344884909 43.65365600285009 242.0 -130 150 1.3551457773776376 43.65365621185931 242.0 -140 150 1.3552252098601287 43.65365642079415 242.0 -150 150 1.3553046423323856 43.65365662965462 242.0 -160 150 1.3553840747944115 43.65365683844072 242.0 -170 150 1.3554635072462096 43.65365704715245 242.0 -180 150 1.3555429396877832 43.6536572557898 242.0 -190 150 1.3556223721191354 43.65365746435279 242.0 -200 150 1.3557018045402696 43.653657672841405 242.0 -210 150 1.355781236951189 43.653657881255654 242.0 -220 150 1.3558606693518966 43.65365808959553 242.0 -230 150 1.3559401017423962 43.65365829786103 242.0 -240 150 1.3560195341226906 43.65365850605217 242.0 -250 150 1.3560989664927832 43.65365871416893 242.0 -260 150 1.356178398852677 43.65365892221132 242.0 -270 150 1.3562578312023756 43.65365913017934 242.0 -280 150 1.356337263541882 43.65365933807299 242.0 -290 150 1.3564166958711996 43.653659545892275 242.0 -0 160 1.3541135930171238 43.65359259786106 242.0 10 160 1.3541930253518417 43.65359280775336 242.0 -20 160 1.3542724576762948 43.653593017571296 242.0 -30 160 1.3543518899904867 43.65359322731486 242.0 -40 160 1.3544313222944202 43.65359343698405 242.0 -50 160 1.3545107545880988 43.65359364657887 242.0 60 160 1.3545901868715258 43.65359385609933 242.0 -70 160 1.354669619144704 43.653594065545406 242.0 -80 160 1.3547490514076372 43.65359427491712 242.0 -90 160 1.3548284836603286 43.65359448421446 242.0 -100 160 1.3549079159027808 43.653594693437434 242.0 110 160 1.3549873481349979 43.653594902586036 242.0 -120 160 1.3550667803569825 43.653595111660266 242.0 -130 160 1.355146212568738 43.65359532066013 242.0 -140 160 1.3552256447702677 43.65359552958562 242.0 -150 160 1.355305076961575 43.65359573843674 242.0 160 160 1.3553845091426628 43.653595947213496 242.0 -170 160 1.3554639413135348 43.65359615591588 242.0 -180 160 1.355543373474194 43.653596364543894 242.0 -190 160 1.3556228056246433 43.65359657309754 242.0 -200 160 1.3557022377648866 43.653596781576816 242.0 210 160 1.3557816698949265 43.653596989981715 242.0 -220 160 1.3558611020147668 43.653597198312255 242.0 -230 160 1.3559405341244104 43.653597406568416 242.0 -240 160 1.3560199662238606 43.65359761475021 242.0 -250 160 1.3560993983131207 43.65359782285764 242.0 260 160 1.356178830392194 43.6535980308907 242.0 -270 160 1.3562582624610835 43.65359823884938 242.0 -280 160 1.3563376945197927 43.6535984467337 242.0 -290 160 1.3564171265683247 43.65359865454365 242.0 -0 170 1.3541140319978255 43.65353170720658 242.0 -10 170 1.3541934640514381 43.65353191708952 242.0 -20 170 1.3542728960947978 43.6535321268981 242.0 -30 170 1.3543523281279077 43.6535323366323 242.0 -40 170 1.3544317601507712 43.65353254629214 242.0 -50 170 1.3545111921633914 43.653532755877606 242.0 -60 170 1.3545906241657717 43.6535329653887 242.0 -70 170 1.3546700561579152 43.65353317482543 242.0 -80 170 1.3547494881398252 43.65353338418779 242.0 -90 170 1.354828920111505 43.65353359347578 242.0 -100 170 1.3549083520729575 43.6535338026894 242.0 -110 170 1.3549877840241864 43.653534011828654 242.0 -120 170 1.3550672159651946 43.65353422089353 242.0 -130 170 1.3551466478959855 43.653534429884054 242.0 -140 170 1.3552260798165625 43.653534638800195 242.0 -150 170 1.3553055117269286 43.65353484764198 242.0 -160 170 1.355384943627087 43.65353505640939 242.0 -170 170 1.3554643755170412 43.65353526510243 242.0 -180 170 1.3555438073967945 43.6535354737211 242.0 -190 170 1.3556232392663496 43.6535356822654 242.0 -200 170 1.3557026711257103 43.653535890735334 242.0 -210 170 1.3557821029748796 43.6535360991309 242.0 -220 170 1.3558615348138605 43.6535363074521 242.0 -230 170 1.3559409666426567 43.65353651569893 242.0 -240 170 1.3560203984612713 43.6535367238714 242.0 -250 170 1.3560998302697076 43.653536931969484 242.0 -260 170 1.3561792620679687 43.65353713999321 242.0 -270 170 1.3562586938560577 43.65353734794257 242.0 -280 170 1.3563381256339782 43.65353755581756 242.0 -290 170 1.3564175574017332 43.653537763618175 242.0 -0 180 1.3541144711145456 43.653470816974874 242.0 -10 180 1.3541939028870613 43.65347102684846 242.0 -20 180 1.354273334649336 43.653471236647675 242.0 -30 180 1.3543527664013728 43.65347144637252 242.0 -40 180 1.3544321981431746 43.653471656023 242.0 -50 180 1.354511629874745 43.653471865599116 242.0 -60 180 1.354591061596087 43.65347207510086 242.0 -70 180 1.354670493307204 43.653472284528235 242.0 -80 180 1.3547499250080992 43.653472493881246 242.0 -90 180 1.354829356698776 43.653472703159885 242.0 -100 180 1.3549087883792372 43.65347291236416 242.0 -110 180 1.3549882200494867 43.653473121494066 242.0 -120 180 1.355067651709527 43.65347333054961 242.0 -130 180 1.355147083359362 43.65347353953078 242.0 -140 180 1.3552265149989946 43.653473748437584 242.0 -150 180 1.3553059466284278 43.653473957270016 242.0 -160 180 1.3553853782476655 43.65347416602808 242.0 -170 180 1.3554648098567106 43.653474374711784 242.0 -180 180 1.355544241455566 43.65347458332112 242.0 -190 180 1.3556236730442357 43.653474791856084 242.0 -200 180 1.3557031046227221 43.65347500031669 242.0 -210 180 1.3557825361910292 43.653475208702915 242.0 -220 180 1.3558619677491597 43.65347541701478 242.0 -230 180 1.355941399297117 43.65347562525228 242.0 -240 180 1.3560208308349044 43.653475833415406 242.0 -250 180 1.3561002623625253 43.65347604150417 242.0 -260 180 1.3561796938799826 43.65347624951857 242.0 -270 180 1.3562591253872798 43.653476457458595 242.0 -280 180 1.35633855688442 43.653476665324256 242.0 -290 180 1.3564179883714065 43.65347687311555 242.0 -0 190 1.3541149103672654 43.65340992716563 242.0 -10 190 1.3541943418586933 43.65341013702986 242.0 -20 190 1.3542737733398913 43.653410346819726 242.0 -30 190 1.354353204810863 43.65341055653522 242.0 -40 190 1.354432636271612 43.65341076617635 242.0 -50 190 1.3545120677221407 43.65341097574311 242.0 -60 190 1.3545914991624532 43.653411185235505 242.0 -70 190 1.3546709305925524 43.65341139465353 242.0 -80 190 1.3547503620124413 43.6534116039972 242.0 -90 190 1.3548297934221234 43.653411813266494 242.0 -100 190 1.3549092248216021 43.653412022461424 242.0 -110 190 1.3549886562108804 43.65341223158198 242.0 -120 190 1.3550680875899614 43.65341244062818 242.0 -130 190 1.3551475189588489 43.653412649600014 242.0 -140 190 1.3552269503175456 43.653412858497475 242.0 -150 190 1.3553063816660549 43.65341306732057 242.0 -160 190 1.35538581300438 43.6534132760693 242.0 -170 190 1.3554652443325244 43.653413484743666 242.0 -180 190 1.355544675650491 43.653413693343666 242.0 -190 190 1.355624106958283 43.6534139018693 242.0 -200 190 1.3557035382559042 43.65341411032056 242.0 -210 190 1.3557829695433574 43.653414318697465 242.0 -220 190 1.3558624008206457 43.653414526999995 242.0 -230 190 1.3559418320877727 43.65341473522816 242.0 -240 190 1.3560212633447415 43.65341494338196 242.0 -250 190 1.3561006945915555 43.6534151514614 242.0 -260 190 1.3561801258282176 43.65341535946647 242.0 -270 190 1.3562595570547313 43.65341556739717 242.0 -280 190 1.3563389882710997 43.65341577525351 242.0 -290 190 1.356418419477326 43.65341598303548 242.0 -0 200 1.354115349755967 43.65334903777856 242.0 -10 200 1.3541947809663148 43.65334924763344 242.0 -20 200 1.354274212166445 43.65334945741395 242.0 -30 200 1.3543536433563605 43.6533496671201 242.0 -40 200 1.3544330745360647 43.653349876751875 242.0 -50 200 1.3545125057055607 43.653350086309295 242.0 -60 200 1.354591936864852 43.65335029579234 242.0 -70 200 1.3546713680139417 43.653350505201026 242.0 -80 200 1.354750799152833 43.65335071453534 242.0 -90 200 1.3548302302815292 43.653350923795294 242.0 -100 200 1.3549096614000335 43.65335113298089 242.0 -110 200 1.3549890925083492 43.65335134209211 242.0 -120 200 1.3550685236064797 43.653351551128964 242.0 -130 200 1.3551479546944278 43.653351760091454 242.0 -140 200 1.355227385772197 43.65335196897958 242.0 -150 200 1.3553068168397908 43.653352177793344 242.0 -160 200 1.355386247897212 43.65335238653274 242.0 -170 200 1.3554656789444641 43.65335259519777 242.0 -180 200 1.3555451099815503 43.65335280378844 242.0 -190 200 1.3556245410084737 43.653353012304734 242.0 -200 200 1.3557039720252377 43.65335322074667 242.0 -210 200 1.3557834030318456 43.65335342911424 242.0 -220 200 1.3558628340283003 43.65335363740745 242.0 -230 200 1.3559422650146056 43.653353845626285 242.0 -240 200 1.3560216959907643 43.65335405377076 242.0 -250 200 1.3561011269567798 43.653354261840875 242.0 -260 200 1.3561805579126551 43.65335446983662 242.0 -270 200 1.3562599888583937 43.653354677757996 242.0 -280 200 1.356339419793999 43.65335488560501 242.0 -290 200 1.3564188507194739 43.65335509337767 242.0 -0 210 1.354115789280632 43.653288148813374 242.0 10 210 1.3541952202099083 43.6532883586589 242.0 -20 210 1.354274651128979 43.653288568430064 242.0 -30 210 1.3543540820378466 43.653288778126864 242.0 -40 210 1.3544335129365146 43.6532889877493 242.0 -50 210 1.3545129438249863 43.65328919729737 242.0 60 210 1.3545923747032649 43.65328940677107 242.0 -70 210 1.3546718055713536 43.65328961617041 242.0 -80 210 1.3547512364292558 43.65328982549539 242.0 -90 210 1.3548306672769745 43.65329003474601 242.0 -100 210 1.354910098114513 43.65329024392225 242.0 110 210 1.3549895289418747 43.653290453024134 242.0 -120 210 1.3550689597590628 43.65329066205166 242.0 -130 210 1.3551483905660804 43.65329087100481 242.0 -140 210 1.355227821362931 43.65329107988361 242.0 -150 210 1.3553072521496174 43.65329128868803 242.0 160 210 1.3553866829261432 43.653291497418095 242.0 -170 210 1.3554661136925115 43.653291706073794 242.0 -180 210 1.3555455444487259 43.653291914655135 242.0 -190 210 1.3556249751947889 43.6532921231621 242.0 -200 210 1.3557044059307044 43.65329233159471 242.0 210 210 1.3557838366564754 43.65329253995296 242.0 -220 210 1.3558632673721052 43.65329274823684 242.0 -230 210 1.355942698077597 43.65329295644636 242.0 -240 210 1.3560221287729541 43.653293164581505 242.0 -250 210 1.3561015594581796 43.653293372642295 242.0 260 210 1.3561809901332769 43.65329358062872 242.0 -270 210 1.3562604207982492 43.65329378854078 242.0 -280 210 1.3563398514530995 43.65329399637848 242.0 -290 210 1.3564192820978314 43.653294204141815 242.0 -0 220 1.3541162289412414 43.65322726026976 242.0 -10 220 1.3541956595894553 43.653227470105946 242.0 -20 220 1.3542750902274747 43.65322767986776 242.0 -30 220 1.3543545208553032 43.65322788955522 242.0 -40 220 1.3544339514729435 43.65322809916831 242.0 -50 220 1.3545133820803994 43.653228308707035 242.0 -60 220 1.3545928126776738 43.6532285181714 242.0 -70 220 1.3546722432647702 43.653228727561405 242.0 -80 220 1.3547516738416916 43.65322893687704 242.0 -90 220 1.3548311044084413 43.65322914611832 242.0 -100 220 1.3549105349650226 43.653229355285234 242.0 -110 220 1.3549899655114388 43.65322956437778 242.0 -120 220 1.355069396047693 43.65322977339597 242.0 -130 220 1.3551488265737883 43.653229982339795 242.0 -140 220 1.3552282570897285 43.65323019120925 242.0 -150 220 1.3553076875955163 43.65323040000435 242.0 -160 220 1.3553871180911552 43.65323060872508 242.0 -170 220 1.3554665485766484 43.65323081737146 242.0 -180 220 1.355545979051999 43.65323102594347 242.0 -190 220 1.3556254095172107 43.653231234441115 242.0 -200 220 1.355704839972286 43.653231442864396 242.0 -210 220 1.3557842704172287 43.65323165121332 242.0 -220 220 1.355863700852042 43.653231859487875 242.0 -230 220 1.3559431312767287 43.65323206768807 242.0 -240 220 1.3560225616912926 43.653232275813906 242.0 -250 220 1.356101992095737 43.653232483865374 242.0 -260 220 1.3561814224900643 43.65323269184248 242.0 -270 220 1.3562608528742788 43.65323289974523 242.0 -280 220 1.3563402832483828 43.653233107573605 242.0 -290 220 1.3564197136123803 43.653233315327626 242.0 -0 230 1.3541166687377777 43.65316637214744 242.0 -10 230 1.3541960991049373 43.653166581974276 242.0 -20 230 1.3542755294619142 43.653166791726754 242.0 -30 230 1.3543549598087117 43.65316700140487 242.0 -40 230 1.354434390145333 43.65316721100862 242.0 -50 230 1.3545138204717815 43.65316742053801 242.0 -60 230 1.3545932507880603 43.653167629993035 242.0 -70 230 1.3546726810941725 43.6531678393737 242.0 -80 230 1.3547521113901217 43.65316804868001 242.0 -90 230 1.354831541675911 43.65316825791194 242.0 -100 230 1.3549109719515435 43.65316846706953 242.0 -110 230 1.3549904022170227 43.653168676152745 242.0 -120 230 1.3550698324723516 43.6531688851616 242.0 -130 230 1.3551492627175334 43.65316909409609 242.0 -140 230 1.3552286929525716 43.65316930295623 242.0 -150 230 1.3553081231774693 43.653169511742 242.0 -160 230 1.3553875533922297 43.653169720453405 242.0 -170 230 1.3554669835968562 43.65316992909045 242.0 -180 230 1.355546413791352 43.653170137653134 242.0 -190 230 1.3556258439757203 43.65317034614146 242.0 -200 230 1.3557052741499642 43.65317055455542 242.0 -210 230 1.355784704314087 43.65317076289502 242.0 -220 230 1.355864134468092 43.653170971160264 242.0 -230 230 1.3559435646119826 43.65317117935114 242.0 -240 230 1.3560229947457618 43.65317138746766 242.0 -250 230 1.356102424869433 43.65317159550981 242.0 -260 230 1.3561818549829994 43.653171803477605 242.0 -270 230 1.3562612850864642 43.65317201137103 242.0 -280 230 1.3563407151798306 43.653172219190104 242.0 -290 230 1.356420145263102 43.65317242693481 242.0 -0 240 1.3541171086702222 43.65310548444611 242.0 -10 240 1.354196538756336 43.6531056942636 242.0 -20 240 1.3542759688322787 43.65310590400674 242.0 -30 240 1.354355398898054 43.65310611367552 242.0 -40 240 1.3544348289536645 43.65310632326993 242.0 -50 240 1.3545142589991142 43.653106532789984 242.0 -60 240 1.3545936890344057 43.65310674223568 242.0 -70 240 1.3546731190595427 43.65310695160701 242.0 -80 240 1.354752549074528 43.65310716090398 242.0 -90 240 1.3548319790793655 43.65310737012659 242.0 -100 240 1.3549114090740577 43.65310757927484 242.0 -110 240 1.3549908390586083 43.65310778834873 242.0 -120 240 1.3550702690330203 43.65310799734826 242.0 -130 240 1.355149698997297 43.65310820627342 242.0 -140 240 1.355229128951442 43.65310841512423 242.0 -150 240 1.3553085588954579 43.65310862390068 242.0 -160 240 1.3553879888293485 43.65310883260276 242.0 -170 240 1.3554674187531168 43.653109041230486 242.0 -180 240 1.355546848666766 43.65310924978385 242.0 -190 240 1.3556262785702995 43.653109458262854 242.0 -200 240 1.3557057084637203 43.6531096666675 242.0 -210 240 1.3557851383470318 43.65310987499778 242.0 -220 240 1.3558645682202373 43.65311008325371 242.0 -230 240 1.35594399808334 43.65311029143527 242.0 -240 240 1.356023427936343 43.65311049954247 242.0 -250 240 1.3561028577792498 43.65311070757531 242.0 -260 240 1.3561822876120635 43.65311091553379 242.0 -270 240 1.3562617174347873 43.65311112341791 242.0 -280 240 1.3563411472474245 43.65311133122767 242.0 -290 240 1.3564205770499782 43.653111538963074 242.0 -0 250 1.3541175487385564 43.65304459716547 242.0 -10 250 1.3541969785436327 43.65304480697363 242.0 -20 250 1.3542764083385501 43.65304501670743 242.0 -30 250 1.3543558381233114 43.65304522636687 242.0 -40 250 1.3544352678979201 43.65304543595195 242.0 -50 250 1.3545146976623792 43.653045645462676 242.0 -60 250 1.3545941274166922 43.653045854899034 242.0 -70 250 1.3546735571608621 43.653046064261034 242.0 -80 250 1.3547529868948924 43.653046273548675 242.0 -90 250 1.3548324166187862 43.65304648276196 242.0 -100 250 1.3549118463325467 43.65304669190088 242.0 -110 250 1.354991276036177 43.65304690096544 242.0 -120 250 1.355070705729681 43.65304710995565 242.0 -130 250 1.355150135413061 43.653047318871494 242.0 -140 250 1.3552295650863209 43.65304752771298 242.0 -150 250 1.3553089947494639 43.6530477364801 242.0 -160 250 1.355388424402493 43.653047945172865 242.0 -170 250 1.3554678540454115 43.65304815379127 242.0 -180 250 1.3555472836782227 43.65304836233532 242.0 -190 250 1.3556267133009299 43.653048570805005 242.0 -200 250 1.3557061429135362 43.65304877920033 242.0 -210 250 1.3557855725160448 43.6530489875213 242.0 -220 250 1.3558650021084593 43.653049195767906 242.0 -230 250 1.3559444316907825 43.65304940394016 242.0 -240 250 1.356023861263018 43.653049612038046 242.0 -250 250 1.356103290825169 43.65304982006158 242.0 -260 250 1.3561827203772383 43.65305002801075 242.0 -270 250 1.3562621499192296 43.653050235885566 242.0 -280 250 1.356341579451146 43.65305044368602 242.0 -290 250 1.3564210089729907 43.653050651412116 242.0 -0 260 1.3541179889427621 43.652983710305236 242.0 10 260 1.35419741846681 43.65298392010406 242.0 -20 260 1.3542768479807101 43.652984129828525 242.0 -30 260 1.354356277484466 43.652984339478635 242.0 -40 260 1.354435706978081 43.65298454905439 242.0 -50 260 1.3545151364615582 43.652984758555775 242.0 60 260 1.354594565934901 43.65298496798281 242.0 -70 260 1.3546739953981126 43.65298517733548 242.0 -80 260 1.354753424851196 43.6529853866138 242.0 -90 260 1.3548328542941548 43.65298559581775 242.0 -100 260 1.354912283726992 43.652985804947356 242.0 110 260 1.354991713149711 43.65298601400259 242.0 -120 260 1.3550711425623148 43.65298622298347 242.0 -130 260 1.355150571964807 43.65298643189 242.0 -140 260 1.3552300013571905 43.65298664072216 242.0 -150 260 1.3553094307394686 43.652986849479966 242.0 160 260 1.3553888601116448 43.65298705816341 242.0 -170 260 1.355468289473722 43.652987266772506 242.0 -180 260 1.3555477188257037 43.652987475307235 242.0 -190 260 1.3556271481675932 43.652987683767606 242.0 -200 260 1.3557065774993935 43.652987892153625 242.0 210 260 1.3557860068211078 43.65298810046528 242.0 -220 260 1.3558654361327396 43.652988308702575 242.0 -230 260 1.355944865434292 43.65298851686552 242.0 -240 260 1.3560242947257684 43.6529887249541 242.0 -250 260 1.3561037240071716 43.65298893296832 242.0 260 260 1.3561831532785054 43.65298914090819 242.0 -270 260 1.3562625825397727 43.652989348773694 242.0 -280 260 1.3563420117909768 43.65298955656485 242.0 -290 260 1.356421441032121 43.65298976428164 242.0 -0 270 1.3541184292828212 43.652922823865104 242.0 -10 270 1.3541978585258485 43.6529230336546 242.0 -20 270 1.3542772877587401 43.65292324336974 242.0 -30 270 1.3543567169814992 43.652923453010516 242.0 -40 270 1.3544361461941292 43.65292366257694 242.0 -50 270 1.354515575396633 43.652923872069 242.0 -60 270 1.354595004589014 43.65292408148671 242.0 -70 270 1.3546744337712755 43.65292429083006 242.0 -80 270 1.3547538629434208 43.65292450009905 242.0 -90 270 1.3548332921054531 43.652924709293686 242.0 -100 270 1.3549127212573755 43.65292491841396 242.0 -110 270 1.3549921503991913 43.65292512745988 242.0 -120 270 1.3550715795309038 43.652925336431444 242.0 -130 270 1.3551510086525163 43.65292554532865 242.0 -140 270 1.355230437764032 43.6529257541515 242.0 -150 270 1.355309866865454 43.652925962899985 242.0 -160 270 1.3553892959567857 43.652926171574116 242.0 -170 270 1.3554687250380302 43.652926380173895 242.0 -180 270 1.355548154109191 43.65292658869931 242.0 -190 270 1.355627583170271 43.65292679715037 242.0 -200 270 1.3557070122212738 43.652927005527076 242.0 -210 270 1.3557864412622023 43.65292721382943 242.0 -220 270 1.35586587029306 43.65292742205742 242.0 -230 270 1.3559452993138499 43.65292763021105 242.0 -240 270 1.3560247283245757 43.652927838290324 242.0 -250 270 1.35610415732524 43.652928046295244 242.0 -260 270 1.3561835863158465 43.65292825422581 242.0 -270 270 1.3562630152963981 43.652928462082016 242.0 -280 270 1.3563424442668985 43.65292866986386 242.0 -290 270 1.3564218732273507 43.652928877571355 242.0 -0 280 1.354118869758715 43.65286193784479 242.0 -10 280 1.3541982987207306 43.65286214762496 242.0 -20 280 1.3542777276726221 43.65286235733077 242.0 -30 280 1.3543571566143928 43.65286256696222 242.0 -40 280 1.354436585546046 43.652862776519314 242.0 -50 280 1.354516014467585 43.652862986002056 242.0 -60 280 1.3545954433790128 43.65286319541044 242.0 -70 280 1.354674872280333 43.652863404744465 242.0 -80 280 1.3547543011715484 43.65286361400414 242.0 -90 280 1.3548337300526627 43.65286382318945 242.0 -100 280 1.3549131589236787 43.65286403230041 242.0 -110 280 1.3549925877846 43.652864241337014 242.0 -120 280 1.3550720166354298 43.652864450299255 242.0 -130 280 1.355151445476171 43.652864659187145 242.0 -140 280 1.3552308743068273 43.652864868000684 242.0 -150 280 1.3553103031274016 43.65286507673986 242.0 -160 280 1.3553897319378974 43.65286528540468 242.0 -170 280 1.3554691607383176 43.652865493995144 242.0 -180 280 1.3555485895286659 43.65286570251126 242.0 -190 280 1.355628018308945 43.65286591095301 242.0 -200 280 1.3557074470791588 43.65286611932041 242.0 -210 280 1.35578687583931 43.652866327613445 242.0 -220 280 1.355866304589402 43.65286653583213 242.0 -230 280 1.355945733329438 43.65286674397646 242.0 -240 280 1.3560251620594215 43.65286695204644 242.0 -250 280 1.3561045907793554 43.65286716004206 242.0 -260 280 1.3561840194892432 43.65286736796332 242.0 -270 280 1.3562634481890878 43.65286757581023 242.0 -280 280 1.356342876878893 43.65286778358278 242.0 -290 280 1.3564223055586615 43.65286799128097 242.0 -0 290 1.3541193103704254 43.652801052243994 242.0 -10 290 1.3541987390514376 43.65280126201483 242.0 -20 290 1.3542781677223377 43.65280147171132 242.0 -30 290 1.3543575963831285 43.65280168133345 242.0 -40 290 1.3544370250338136 43.65280189088122 242.0 -50 290 1.354516453674396 43.65280210035464 242.0 -60 290 1.3545958823048792 43.6528023097537 242.0 -70 290 1.3546753109252663 43.65280251907841 242.0 -80 290 1.3547547395355606 43.652802728328766 242.0 -90 290 1.3548341681357652 43.65280293750477 242.0 -100 290 1.3549135967258834 43.65280314660641 242.0 -110 290 1.3549930253059186 43.652803355633694 242.0 -120 290 1.3550724538758738 43.65280356458663 242.0 -130 290 1.3551518824357527 43.6528037734652 242.0 -140 290 1.3552313109855578 43.652803982269425 242.0 -150 290 1.355310739525293 43.6528041909993 242.0 -160 290 1.3553901680549614 43.652804399654805 242.0 -170 290 1.3554695965745658 43.65280460823597 242.0 -180 290 1.35554902508411 43.652804816742766 242.0 -190 290 1.355628453583597 43.65280502517522 242.0 -200 290 1.35570788207303 43.65280523353331 242.0 -210 290 1.3557873105524123 43.65280544181705 242.0 -220 290 1.3558667390217471 43.65280565002643 242.0 -230 290 1.3559461674810378 43.652805858161464 242.0 -240 290 1.3560255959302876 43.65280606622214 242.0 -250 290 1.3561050243694996 43.65280627420846 242.0 -260 290 1.356184452798677 43.652806482120425 242.0 -270 290 1.3562638812178234 43.652806689958034 242.0 -280 290 1.3563433096269415 43.65280689772129 242.0 -290 290 1.356422738026035 43.65280710541019 242.0 diff --git a/Data/Input/ikonos/ikonos-1.gcp2 b/Data/Input/ikonos/ikonos-1.gcp2 index bf886d8298..446e4a956e 100644 --- a/Data/Input/ikonos/ikonos-1.gcp2 +++ b/Data/Input/ikonos/ikonos-1.gcp2 @@ -1,901 +1,37 @@ -#From file /work/scratch/osmanj/otb_valid/ikonos-1.geom -0 0 0.6653296033735767 49.92379399415211 111.0 -10 0 0.6658863963066598 49.923805207151865 111.0 -20 0 0.6664431895897024 49.923816417480445 111.0 -30 0 0.6669999832226209 49.92382762513786 111.0 -40 0 0.667556777205332 49.9238388301241 111.0 -50 0 0.6681135715377523 49.92385003243916 111.0 -60 0 0.6686703662197984 49.923861232083034 111.0 -70 0 0.6692271612513867 49.92387242905573 111.0 -80 0 0.6697839566324342 49.92388362335722 111.0 -90 0 0.6703407523628572 49.92389481498752 111.0 -100 0 0.6708975484425723 49.92390600394663 111.0 -110 0 0.6714543448714964 49.92391719023452 111.0 -120 0 0.6720111416495458 49.923928373851204 111.0 -130 0 0.6725679387766371 49.92393955479668 111.0 -140 0 0.6731247362526872 49.92395073307094 111.0 -150 0 0.6736815340776126 49.923961908673974 111.0 -160 0 0.6742383322513298 49.92397308160578 111.0 -170 0 0.6747951307737555 49.92398425186636 111.0 -180 0 0.6753519296448064 49.9239954194557 111.0 -190 0 0.6759087288643989 49.92400658437381 111.0 -200 0 0.6764655284324499 49.92401774662066 111.0 -210 0 0.6770223283488759 49.92402890619628 111.0 -220 0 0.6775791286135934 49.92404006310064 111.0 -230 0 0.6781359292265192 49.92405121733375 111.0 -240 0 0.6786927301875699 49.92406236889559 111.0 -250 0 0.6792495314966621 49.92407351778618 111.0 -260 0 0.6798063331537125 49.92408466400549 111.0 -270 0 0.6803631351586378 49.92409580755353 111.0 -280 0 0.6809199375113543 49.92410694843029 111.0 -290 0 0.681476740211779 49.92411808663577 111.0 -0 10 0.665346973430628 49.92343452621842 111.0 +# column row longitude latitude elevation 10 10 0.665903762230304 49.9234457390763 111.0 -20 10 0.6664605513799304 49.92345694926305 111.0 -30 10 0.6670173408794237 49.923468156778654 111.0 -40 10 0.6675741307287003 49.92347936162312 111.0 -50 10 0.6681309209276772 49.92349056379644 111.0 60 10 0.6686877114762707 49.92350176329862 111.0 -70 10 0.6692445023743975 49.923512960129635 111.0 -80 10 0.6698012936219742 49.923524154289495 111.0 -90 10 0.6703580852189174 49.92353534577819 111.0 -100 10 0.6709148771651438 49.92354653459572 111.0 110 10 0.6714716694605698 49.92355772074208 111.0 -120 10 0.6720284621051122 49.92356890421727 111.0 -130 10 0.6725852550986876 49.92358008502127 111.0 -140 10 0.6731420484412126 49.923591263154094 111.0 -150 10 0.6736988421326037 49.92360243861573 111.0 160 10 0.6742556361727777 49.92361361140617 111.0 -170 10 0.6748124305616511 49.92362478152542 111.0 -180 10 0.6753692252991405 49.92363594897346 111.0 -190 10 0.6759260203851626 49.9236471137503 111.0 -200 10 0.6764828158196341 49.92365827585593 111.0 210 10 0.6770396116024714 49.92366943529034 111.0 -220 10 0.6775964077335914 49.92368059205354 111.0 -230 10 0.6781532042129106 49.923691746145515 111.0 -240 10 0.6787100010403455 49.923702897566265 111.0 -250 10 0.6792667982158129 49.92371404631578 111.0 260 10 0.6798235957392296 49.923725192394066 111.0 -270 10 0.6803803936105118 49.92373633580111 111.0 -280 10 0.6809371918295765 49.92374747653691 111.0 -290 10 0.6814939903963402 49.92375861460146 111.0 -0 20 0.6653643431376702 49.9230750582579 111.0 -10 20 0.6659211278040222 49.923086270973904 111.0 -20 20 0.6664779128203155 49.923097481018814 111.0 -30 20 0.6670346981864665 49.92310868839262 111.0 -40 20 0.667591483902392 49.92311989309532 111.0 -50 20 0.6681482699680085 49.923131095126905 111.0 -60 20 0.6687050563832325 49.92314229448737 111.0 -70 20 0.6692618431479808 49.92315349117673 111.0 -80 20 0.6698186302621698 49.92316468519495 111.0 -90 20 0.6703754177257163 49.92317587654205 111.0 -100 20 0.6709322055385368 49.92318706521801 111.0 -110 20 0.671488993700548 49.923198251222836 111.0 -120 20 0.6720457822116666 49.923209434556526 111.0 -130 20 0.6726025710718089 49.923220615219066 111.0 -140 20 0.6731593602808917 49.923231793210455 111.0 -150 20 0.6737161498388318 49.92324296853069 111.0 -160 20 0.6742729397455456 49.92325414117976 111.0 -170 20 0.6748297300009497 49.92326531115768 111.0 -180 20 0.6753865206049607 49.92327647846442 111.0 -190 20 0.6759433115574955 49.9232876431 111.0 -200 20 0.6765001028584705 49.9232988050644 111.0 -210 20 0.6770568945078024 49.923309964357614 111.0 -220 20 0.6776136865054078 49.92332112097965 111.0 -230 20 0.6781704788512033 49.923332274930495 111.0 -240 20 0.6787272715451057 49.92334342621015 111.0 -250 20 0.6792840645870314 49.92335457481861 111.0 -260 20 0.6798408579768972 49.92336572075586 111.0 -270 20 0.6803976517146197 49.92337686402191 111.0 -280 20 0.6809544458001155 49.923388004616754 111.0 -290 20 0.6815112402333013 49.923399142540376 111.0 -0 30 0.6653817124947127 49.92271559027054 111.0 -10 30 0.6659384930278238 49.92272680284468 111.0 -20 30 0.6664952739108669 49.92273801274775 111.0 -30 30 0.6670520551437588 49.92274921997976 111.0 -40 30 0.667608836726416 49.922760424540684 111.0 -50 30 0.6681656186587551 49.92277162643054 111.0 -60 30 0.6687224009406928 49.922782825649314 111.0 -70 30 0.6692791835721456 49.922794022196996 111.0 -80 30 0.66983596655303 49.92280521607359 111.0 -90 30 0.6703927498832629 49.922816407279086 111.0 -100 30 0.6709495335627607 49.92282759581349 111.0 -110 30 0.6715063175914401 49.92283878167678 111.0 -120 30 0.6720631019692177 49.922849964868966 111.0 -130 30 0.6726198866960101 49.922861145390044 111.0 -140 30 0.673176671771734 49.92287232324001 111.0 -150 30 0.673733457196306 49.92288349841884 111.0 -160 30 0.6742902429696426 49.92289467092656 111.0 -170 30 0.6748470290916605 49.92290584076314 111.0 -180 30 0.6754038155622764 49.92291700792859 111.0 -190 30 0.6759606023814068 49.92292817242291 111.0 -200 30 0.6765173895489683 49.922939334246074 111.0 -210 30 0.6770741770648778 49.922950493398105 111.0 -220 30 0.6776309649290517 49.92296164987898 111.0 -230 30 0.6781877531414068 49.922972803688694 111.0 -240 30 0.6787445417018595 49.92298395482726 111.0 -250 30 0.6793013306103265 49.92299510329465 111.0 -260 30 0.6798581198667247 49.92300624909088 111.0 -270 30 0.6804149094709705 49.92301739221594 111.0 -280 30 0.6809716994229805 49.923028532669825 111.0 -290 30 0.6815284897226715 49.923039670452525 111.0 -0 40 0.6653990815017644 49.922356122256346 111.0 -10 40 0.6659558579017175 49.92236733468862 111.0 -20 40 0.6665126346515937 49.92237854444986 111.0 -30 40 0.6670694117513095 49.92238975154007 111.0 -40 40 0.6676261892007815 49.92240095595923 111.0 -50 40 0.6681829669999264 49.922412157707356 111.0 -60 40 0.6687397451486606 49.92242335678443 111.0 -70 40 0.6692965236469011 49.92243455319045 111.0 -80 40 0.669853302494564 49.92244574692541 111.0 -90 40 0.6704100816915662 49.92245693798931 111.0 -100 40 0.6709668612378245 49.92246812638215 111.0 -110 40 0.6715236411332551 49.92247931210392 111.0 -120 40 0.6720804213777749 49.922490495154605 111.0 -130 40 0.6726372019713004 49.92250167553422 111.0 -140 40 0.6731939829137483 49.92251285324275 111.0 -150 40 0.6737507642050353 49.9225240282802 111.0 -160 40 0.6743075458450778 49.92253520064655 111.0 -170 40 0.6748643278337926 49.922546370341806 111.0 -180 40 0.6754211101710962 49.92255753736597 111.0 -190 40 0.6759778928569055 49.92256870171902 111.0 -200 40 0.6765346758911367 49.92257986340096 111.0 -210 40 0.6770914592737067 49.9225910224118 111.0 -220 40 0.6776482430045323 49.92260217875152 111.0 -230 40 0.6782050270835298 49.92261333242011 111.0 -240 40 0.678761811510616 49.92262448341758 111.0 -250 40 0.6793185962857075 49.92263563174392 111.0 -260 40 0.6798753814087211 49.92264677739912 111.0 -270 40 0.6804321668795731 49.922657920383195 111.0 -280 40 0.6809889526981805 49.92266906069612 111.0 -290 40 0.6815457388644598 49.9226801983379 111.0 -0 50 0.6654164501588345 49.92199665421532 111.0 -10 50 0.6659732224257128 49.92200786650573 111.0 -20 50 0.6665299950425051 49.92201907612514 111.0 -30 50 0.6670867680091278 49.922030283073546 111.0 -40 50 0.6676435413254976 49.92204148735095 111.0 -50 50 0.6682003149915313 49.92205268895734 111.0 -60 50 0.6687570890071454 49.92206388789272 111.0 -70 50 0.6693138633722563 49.92207508415708 111.0 -80 50 0.6698706380867808 49.92208627775042 111.0 -90 50 0.6704274131506356 49.922097468672725 111.0 -100 50 0.6709841885637371 49.922108656923996 111.0 -110 50 0.6715409643260022 49.92211984250424 111.0 -120 50 0.6720977404373472 49.922131025413435 111.0 -130 50 0.6726545168976888 49.92214220565159 111.0 -140 50 0.673211293706944 49.9221533832187 111.0 -150 50 0.6737680708650289 49.92216455811475 111.0 -160 50 0.6743248483718605 49.922175730339745 111.0 -170 50 0.6748816262273551 49.922186899893674 111.0 -180 50 0.6754384044314297 49.922198066776545 111.0 -190 50 0.6759951829840006 49.922209230988344 111.0 -200 50 0.6765519618849847 49.92222039252906 111.0 -210 50 0.6771087411342984 49.9222315513987 111.0 -220 50 0.6776655207318585 49.92224270759726 111.0 -230 50 0.6782223006775816 49.92225386112474 111.0 -240 50 0.6787790809713844 49.92226501198112 111.0 -250 50 0.6793358616131834 49.922276160166405 111.0 -260 50 0.6798926426028953 49.92228730568059 111.0 -270 50 0.6804494239404368 49.92229844852367 111.0 -280 50 0.6810062056257246 49.92230958869564 111.0 -290 50 0.6815629876586752 49.9223207261965 111.0 -0 60 0.6654338184659322 49.921637186147464 111.0 10 60 0.6659905865998187 49.92164839829601 111.0 -20 60 0.6665473550836101 49.92165960777359 111.0 -30 60 0.6671041239172228 49.9216708145802 111.0 -40 60 0.6676608931005736 49.92168201871585 111.0 -50 60 0.6682176626335792 49.921693220180515 111.0 60 60 0.6687744325161559 49.921704418974194 111.0 -70 60 0.6693312027482206 49.92171561509689 111.0 -80 60 0.6698879733296897 49.921726808548605 111.0 -90 60 0.67044474426048 49.921737999329316 111.0 -100 60 0.6710015155405079 49.92174918743903 111.0 110 60 0.6715582871696903 49.92176037287775 111.0 -120 60 0.6721150591479437 49.921771555645456 111.0 -130 60 0.6726718314751846 49.921782735742156 111.0 -140 60 0.6732286041513299 49.92179391316784 111.0 -150 60 0.6737853771762959 49.9218050879225 111.0 160 60 0.6743421505499995 49.92181626000614 111.0 -170 60 0.6748989242723571 49.92182742941875 111.0 -180 60 0.6754556983432856 49.92183859616033 111.0 -190 60 0.6760124727627014 49.92184976023087 111.0 -200 60 0.6765692475305213 49.92186092163037 111.0 210 60 0.6771260226466618 49.921872080358824 111.0 -220 60 0.6776827981110396 49.92188323641623 111.0 -230 60 0.6782395739235713 49.92189438980258 111.0 -240 60 0.6787963500841736 49.921905540517876 111.0 -250 60 0.6793531265927633 49.921916688562106 111.0 260 60 0.6799099034492567 49.92192783393528 111.0 -270 60 0.6804666806535706 49.92193897663737 111.0 -280 60 0.6810234582056218 49.92195011666839 111.0 -290 60 0.6815802361053268 49.92196125402833 111.0 -0 70 0.6654511864230667 49.92127771805277 111.0 -10 70 0.6660079504240444 49.921288930059454 111.0 -20 70 0.6665647147749179 49.92130013939521 111.0 -30 70 0.6671214794756037 49.92131134606003 111.0 -40 70 0.6676782445260185 49.921322550053915 111.0 -50 70 0.6682350099260789 49.92133375137686 111.0 -60 70 0.6687917756757015 49.921344950028846 111.0 -70 70 0.6693485417748029 49.92135614600989 111.0 -80 70 0.6699053082232996 49.92136733931998 111.0 -90 70 0.6704620750211086 49.9213785299591 111.0 -100 70 0.671018842168146 49.92138971792726 111.0 -110 70 0.6715756096643288 49.92140090322445 111.0 -120 70 0.6721323775095736 49.92141208585067 111.0 -130 70 0.6726891457037968 49.92142326580591 111.0 -140 70 0.6732459142469153 49.92143444309018 111.0 -150 70 0.6738026831388455 49.92144561770345 111.0 -160 70 0.6743594523795041 49.92145678964573 111.0 -170 70 0.6749162219688079 49.92146795891702 111.0 -180 70 0.6754729919066732 49.921479125517315 111.0 -190 70 0.6760297621930169 49.9214902894466 111.0 -200 70 0.6765865328277556 49.92150145070488 111.0 -210 70 0.677143303810806 49.92151260929215 111.0 -220 70 0.6777000751420845 49.921523765208406 111.0 -230 70 0.678256846821508 49.92153491845364 111.0 -240 70 0.6788136188489929 49.921546069027855 111.0 -250 70 0.6793703912244562 49.921557216931035 111.0 -260 70 0.6799271639478142 49.92156836216318 111.0 -270 70 0.6804839370189837 49.92157950472429 111.0 -280 70 0.6810407104378813 49.92159064461436 111.0 -290 70 0.6815974842044237 49.92160178183339 111.0 -0 80 0.6654685540302469 49.92091824993124 111.0 -10 80 0.6660253138983989 49.92092946179607 111.0 -20 80 0.6665820741164376 49.92094067099 111.0 -30 80 0.6671388346842795 49.92095187751303 111.0 -40 80 0.6676955956018413 49.92096308136516 111.0 -50 80 0.6682523568690397 49.920974282546375 111.0 -60 80 0.6688091184857912 49.92098548105668 111.0 -70 80 0.6693658804520124 49.92099667689607 111.0 -80 80 0.6699226427676199 49.92100787006453 111.0 -90 80 0.6704794054325304 49.92101906056207 111.0 -100 80 0.6710361684466605 49.921030248388675 111.0 -110 80 0.6715929318099267 49.921041433544346 111.0 -120 80 0.6721496955222459 49.92105261602908 111.0 -130 80 0.6727064595835345 49.92106379584286 111.0 -140 80 0.6732632239937092 49.92107497298571 111.0 -150 80 0.6738199887526866 49.92108614745759 111.0 -160 80 0.6743767538603834 49.92109731925853 111.0 -170 80 0.6749335193167162 49.9211084883885 111.0 -180 80 0.6754902851216016 49.92111965484751 111.0 -190 80 0.6760470512749563 49.92113081863554 111.0 -200 80 0.676603817776697 49.921141979752605 111.0 -210 80 0.6771605846267401 49.92115313819869 111.0 -220 80 0.6777173518250025 49.921164293973796 111.0 -230 80 0.6782741193714007 49.921175447077914 111.0 -240 80 0.6788308872658514 49.921186597511046 111.0 -250 80 0.6793876555082713 49.921197745273176 111.0 -260 80 0.6799444240985769 49.92120889036431 111.0 -270 80 0.680501193036685 49.92122003278444 111.0 -280 80 0.6810579623225121 49.92123117253357 111.0 -290 80 0.6816147319559751 49.92124230961168 111.0 -0 90 0.6654859212874821 49.92055878178287 111.0 -10 90 0.6660426770228915 49.92056999350585 111.0 -20 90 0.6665994331081785 49.92058120255796 111.0 -30 90 0.6671561895432596 49.92059240893921 111.0 -40 90 0.6677129463280514 49.92060361264958 111.0 -50 90 0.6682697034624708 49.92061481368907 111.0 -60 90 0.6688264609464342 49.92062601205769 111.0 -70 90 0.6693832187798582 49.92063720775542 111.0 -80 90 0.6699399769626595 49.92064840078227 111.0 -90 90 0.6704967354947546 49.92065959113822 111.0 -100 90 0.6710534943760603 49.92067077882327 111.0 -110 90 0.6716102536064932 49.920681963837424 111.0 -120 90 0.6721670131859697 49.920693146180675 111.0 -130 90 0.6727237731144068 49.92070432585301 111.0 -140 90 0.6732805333917208 49.920715502854435 111.0 -150 90 0.6738372940178284 49.92072667718494 111.0 -160 90 0.6743940549926465 49.920737848844524 111.0 -170 90 0.6749508163160914 49.920749017833174 111.0 -180 90 0.6755075779880799 49.9207601841509 111.0 -190 90 0.6760643400085287 49.92077134779769 111.0 -200 90 0.6766211023773543 49.92078250877354 111.0 -210 90 0.6771778650944733 49.92079366707844 111.0 -220 90 0.6777346281598026 49.9208048227124 111.0 -230 90 0.6782913915732586 49.9208159756754 111.0 -240 90 0.6788481553347581 49.92082712596745 111.0 -250 90 0.6794049194442177 49.92083827358854 111.0 -260 90 0.6799616839015539 49.92084941853866 111.0 -270 90 0.6805184487066837 49.92086056081781 111.0 -280 90 0.6810752138595234 49.92087170042599 111.0 -290 90 0.6816319793599899 49.92088283736319 111.0 -0 100 0.6655032881947814 49.92019931360768 111.0 -10 100 0.6660600397975311 49.9202105251888 111.0 -20 100 0.6666167917501494 49.92022173409909 111.0 -30 100 0.6671735440525528 49.92023294033855 111.0 -40 100 0.6677302967046579 49.92024414390717 111.0 -50 100 0.6682870497063813 49.92025534480494 111.0 -60 100 0.6688438030576396 49.92026654303188 111.0 -70 100 0.6694005567583495 49.92027773858796 111.0 -80 100 0.6699573108084275 49.92028893147319 111.0 -90 100 0.6705140652077904 49.92030012168755 111.0 -100 100 0.6710708199563548 49.92031130923106 111.0 -110 100 0.6716275750540373 49.920322494103694 111.0 -120 100 0.6721843305007543 49.92033367630546 111.0 -130 100 0.6727410862964227 49.92034485583635 111.0 -140 100 0.6732978424409591 49.920356032696354 111.0 -150 100 0.6738545989342801 49.92036720688548 111.0 -160 100 0.6744113557763024 49.92037837840372 111.0 -170 100 0.6749681129669425 49.920389547251055 111.0 -180 100 0.6755248705061172 49.9204007134275 111.0 -190 100 0.676081628393743 49.920411876933045 111.0 -200 100 0.6766383866297366 49.92042303776768 111.0 -210 100 0.6771951452140147 49.920434195931406 111.0 -220 100 0.6777519041464938 49.92044535142421 111.0 -230 100 0.6783086634270907 49.92045650424611 111.0 -240 100 0.678865423055722 49.92046765439708 111.0 -250 100 0.6794221830323043 49.92047880187712 111.0 -260 100 0.6799789433567544 49.92048994668623 111.0 -270 100 0.6805357040289888 49.9205010888244 111.0 -280 100 0.6810924650489242 49.92051222829164 111.0 -290 100 0.6816492264164772 49.92052336508793 111.0 -0 110 0.665520654752154 49.91983984540565 111.0 10 110 0.6660774022223273 49.91985105684492 111.0 -20 110 0.6666341500423598 49.91986226561339 111.0 -30 110 0.6671908982121685 49.919873471711064 111.0 -40 110 0.6677476467316696 49.919884675137936 111.0 -50 110 0.6683043956007801 49.919895875894 111.0 60 110 0.6688611448194165 49.919907073979246 111.0 -70 110 0.6694178943874953 49.919918269393676 111.0 -80 110 0.6699746443049333 49.91992946213729 111.0 -90 110 0.6705313945716469 49.91994065221007 111.0 -100 110 0.671088145187553 49.91995183961203 111.0 110 110 0.671644896152568 49.919963024343154 111.0 -120 110 0.6722016474666087 49.91997420640344 111.0 -130 110 0.6727583991295917 49.919985385792884 111.0 -140 110 0.6733151511414335 49.91999656251148 111.0 -150 110 0.6738719035020508 49.92000773655922 111.0 160 110 0.6744286562113604 49.92001890793611 111.0 -170 110 0.6749854092692787 49.92003007664214 111.0 -180 110 0.6755421626757225 49.92004124267731 111.0 -190 110 0.6760989164306085 49.920052406041606 111.0 -200 110 0.6766556705338531 49.920063566735024 111.0 210 110 0.6772124249853733 49.920074724757576 111.0 -220 110 0.6777691797850853 49.92008588010924 111.0 -230 110 0.6783259349329062 49.920097032790025 111.0 -240 110 0.6788826904287523 49.92010818279992 111.0 -250 110 0.6794394462725404 49.92011933013892 111.0 260 110 0.6799962024641872 49.920130474807024 111.0 -270 110 0.6805529590036093 49.92014161680422 111.0 -280 110 0.6811097158907234 49.92015275613051 111.0 -290 110 0.6816664731254463 49.9201638927859 111.0 -0 120 0.665538020959609 49.91948037717678 111.0 -10 120 0.6660947642972886 49.9194915884742 111.0 -20 120 0.6666515079848186 49.91950279710086 111.0 -30 120 0.6672082520221156 49.919514003056754 111.0 -40 120 0.667764996409096 49.91952520634187 111.0 -50 120 0.6683217411456767 49.91953640695622 111.0 -60 120 0.668878486231774 49.91954760489979 111.0 -70 120 0.6694352316673048 49.919558800172574 111.0 -80 120 0.6699919774521857 49.919569992774576 111.0 -90 120 0.6705487235863332 49.919581182705784 111.0 -100 120 0.6711054700696639 49.919592369966196 111.0 -110 120 0.6716622169020947 49.919603554555806 111.0 -120 120 0.672218964083542 49.91961473647461 111.0 -130 120 0.6727757116139225 49.919625915722605 111.0 -140 120 0.6733324594931528 49.919637092299794 111.0 -150 120 0.6738892077211496 49.91964826620616 111.0 -160 120 0.6744459562978294 49.9196594374417 111.0 -170 120 0.6750027052231091 49.91967060600642 111.0 -180 120 0.6755594544969051 49.919681771900315 111.0 -190 120 0.6761162041191342 49.919692935123365 111.0 -200 120 0.676672954089713 49.919704095675584 111.0 -210 120 0.6772297044085581 49.91971525355696 111.0 -220 120 0.6777864550755862 49.91972640876749 111.0 -230 120 0.678343206090714 49.91973756130716 111.0 -240 120 0.6788999574538581 49.91974871117598 111.0 -250 120 0.6794567091649351 49.919759858373936 111.0 -260 120 0.6800134612238617 49.91977100290104 111.0 -270 120 0.6805702136305546 49.919782144757264 111.0 -280 120 0.6811269663849304 49.91979328394262 111.0 -290 120 0.6816837194869059 49.91980442045709 111.0 -0 130 0.6655553868171555 49.91912090892108 111.0 -10 130 0.6661121260224248 49.919132120076654 111.0 -20 130 0.6666688655775351 49.919143328561496 111.0 -30 130 0.6672256054824034 49.919154534375615 111.0 -40 130 0.6677823457369461 49.91916573751899 111.0 -50 130 0.6683390863410799 49.91917693799162 111.0 -60 130 0.6688958272947214 49.91918813579351 111.0 -70 130 0.6694525685977871 49.919199330924656 111.0 -80 130 0.670009310250194 49.91921052338504 111.0 -90 130 0.6705660522518584 49.91922171317467 111.0 -100 130 0.6711227946026969 49.91923290029354 111.0 -110 130 0.6716795373026263 49.91924408474164 111.0 -120 130 0.6722362803515632 49.919255266518974 111.0 -130 130 0.6727930237494243 49.919266445625524 111.0 -140 130 0.6733497674961262 49.9192776220613 111.0 -150 130 0.6739065115915853 49.91928879582629 111.0 -160 130 0.6744632560357187 49.9192999669205 111.0 -170 130 0.6750200008284426 49.91931113534391 111.0 -180 130 0.675576745969674 49.91932230109653 111.0 -190 130 0.6761334914593292 49.91933346417834 111.0 -200 130 0.6766902372973251 49.91934462458935 111.0 -210 130 0.6772469834835785 49.91935578232955 111.0 -220 130 0.6778037300180056 49.91936693739894 111.0 -230 130 0.6783604769005234 49.91937808979751 111.0 -240 130 0.6789172241310484 49.91938923952526 111.0 -250 130 0.6794739717094973 49.919400386582176 111.0 -260 130 0.6800307196357869 49.91941153096827 111.0 -270 130 0.6805874679098336 49.919422672683524 111.0 -280 130 0.6811442165315542 49.91943381172794 111.0 -290 130 0.6817009655008653 49.919444948101514 111.0 -0 140 0.6655727523248026 49.91876144063855 111.0 -10 140 0.6661294873977444 49.918772651652276 111.0 -20 140 0.6666862228205183 49.91878385999531 111.0 -30 140 0.667242958593041 49.918795065667645 111.0 -40 140 0.6677996947152289 49.91880626866928 111.0 -50 140 0.668356431186999 49.9188174690002 111.0 -60 140 0.6689131680082676 49.91882866666042 111.0 -70 140 0.6694699051789514 49.918839861649914 111.0 -80 140 0.6700266426989672 49.918851053968694 111.0 -90 140 0.6705833805682315 49.91886224361675 111.0 -100 140 0.6711401187866609 49.918873430594076 111.0 -110 140 0.6716968573541721 49.91888461490067 111.0 -120 140 0.6722535962706817 49.918895796536525 111.0 -130 140 0.6728103355361064 49.918906975501635 111.0 -140 140 0.6733670751503628 49.91891815179601 111.0 -150 140 0.6739238151133675 49.918929325419626 111.0 -160 140 0.6744805554250372 49.91894049637249 111.0 -170 140 0.6750372960852886 49.9189516646546 111.0 -180 140 0.6755940370940382 49.91896283026594 111.0 -190 140 0.6761507784512027 49.91897399320652 111.0 -200 140 0.6767075201566989 49.91898515347632 111.0 -210 140 0.6772642622104433 49.918996311075354 111.0 -220 140 0.6778210046123525 49.919007466003606 111.0 -230 140 0.6783777473623434 49.91901861826107 111.0 -240 140 0.6789344904603324 49.919029767847746 111.0 -250 140 0.6794912339062363 49.919040914763634 111.0 -260 140 0.6800479776999717 49.91905205900873 111.0 -270 140 0.6806047218414554 49.91906320058301 111.0 -280 140 0.6811614663306038 49.91907433948649 111.0 -290 140 0.6817182111673338 49.91908547571917 111.0 -0 150 0.6655901174825596 49.91840197232918 111.0 -10 150 0.666146848423257 49.91841318320106 111.0 -20 150 0.6667035797137774 49.91842439140229 111.0 -30 150 0.6672603113540374 49.918435596932845 111.0 -40 150 0.6678170433439538 49.91844679979274 111.0 -50 150 0.668373775683443 49.91845799998196 111.0 -60 150 0.6689305083724219 49.9184691975005 111.0 -70 150 0.6694872414108067 49.91848039234836 111.0 -80 150 0.6700439747985145 49.918491584525526 111.0 -90 150 0.6706007085354618 49.91850277403201 111.0 -100 150 0.6711574426215651 49.9185139608678 111.0 -110 150 0.6717141770567411 49.91852514503288 111.0 -120 150 0.6722709118409064 49.91853632652727 111.0 -130 150 0.6728276469739778 49.91854750535094 111.0 -140 150 0.6733843824558717 49.91855868150391 111.0 -150 150 0.6739411182865049 49.91856985498616 111.0 -160 150 0.6744978544657941 49.918581025797685 111.0 -170 150 0.675054590993656 49.91859219393849 111.0 -180 150 0.6756113278700069 49.918603359408564 111.0 -190 150 0.6761680650947638 49.9186145222079 111.0 -200 150 0.6767248026678432 49.918625682336504 111.0 -210 150 0.6772815405891618 49.91863683979437 111.0 -220 150 0.6778382788586361 49.918647994581484 111.0 -230 150 0.678395017476183 49.91865914669785 111.0 -240 150 0.6789517564417191 49.91867029614346 111.0 -250 150 0.679508495755161 49.91868144291831 111.0 -260 150 0.6800652354164254 49.9186925870224 111.0 -270 150 0.6806219754254289 49.918703728455725 111.0 -280 150 0.6811787157820883 49.91871486721827 111.0 -290 150 0.6817354564863201 49.91872600331005 111.0 -0 160 0.6656074822904354 49.91804250399297 111.0 10 160 0.6661642090989714 49.918053714723015 111.0 -20 160 0.6667209362573214 49.918064922782435 111.0 -30 160 0.667277663765402 49.91807612817122 111.0 -40 160 0.6678343916231296 49.91808733088938 111.0 -50 160 0.6683911198304212 49.91809853093689 111.0 60 160 0.6689478483871932 49.91810972831376 111.0 -70 160 0.6695045772933623 49.91812092301998 111.0 -80 160 0.6700613065488451 49.91813211505554 111.0 -90 160 0.6706180361535583 49.918143304420454 111.0 -100 160 0.6711747661074186 49.918154491114706 111.0 110 160 0.6717314964103422 49.91816567513829 111.0 -120 160 0.6722882270622464 49.9181768564912 111.0 -130 160 0.6728449580630474 49.91818803517344 111.0 -140 160 0.6734016894126621 49.918199211185005 111.0 -150 160 0.6739584211110069 49.918210384525885 111.0 160 160 0.6745151531579986 49.91822155519608 111.0 -170 160 0.6750718855535538 49.91823272319558 111.0 -180 160 0.6756286182975892 49.91824388852439 111.0 -190 160 0.6761853513900213 49.91825505118249 111.0 -200 160 0.6767420848307671 49.91826621116989 111.0 210 160 0.6772988186197428 49.91827736848659 111.0 -220 160 0.6778555527568655 49.918288523132574 111.0 -230 160 0.6784122872420516 49.91829967510784 111.0 -240 160 0.6789690220752177 49.91831082441239 111.0 -250 160 0.6795257572562806 49.918321971046204 111.0 260 160 0.680082492785157 49.9183331150093 111.0 -270 160 0.6806392286617635 49.91834425630166 111.0 -280 160 0.6811959648860167 49.918355394923275 111.0 -290 160 0.6817527014578335 49.91836653087415 111.0 -0 170 0.6656248467484394 49.917683035629935 111.0 -10 170 0.666181569424897 49.91769424621814 111.0 -20 170 0.6667382924511596 49.917705454135756 111.0 -30 170 0.6672950158271436 49.91771665938277 111.0 -40 170 0.6678517395527657 49.917727861959186 111.0 -50 170 0.6684084636279426 49.91773906186499 111.0 -60 170 0.6689651880525909 49.917750259100195 111.0 -70 170 0.6695219128266271 49.917761453664774 111.0 -80 170 0.670078637949968 49.91777264555874 111.0 -90 170 0.6706353634225302 49.917783834782085 111.0 -100 170 0.6711920892442303 49.9177950213348 111.0 -110 170 0.671748815414985 49.917806205216884 111.0 -120 170 0.6723055419347109 49.917817386428325 111.0 -130 170 0.6728622688033247 49.917828564969135 111.0 -140 170 0.6734189960207431 49.9178397408393 111.0 -150 170 0.6739757235868824 49.91785091403881 111.0 -160 170 0.6745324515016597 49.917862084567666 111.0 -170 170 0.6750891797649914 49.91787325242587 111.0 -180 170 0.6756459083767942 49.917884417613415 111.0 -190 170 0.6762026373369847 49.91789558013029 111.0 -200 170 0.6767593666454798 49.917906739976495 111.0 -210 170 0.6773160963021958 49.91791789715202 111.0 -220 170 0.6778728263070497 49.91792905165688 111.0 -230 170 0.6784295566599579 49.91794020349105 111.0 -240 170 0.6789862873608372 49.917951352654526 111.0 -250 170 0.6795430184096042 49.91796249914732 111.0 -260 170 0.6800997498061756 49.917973642969415 111.0 -270 170 0.6806564815504681 49.91798478412081 111.0 -280 170 0.6812132136423983 49.917995922601506 111.0 -290 170 0.6817699460818829 49.91800705841148 111.0 -0 180 0.6656422108565805 49.91732356724006 111.0 -10 180 0.6661989294010429 49.917334777686435 111.0 -20 180 0.6667556482953011 49.91734598546224 111.0 -30 180 0.6673123675392716 49.91735719056749 111.0 -40 180 0.6678690871328711 49.91736839300217 111.0 -50 180 0.6684258070760163 49.91737959276628 111.0 -60 180 0.6689825273686238 49.91739078985981 111.0 -70 180 0.6695392480106103 49.91740198428276 111.0 -80 180 0.6700959690018923 49.917413176035126 111.0 -90 180 0.6706526903423865 49.9174243651169 111.0 -100 180 0.6712094120320097 49.91743555152808 111.0 -110 180 0.6717661340706783 49.91744673526866 111.0 -120 180 0.6723228564583091 49.91745791633864 111.0 -130 180 0.6728795791948186 49.91746909473802 111.0 -140 180 0.6734363022801236 49.91748027046678 111.0 -150 180 0.6739930257141407 49.91749144352493 111.0 -160 180 0.6745497494967865 49.91750261391246 111.0 -170 180 0.6751064736279777 49.91751378162937 111.0 -180 180 0.675663198107631 49.91752494667565 111.0 -190 180 0.6762199229356629 49.91753610905129 111.0 -200 180 0.6767766481119903 49.9175472687563 111.0 -210 180 0.6773333736365297 49.917558425790666 111.0 -220 180 0.6778900995091978 49.91756958015439 111.0 -230 180 0.6784468257299112 49.917580731847465 111.0 -240 180 0.6790035522985867 49.91759188086989 111.0 -250 180 0.6795602792151407 49.91760302722165 111.0 -260 180 0.6801170064794902 49.91761417090275 111.0 -270 180 0.6806737340915517 49.91762531191319 111.0 -280 180 0.681230462051242 49.91763645025296 111.0 -290 180 0.6817871903584777 49.91764758592205 111.0 -0 190 0.665659574614868 49.91696409882335 111.0 -10 190 0.6662162890274181 49.91697530912789 111.0 -20 190 0.6667730037897549 49.9169865167619 111.0 -30 190 0.6673297189017949 49.91699772172538 111.0 -40 190 0.667886434363455 49.917008924018326 111.0 -50 190 0.6684431501746515 49.91702012364074 111.0 -60 190 0.6689998663353014 49.9170313205926 111.0 -70 190 0.669556582845321 49.91704251487392 111.0 -80 190 0.6701132997046273 49.91705370648469 111.0 -90 190 0.6706700169131365 49.9170648954249 111.0 -100 190 0.6712267344707656 49.917076081694546 111.0 -110 190 0.6717834523774312 49.91708726529363 111.0 -120 190 0.6723401706330498 49.917098446222155 111.0 -130 190 0.6728968892375382 49.9171096244801 111.0 -140 190 0.6734536081908129 49.917120800067465 111.0 -150 190 0.6740103274927907 49.91713197298425 111.0 -160 190 0.6745670471433881 49.917143143230454 111.0 -170 190 0.6751237671425219 49.91715431080606 111.0 -180 190 0.6756804874901087 49.91716547571108 111.0 -190 190 0.676237208186065 49.9171766379455 111.0 -200 190 0.6767939292303078 49.917187797509314 111.0 -210 190 0.6773506506227535 49.91719895440252 111.0 -220 190 0.6779073723633189 49.91721010862512 111.0 -230 190 0.6784640944519206 49.9172212601771 111.0 -240 190 0.6790208168884752 49.917232409058464 111.0 -250 190 0.6795775396728995 49.9172435552692 111.0 -260 190 0.6801342628051101 49.917254698809316 111.0 -270 190 0.6806909862850237 49.91726583967879 111.0 -280 190 0.6812477101125569 49.917276977877634 111.0 -290 190 0.6818044342876265 49.91728811340583 111.0 -0 200 0.665676938023311 49.91660463037981 111.0 -10 200 0.6662336483040319 49.91661584054251 111.0 -20 200 0.6667903589345302 49.91662704803473 111.0 -30 200 0.6673470699147228 49.916638252856444 111.0 -40 200 0.6679037812445264 49.91664945500766 111.0 -50 200 0.6684604929238575 49.91666065448837 111.0 -60 200 0.6690172049526325 49.916671851298574 111.0 -70 200 0.6695739173307684 49.91668304543826 111.0 -80 200 0.6701306300581819 49.91669423690743 111.0 -90 200 0.6706873431347893 49.916705425706084 111.0 -100 200 0.6712440565605075 49.916716611834204 111.0 -110 200 0.6718007703352529 49.91672779529179 111.0 -120 200 0.6723574844589424 49.916738976078854 111.0 -130 200 0.6729141989314926 49.91675015419537 111.0 -140 200 0.6734709137528201 49.91676132964134 111.0 -150 200 0.6740276289228415 49.91677250241677 111.0 -160 200 0.6745843444414736 49.916783672521646 111.0 -170 200 0.675141060308633 49.91679483995596 111.0 -180 200 0.6756977765242362 49.91680600471972 111.0 -190 200 0.6762544930882002 49.91681716681291 111.0 -200 200 0.6768112100004413 49.91682832623554 111.0 -210 200 0.6773679272608765 49.91683948298759 111.0 -220 200 0.677924644869422 49.91685063706906 111.0 -230 200 0.678481362825995 49.916861788479956 111.0 -240 200 0.6790380811305119 49.916872937220255 111.0 -250 200 0.6795947997828894 49.91688408328997 111.0 -260 200 0.6801515187830441 49.91689522668909 111.0 -270 200 0.6807082381308929 49.91690636741762 111.0 -280 200 0.6812649578263521 49.91691750547554 111.0 -290 200 0.6818216778693388 49.91692864086285 111.0 -0 210 0.6656943010819185 49.91624516190943 111.0 10 210 0.6662510072308931 49.91625637193031 111.0 -20 210 0.6668077137296362 49.91626757928072 111.0 -30 210 0.6673644205780644 49.91627878396068 111.0 -40 210 0.6679211277760945 49.91628998597017 111.0 -50 210 0.6684778353236429 49.91630118530918 111.0 60 210 0.6690345432206264 49.916312381977725 111.0 -70 210 0.6695912514669616 49.91632357597578 111.0 -80 210 0.6701479600625652 49.91633476730336 111.0 -90 210 0.6707046690073537 49.91634595596045 111.0 -100 210 0.671261378301244 49.916357141947046 111.0 110 210 0.6718180879441524 49.91636832526314 111.0 -120 210 0.6723747979359959 49.91637950590874 111.0 -130 210 0.672931508276691 49.91639068388383 111.0 -140 210 0.6734882189661542 49.91640185918842 111.0 -150 210 0.6740449300043024 49.916413031822486 111.0 160 210 0.6746016413910522 49.916424201786036 111.0 -170 210 0.6751583531263201 49.91643536907906 111.0 -180 210 0.675715065210023 49.91644653370156 111.0 -190 210 0.6762717776420774 49.916457695653534 111.0 -200 210 0.6768284904224 49.91646885493497 111.0 210 210 0.6773852035509075 49.916480011545865 111.0 -220 210 0.6779419170275165 49.916491165486214 111.0 -230 210 0.6784986308521438 49.91650231675602 111.0 -240 210 0.6790553450247059 49.916513465355266 111.0 -250 210 0.6796120595451196 49.91652461128396 111.0 260 210 0.6801687744133015 49.916535754542096 111.0 -270 210 0.6807254896291683 49.91654689512966 111.0 -280 210 0.6812822051926367 49.91655803304666 111.0 -290 210 0.6818389211036234 49.91656916829309 111.0 -0 220 0.6657116637906998 49.91588569341222 111.0 -10 220 0.6662683658080111 49.91589690329127 111.0 -20 220 0.666825068175082 49.91590811049989 111.0 -30 220 0.6673817708918288 49.91591931503808 111.0 -40 220 0.6679384739581684 49.915930516905846 111.0 -50 220 0.6684951773740173 49.91594171610317 111.0 -60 220 0.6690518811392921 49.91595291263005 111.0 -70 220 0.6696085852539098 49.915964106486484 111.0 -80 220 0.6701652897177865 49.91597529767247 111.0 -90 220 0.6707219945308392 49.915986486188004 111.0 -100 220 0.6712786996929846 49.91599767203307 111.0 -110 220 0.671835405204139 49.91600885520768 111.0 -120 220 0.6723921110642195 49.916020035711824 111.0 -130 220 0.6729488172731424 49.91603121354549 111.0 -140 220 0.6735055238308244 49.91604238870868 111.0 -150 220 0.6740622307371824 49.916053561201394 111.0 -160 220 0.6746189379921328 49.916064731023624 111.0 -170 220 0.6751756455955924 49.916075898175365 111.0 -180 220 0.6757323535474778 49.91608706265661 111.0 -190 220 0.6762890618477058 49.916098224467355 111.0 -200 220 0.6768457704961929 49.916109383607605 111.0 -210 220 0.6774024794928558 49.916120540077344 111.0 -220 220 0.6779591888376112 49.91613169387658 111.0 -230 220 0.6785158985303757 49.9161428450053 111.0 -240 220 0.6790726085710662 49.916153993463496 111.0 -250 220 0.6796293189595992 49.91616513925117 111.0 -260 220 0.6801860296958913 49.91617628236832 111.0 -270 220 0.6807427407798593 49.916187422814936 111.0 -280 220 0.6812994522114199 49.91619856059101 111.0 -290 220 0.6818561639904895 49.91620969569656 111.0 -0 230 0.6657290261496639 49.91552622488817 111.0 -10 230 0.6662857240353951 49.91553743462539 111.0 -20 230 0.6668424222708766 49.915548641692226 111.0 -30 230 0.6673991208560252 49.91555984608866 111.0 -40 230 0.6679558197907572 49.915571047814694 111.0 -50 230 0.6685125190749897 49.91558224687033 111.0 -60 230 0.669069218708639 49.91559344325555 111.0 -70 230 0.6696259186916218 49.915604636970365 111.0 -80 230 0.6701826190238549 49.915615828014765 111.0 -90 230 0.6707393197052548 49.91562701638874 111.0 -100 230 0.6712960207357381 49.91563820209229 111.0 -110 230 0.6718527221152216 49.915649385125406 111.0 -120 230 0.672409423843622 49.91566056548809 111.0 -130 230 0.6729661259208559 49.91567174318034 111.0 -140 230 0.6735228283468399 49.915682918202144 111.0 -150 230 0.6740795311214905 49.9156940905535 111.0 -160 230 0.6746362342447247 49.91570526023441 111.0 -170 230 0.6751929377164589 49.91571642724487 111.0 -180 230 0.67574964153661 49.91572759158486 111.0 -190 230 0.6763063457050945 49.91573875325439 111.0 -200 230 0.6768630502218291 49.91574991225345 111.0 -210 230 0.6774197550867305 49.91576106858204 111.0 -220 230 0.6779764602997154 49.91577222224016 111.0 -230 230 0.6785331658607002 49.91578337322779 111.0 -240 230 0.679089871769602 49.91579452154493 111.0 -250 230 0.6796465780263372 49.91580566719159 111.0 -260 230 0.6802032846308226 49.91581681016776 111.0 -270 230 0.6807599915829747 49.91582795047343 111.0 -280 230 0.6813166988827104 49.91583908810859 111.0 -290 230 0.6818734065299463 49.91585022307325 111.0 -0 240 0.66574638815882 49.915166756337285 111.0 -10 240 0.666303081913054 49.915177965932685 111.0 -20 240 0.6668597760170293 49.91518917285773 111.0 -30 240 0.6674164704706625 49.91520037711241 111.0 -40 240 0.6679731652738703 49.91521157869673 111.0 -50 240 0.6685298604265691 49.915222777610666 111.0 -60 240 0.6690865559286758 49.915233973854235 111.0 -70 240 0.669643251780107 49.91524516742743 111.0 -80 240 0.6701999479807793 49.91525635833024 111.0 -90 240 0.6707566445306095 49.91526754656266 111.0 -100 240 0.6713133414295139 49.91527873212468 111.0 -110 240 0.6718700386774096 49.915289915016324 111.0 -120 240 0.6724267362742129 49.91530109523755 111.0 -130 240 0.6729834342198407 49.915312272788384 111.0 -140 240 0.6735401325142095 49.915323447668804 111.0 -150 240 0.6740968311572361 49.91533461987881 111.0 -160 240 0.6746535301488369 49.9153457894184 111.0 -170 240 0.6752102294889288 49.91535695628757 111.0 -180 240 0.6757669291774286 49.91536812048631 111.0 -190 240 0.6763236292142526 49.91537928201463 111.0 -200 240 0.6768803295993178 49.91539044087251 111.0 -210 240 0.6774370303325407 49.91540159705995 111.0 -220 240 0.6779937314138378 49.91541275057694 111.0 -230 240 0.6785504328431261 49.915423901423495 111.0 -240 240 0.6791071346203222 49.915435049599594 111.0 -250 240 0.6796638367453427 49.91544619510524 111.0 -260 240 0.6802205392181043 49.915457337940424 111.0 -270 240 0.6807772420385237 49.91546847810514 111.0 -280 240 0.6813339452065176 49.915479615599395 111.0 -290 240 0.6818906487220027 49.915490750423174 111.0 -0 250 0.6657637498181772 49.91480728775957 111.0 -10 250 0.6663204394409972 49.91481849721315 111.0 -20 250 0.6668771294135492 49.9148297039964 111.0 -30 250 0.66743381973575 49.914840908109326 111.0 -40 250 0.6679905104075163 49.91485210955192 111.0 -50 250 0.6685472014287648 49.91486330832418 111.0 -60 250 0.6691038927994118 49.9148745044261 111.0 -70 250 0.6696605845193745 49.91488569785767 111.0 -80 250 0.6702172765885691 49.91489688861889 111.0 -90 250 0.6707739690069124 49.914908076709764 111.0 -100 250 0.6713306617743211 49.914919262130276 111.0 -110 250 0.6718873548907117 49.914930444880426 111.0 -120 250 0.6724440483560011 49.91494162496021 111.0 -130 250 0.6730007421701059 49.91495280236962 111.0 -140 250 0.6735574363329425 49.914963977108656 111.0 -150 250 0.674114130844428 49.914975149177316 111.0 -160 250 0.6746708257044786 49.914986318575586 111.0 -170 250 0.6752275209130113 49.91499748530347 111.0 -180 250 0.6757842164699426 49.91500864936097 111.0 -190 250 0.6763409123751892 49.91501981074807 111.0 -200 250 0.6768976086286679 49.915030969464766 111.0 -210 250 0.6774543052302953 49.91504212551106 111.0 -220 250 0.6780110021799879 49.915053278886944 111.0 -230 250 0.6785676994776626 49.91506442959241 111.0 -240 250 0.679124397123236 49.91507557762747 111.0 -250 250 0.6796810951166249 49.9150867229921 111.0 -260 250 0.6802377934577458 49.915097865686306 111.0 -270 250 0.6807944921465154 49.91510900571008 111.0 -280 250 0.6813511911828505 49.91512014306342 111.0 -290 250 0.6819078905666677 49.915131277746326 111.0 -0 260 0.6657811111277447 49.914447819155015 111.0 10 260 0.6663377966192335 49.91445902846678 111.0 -20 260 0.6668944824604454 49.91447023510825 111.0 -30 260 0.6674511686512968 49.914481439079424 111.0 -40 260 0.6680078551917048 49.914492640380296 111.0 -50 260 0.6685645420815857 49.91450383901087 111.0 60 260 0.6691212293208564 49.91451503497114 111.0 -70 260 0.6696779169094333 49.914526228261096 111.0 -80 260 0.6702346048472332 49.914537418880734 111.0 -90 260 0.6707912931341727 49.91454860683005 111.0 -100 260 0.6713479817701685 49.914559792109046 111.0 110 260 0.6719046707551374 49.91457097471771 111.0 -120 260 0.6724613600889958 49.914582154656046 111.0 -130 260 0.6730180497716605 49.914593331924046 111.0 -140 260 0.673574739803048 49.914604506521705 111.0 -150 260 0.6741314301830752 49.91461567844901 111.0 160 260 0.6746881209116588 49.914626847705975 111.0 -170 260 0.6752448119887151 49.91463801429258 111.0 -180 260 0.6758015034141611 49.914649178208826 111.0 -190 260 0.6763581951879134 49.91466033945471 111.0 -200 260 0.6769148873098886 49.91467149803024 111.0 210 260 0.6774715797800035 49.91468265393538 111.0 -220 260 0.6780282725981747 49.91469380717015 111.0 -230 260 0.6785849657643188 49.91470495773455 111.0 -240 260 0.6791416592783526 49.91471610562856 111.0 -250 260 0.6796983531401928 49.91472725085218 111.0 260 260 0.680255047349756 49.91473839340541 111.0 -270 260 0.6808117419069588 49.914749533288244 111.0 -280 260 0.6813684368117181 49.91476067050068 111.0 -290 260 0.6819251320639506 49.9147718050427 111.0 -0 270 0.6657984720875316 49.91408835052363 111.0 -10 270 0.6663551534477722 49.914099559693575 111.0 -20 270 0.6669118351577269 49.91411076619326 111.0 -30 270 0.6674685172173122 49.914121970022684 111.0 -40 270 0.6680251996264447 49.914133171181845 111.0 -50 270 0.6685818823850412 49.91414436967074 111.0 -60 270 0.6691385654930183 49.91415556548935 111.0 -70 270 0.6696952489502926 49.91416675863769 111.0 -80 270 0.6702519327567809 49.914177949115754 111.0 -90 270 0.6708086169123997 49.914189136923525 111.0 -100 270 0.6713653014170656 49.914200322061006 111.0 -110 270 0.6719219862706955 49.9142115045282 111.0 -120 270 0.6724786714732061 49.91422268432508 111.0 -130 270 0.6730353570245137 49.91423386145167 111.0 -140 270 0.6735920429245352 49.914245035907946 111.0 -150 270 0.6741487291731872 49.91425620769391 111.0 -160 270 0.6747054157703865 49.91426737680956 111.0 -170 270 0.6752621027160496 49.91427854325489 111.0 -180 270 0.6758187900100934 49.914289707029894 111.0 -190 270 0.6763754776524342 49.91430086813457 111.0 -200 270 0.6769321656429891 49.91431202656891 111.0 -210 270 0.6774888539816745 49.914323182332915 111.0 -220 270 0.6780455426684071 49.91433433542658 111.0 -230 270 0.6786022317031037 49.9143454858499 111.0 -240 270 0.6791589210856809 49.914356633602864 111.0 -250 270 0.6797156108160554 49.91436777868548 111.0 -260 270 0.6802723008941439 49.914378921097736 111.0 -270 270 0.6808289913198631 49.91439006083962 111.0 -280 270 0.6813856820931297 49.91440119791115 111.0 -290 270 0.6819423732138603 49.9144123323123 111.0 -0 280 0.6658158326975471 49.91372888186541 111.0 -10 280 0.6663725099266226 49.91374009089353 111.0 -20 280 0.666929187505403 49.91375129725144 111.0 -30 280 0.667485865433805 49.913762500939114 111.0 -40 280 0.6680425437117451 49.913773701956565 111.0 -50 280 0.6685992223391402 49.913784900303774 111.0 -60 280 0.6691559013159067 49.91379609598075 111.0 -70 280 0.6697125806419615 49.91380728898748 111.0 -80 280 0.670269260317221 49.91381847932396 111.0 -90 280 0.6708259403416021 49.91382966699018 111.0 -100 280 0.6713826207150213 49.91384085198615 111.0 -110 280 0.6719393014373953 49.91385203431186 111.0 -120 280 0.6724959825086408 49.9138632139673 111.0 -130 280 0.6730526639286746 49.91387439095248 111.0 -140 280 0.6736093456974129 49.91388556526738 111.0 -150 280 0.6741660278147729 49.913896736912 111.0 -160 280 0.6747227102806709 49.91390790588634 111.0 -170 280 0.6752793930950239 49.913919072190396 111.0 -180 280 0.6758360762577482 49.91393023582416 111.0 -190 280 0.6763927597687609 49.91394139678763 111.0 -200 280 0.6769494436279783 49.9139525550808 111.0 -210 280 0.6775061278353172 49.91396371070366 111.0 -220 280 0.6780628123906943 49.913974863656215 111.0 -230 280 0.6786194972940264 49.91398601393846 111.0 -240 280 0.67917618254523 49.91399716155039 111.0 -250 280 0.679732868144222 49.91400830649199 111.0 -260 280 0.6802895540909187 49.91401944876328 111.0 -270 280 0.6808462403852372 49.914030588364234 111.0 -280 280 0.681402927027094 49.91404172529485 111.0 -290 280 0.6819596140164058 49.914052859555134 111.0 -0 290 0.6658331929578001 49.91336941318035 111.0 -10 290 0.6663898660557934 49.91338062206666 111.0 -20 290 0.6669465395034827 49.91339182828279 111.0 -30 290 0.6675032133007844 49.91340303182872 111.0 -40 290 0.6680598874476152 49.913414232704454 111.0 -50 290 0.6686165619438919 49.91342543090999 111.0 -60 290 0.6691732367895309 49.91343662644532 111.0 -70 290 0.6697299119844491 49.913447819310434 111.0 -80 290 0.670286587528563 49.91345900950534 111.0 -90 290 0.6708432634217893 49.91347019703002 111.0 -100 290 0.6713999396640448 49.91348138188449 111.0 -110 290 0.6719566162552459 49.91349256406872 111.0 -120 290 0.6725132931953095 49.91350374358272 111.0 -130 290 0.6730699704841522 49.913514920426486 111.0 -140 290 0.6736266481216905 49.913526094600016 111.0 -150 290 0.6741833261078414 49.9135372661033 111.0 -160 290 0.6747400044425212 49.913548434936324 111.0 -170 290 0.675296683125647 49.91355960109911 111.0 -180 290 0.675853362157135 49.91357076459163 111.0 -190 290 0.6764100415369023 49.913581925413894 111.0 -200 290 0.6769667212648653 49.913593083565885 111.0 -210 290 0.6775234013409408 49.913604239047615 111.0 -220 290 0.6780800817650455 49.91361539185906 111.0 -230 290 0.678636762537096 49.91362654200024 111.0 -240 290 0.6791934436570091 49.91363768947112 111.0 -250 290 0.6797501251247013 49.91364883427173 111.0 -260 290 0.6803068069400896 49.913659976402045 111.0 -270 290 0.6808634891030904 49.91367111586206 111.0 -280 290 0.6814201716136205 49.913682252651775 111.0 -290 290 0.6819768544715965 49.913693386771186 111.0 diff --git a/Data/Input/pleiades/pleiades-1.gcp2 b/Data/Input/pleiades/pleiades-1.gcp2 index 6fa0d64e39..829a0af67c 100644 --- a/Data/Input/pleiades/pleiades-1.gcp2 +++ b/Data/Input/pleiades/pleiades-1.gcp2 @@ -1,901 +1,37 @@ -#From file /work/scratch/osmanj/otb_valid/pleiades-1.geom -0 0 1.3619102111248311 43.685721774833176 255.0 -10 0 1.3619706278361692 43.68572218992741 255.0 -20 0 1.3620310446692756 43.68572260499125 255.0 -30 0 1.3620914616241533 43.685723020024696 255.0 -40 0 1.3621518787008053 43.685723435027754 255.0 -50 0 1.3622122958992349 43.685723850000414 255.0 -60 0 1.3622727132194445 43.68572426494268 255.0 -70 0 1.3623331306614377 43.68572467985456 255.0 -80 0 1.362393548225217 43.685725094736036 255.0 -90 0 1.3624539659107855 43.68572550958713 255.0 -100 0 1.362514383718146 43.685725924407826 255.0 -110 0 1.3625748016473018 43.68572633919813 255.0 -120 0 1.3626352196982556 43.68572675395804 255.0 -130 0 1.3626956378710104 43.68572716868757 255.0 -140 0 1.3627560561655692 43.6857275833867 255.0 -150 0 1.362816474581935 43.68572799805544 255.0 -160 0 1.3628768931201105 43.68572841269379 255.0 -170 0 1.362937311780099 43.68572882730175 255.0 -180 0 1.362997730561903 43.685729241879315 255.0 -190 0 1.3630581494655258 43.685729656426496 255.0 -200 0 1.3631185684909706 43.685730070943286 255.0 -210 0 1.3631789876382396 43.68573048542969 255.0 -220 0 1.3632394069073364 43.6857308998857 255.0 -230 0 1.3632998262982636 43.68573131431132 255.0 -240 0 1.3633602458110243 43.68573172870656 255.0 -250 0 1.3634206654456213 43.6857321430714 255.0 -260 0 1.3634810852020576 43.685732557405856 255.0 -270 0 1.3635415050803363 43.685732971709925 255.0 -280 0 1.36360192508046 43.68573338598361 255.0 -290 0 1.363662345202432 43.6857338002269 255.0 -0 10 1.3619104463769882 43.685676657354044 255.0 +# column row longitude latitude elevation 10 10 1.361970863072613 43.68567707240341 255.0 -20 10 1.3620312798900078 43.685677487422375 255.0 -30 10 1.3620916968291756 43.685677902410944 255.0 -40 10 1.3621521138901194 43.685678317369124 255.0 -50 10 1.362212531072842 43.68567873229691 255.0 60 10 1.3622729483773461 43.6856791471943 255.0 -70 10 1.3623333658036354 43.6856795620613 255.0 -80 10 1.3623937833517124 43.68567997689791 255.0 -90 10 1.3624542010215799 43.68568039170412 255.0 -100 10 1.3625146188132413 43.685680806479944 255.0 110 10 1.3625750367266993 43.68568122122537 255.0 -120 10 1.3626354547619568 43.68568163594041 255.0 -130 10 1.3626958729190168 43.685682050625054 255.0 -140 10 1.3627562911978823 43.685682465279314 255.0 -150 10 1.3628167095985564 43.685682879903176 255.0 160 10 1.3628771281210417 43.68568329449665 255.0 -170 10 1.3629375467653415 43.68568370905973 255.0 -180 10 1.3629979655314584 43.685684123592424 255.0 -190 10 1.3630583844193958 43.68568453809473 255.0 -200 10 1.3631188034291561 43.685684952566646 255.0 210 10 1.3631792225607426 43.68568536700817 255.0 -220 10 1.3632396418141584 43.6856857814193 255.0 -230 10 1.363300061189406 43.685686195800045 255.0 -240 10 1.3633604806864885 43.685686610150405 255.0 -250 10 1.363420900305409 43.685687024470376 255.0 260 10 1.3634813200461704 43.685687438759956 255.0 -270 10 1.3635417399087755 43.68568785301915 255.0 -280 10 1.363602159893227 43.68568826724795 255.0 -290 10 1.3636625799995286 43.685688681446365 255.0 -0 20 1.3619106815817028 43.68563153985796 255.0 -10 20 1.361971098261614 43.68563195486244 255.0 -20 20 1.3620315150632967 43.68563236983653 255.0 -30 20 1.3620919319867537 43.685632784780225 255.0 -40 20 1.3621523490319882 43.68563319969353 255.0 -50 20 1.3622127661990031 43.68563361457644 255.0 -60 20 1.3622731834878012 43.685634029428954 255.0 -70 20 1.362333600898386 43.68563444425108 255.0 -80 20 1.3623940184307597 43.68563485904281 255.0 -90 20 1.3624544360849258 43.685635273804145 255.0 -100 20 1.362514853860887 43.685635688535086 255.0 -110 20 1.3625752717586466 43.685636103235645 255.0 -120 20 1.362635689778207 43.685636517905806 255.0 -130 20 1.3626961079195716 43.68563693254558 255.0 -140 20 1.3627565261827432 43.68563734715495 255.0 -150 20 1.3628169445677247 43.68563776173394 255.0 -160 20 1.3628773630745192 43.68563817628254 255.0 -170 20 1.3629377817031294 43.68563859080074 255.0 -180 20 1.3629982004535586 43.68563900528856 255.0 -190 20 1.3630586193258094 43.68563941974598 255.0 -200 20 1.363119038319885 43.685639834173024 255.0 -210 20 1.3631794574357883 43.68564024856967 255.0 -220 20 1.363239876673522 43.685640662935924 255.0 -230 20 1.3633002960330893 43.6856410772718 255.0 -240 20 1.3633607155144931 43.68564149157727 255.0 -250 20 1.3634211351177363 43.685641905852364 255.0 -260 20 1.3634815548428219 43.68564232009707 255.0 -270 20 1.3635419746897528 43.68564273431138 255.0 -280 20 1.3636023946585318 43.68564314849531 255.0 -290 20 1.3636628147491618 43.68564356264885 255.0 -0 30 1.3619109167389618 43.685586422344905 255.0 -10 30 1.3619713334031585 43.68558683730451 255.0 -20 30 1.3620317501891281 43.685587252233724 255.0 -30 30 1.3620921670968738 43.685587667132545 255.0 -40 30 1.3621525841263984 43.68558808200097 255.0 -50 30 1.362213001277705 43.685588496839 255.0 -60 30 1.3622734185507963 43.68558891164664 255.0 -70 30 1.3623338359456756 43.68558932642389 255.0 -80 30 1.3623942534623454 43.685589741170745 255.0 -90 30 1.3624546711008094 43.685590155887205 255.0 -100 30 1.3625150888610698 43.68559057057327 255.0 -110 30 1.36257550674313 43.68559098522895 255.0 -120 30 1.3626359247469928 43.68559139985423 255.0 -130 30 1.362696342872661 43.685591814449126 255.0 -140 30 1.3627567611201379 43.68559222901362 255.0 -150 30 1.3628171794894264 43.685592643547736 255.0 -160 30 1.362877597980529 43.68559305805145 255.0 -170 30 1.3629380165934493 43.68559347252478 255.0 -180 30 1.3629984353281897 43.68559388696772 255.0 -190 30 1.3630588541847535 43.68559430138027 255.0 -200 30 1.3631192731631434 43.68559471576243 255.0 -210 30 1.3631796922633626 43.685595130114194 255.0 -220 30 1.3632401114854138 43.68559554443558 255.0 -230 30 1.3633005308293002 43.685595958726566 255.0 -240 30 1.3633609502950244 43.68559637298717 255.0 -250 30 1.3634213698825897 43.68559678721738 255.0 -260 30 1.3634817895919986 43.6855972014172 255.0 -270 30 1.3635422094232545 43.68559761558664 255.0 -280 30 1.3636026293763601 43.68559802972569 255.0 -290 30 1.3636630494513182 43.68559844383435 255.0 -0 40 1.3619111518487514 43.6855413048149 255.0 -10 40 1.3619715684972329 43.68554171972963 255.0 -20 40 1.362031985267489 43.68554213461397 255.0 -30 40 1.3620924021595222 43.68554254946791 255.0 -40 40 1.3621528191733363 43.68554296429146 255.0 -50 40 1.3622132363089337 43.68554337908461 255.0 -60 40 1.3622736535663174 43.68554379384737 255.0 -70 40 1.3623340709454905 43.68554420857974 255.0 -80 40 1.362394488446456 43.685544623281714 255.0 -90 40 1.3624549060692168 43.6855450379533 255.0 -100 40 1.3625153238137757 43.68554545259449 255.0 -110 40 1.3625757416801358 43.685545867205285 255.0 -120 40 1.3626361596683 43.68554628178569 255.0 -130 40 1.3626965777782716 43.685546696335706 255.0 -140 40 1.362756996010053 43.68554711085533 255.0 -150 40 1.3628174143636473 43.68554752534456 255.0 -160 40 1.3628778328390578 43.685547939803406 255.0 -170 40 1.362938251436287 43.685548354231855 255.0 -180 40 1.3629986701553383 43.685548768629914 255.0 -190 40 1.3630590889962142 43.68554918299758 255.0 -200 40 1.3631195079589178 43.68554959733486 255.0 -210 40 1.3631799270434521 43.68555001164175 255.0 -220 40 1.3632403462498202 43.68555042591826 255.0 -230 40 1.3633007655780247 43.68555084016437 255.0 -240 40 1.3633611850280687 43.68555125438009 255.0 -250 40 1.3634216045999552 43.685551668565424 255.0 -260 40 1.363482024293687 43.68555208272037 255.0 -270 40 1.3635424441092672 43.68555249684493 255.0 -280 40 1.3636028640466984 43.685552910939094 255.0 -290 40 1.3636632841059841 43.68555332500288 255.0 -0 50 1.361911386911058 43.685496187267944 255.0 -10 50 1.3619718035438235 43.685496602137796 255.0 -20 50 1.362032220298365 43.68549701697725 255.0 -30 50 1.3620926371746855 43.68549743178632 255.0 -40 50 1.362153054172788 43.685497846564985 255.0 -50 50 1.3622134712926757 43.68549826131326 255.0 -60 50 1.362273888534351 43.685498676031145 255.0 -70 50 1.3623343058978172 43.685499090718636 255.0 -80 50 1.3623947233830775 43.68549950537574 255.0 -90 50 1.3624551409901344 43.68549992000244 255.0 -100 50 1.3625155587189912 43.68550033459875 255.0 -110 50 1.3625759765696506 43.685500749164675 255.0 -120 50 1.3626363945421156 43.6855011637002 255.0 -130 50 1.3626968126363894 43.68550157820533 255.0 -140 50 1.3627572308524747 43.68550199268008 255.0 -150 50 1.3628176491903745 43.68550240712443 255.0 -160 50 1.3628780676500918 43.68550282153839 255.0 -170 50 1.3629384862316294 43.68550323592196 255.0 -180 50 1.3629989049349904 43.685503650275145 255.0 -190 50 1.3630593237601778 43.685504064597936 255.0 -200 50 1.3631197427071944 43.68550447889034 255.0 -210 50 1.3631801617760433 43.68550489315235 255.0 -220 50 1.3632405809667272 43.68550530738397 255.0 -230 50 1.3633010002792492 43.6855057215852 255.0 -240 50 1.3633614197136124 43.68550613575604 255.0 -250 50 1.3634218392698192 43.6855065498965 255.0 -260 50 1.363482258947873 43.685506964006564 255.0 -270 50 1.363542678747777 43.68550737808624 255.0 -280 50 1.3636030986695333 43.68550779213553 255.0 -290 50 1.3636635187131454 43.68550820615444 255.0 -0 60 1.3619116219258678 43.68545106970404 255.0 10 60 1.3619720385429164 43.68545148452901 255.0 -20 60 1.3620324552817429 43.685451899323596 255.0 -30 60 1.3620928721423498 43.685452314087776 255.0 -40 60 1.36215328912474 43.68545272882157 255.0 -50 60 1.362213706228917 43.68545314352497 255.0 60 60 1.3622741234548834 43.68545355819797 255.0 -70 60 1.3623345408026422 43.685453972840584 255.0 -80 60 1.3623949582721964 43.6854543874528 255.0 -90 60 1.3624553758635487 43.68545480203463 255.0 -100 60 1.3625157935767025 43.685455216586064 255.0 110 60 1.3625762114116604 43.685455631107104 255.0 -120 60 1.3626366293684256 43.685456045597746 255.0 -130 60 1.3626970474470008 43.685456460058006 255.0 -140 60 1.3627574656473893 43.68545687448787 255.0 -150 60 1.3628178839695937 43.68545728888734 255.0 160 60 1.362878302413617 43.685457703256425 255.0 -170 60 1.3629387209794623 43.68545811759512 255.0 -180 60 1.3629991396671326 43.68545853190342 255.0 -190 60 1.3630595584766307 43.685458946181335 255.0 -200 60 1.3631199774079596 43.68545936042885 255.0 210 60 1.3631803964611222 43.685459774645985 255.0 -220 60 1.3632408156361213 43.68546018883273 255.0 -230 60 1.36330123493296 43.685460602989075 255.0 -240 60 1.3633616543516416 43.68546101711504 255.0 -250 60 1.3634220738921683 43.68546143121061 255.0 260 60 1.3634824935545435 43.6854618452758 255.0 -270 60 1.36354291333877 43.6854622593106 255.0 -280 60 1.363603333244851 43.68546267331501 255.0 -290 60 1.363663753272789 43.68546308728903 255.0 -0 70 1.361911856893167 43.6854059521232 255.0 -10 70 1.3619722734944983 43.68540636690329 255.0 -20 70 1.3620326902176088 43.68540678165299 255.0 -30 70 1.3620931070625013 43.685407196372296 255.0 -40 70 1.3621535240291789 43.68540761106121 255.0 -50 70 1.3622139411176444 43.68540802571973 255.0 -60 70 1.362274358327901 43.68540844034786 255.0 -70 70 1.3623347756599515 43.685408854945585 255.0 -80 70 1.3623951931137988 43.685409269512924 255.0 -90 70 1.362455610689446 43.68540968404987 255.0 -100 70 1.362516028386896 43.685410098556424 255.0 -110 70 1.3625764462061518 43.685410513032586 255.0 -120 70 1.3626368641472162 43.68541092747835 255.0 -130 70 1.3626972822100925 43.685411341893726 255.0 -140 70 1.362757700394783 43.68541175627871 255.0 -150 70 1.3628181187012915 43.685412170633306 255.0 -160 70 1.3628785371296204 43.68541258495751 255.0 -170 70 1.3629389556797726 43.68541299925132 255.0 -180 70 1.3629993743517512 43.685413413514745 255.0 -190 70 1.3630597931455593 43.68541382774777 255.0 -200 70 1.3631202120611996 43.68541424195041 255.0 -210 70 1.3631806310986752 43.68541465612266 255.0 -220 70 1.363241050257989 43.685415070264526 255.0 -230 70 1.3633014695391439 43.685415484375994 255.0 -240 70 1.3633618889421428 43.68541589845708 255.0 -250 70 1.3634223084669888 43.68541631250777 255.0 -260 70 1.3634827281136845 43.685416726528075 255.0 -270 70 1.3635431478822333 43.68541714051799 255.0 -280 70 1.3636035677726377 43.68541755447752 255.0 -290 70 1.3636639877849008 43.68541796840666 255.0 -0 80 1.3619120918129424 43.68536083452541 255.0 -10 80 1.3619725083985554 43.68536124926063 255.0 -20 80 1.3620329251059493 43.68536166396545 255.0 -30 80 1.3620933419351267 43.685362078639876 255.0 -40 80 1.3621537588860906 43.68536249328391 255.0 -50 80 1.362214175958844 43.68536290789755 255.0 -60 80 1.36227459315339 43.6853633224808 255.0 -70 80 1.3623350104697314 43.68536373703365 255.0 -80 80 1.3623954279078714 43.6853641515561 255.0 -90 80 1.3624558454678126 43.68536456604817 255.0 -100 80 1.3625162631495582 43.68536498050984 255.0 -110 80 1.362576680953111 43.68536539494112 255.0 -120 80 1.362637098878474 43.68536580934201 255.0 -130 80 1.3626975169256503 43.685366223712506 255.0 -140 80 1.3627579350946426 43.685366638052606 255.0 -150 80 1.362818353385454 43.685367052362324 255.0 -160 80 1.3628787717980877 43.685367466641644 255.0 -170 80 1.3629391903325463 43.685367880890574 255.0 -180 80 1.3629996089888325 43.685368295109114 255.0 -190 80 1.36306002776695 43.685368709297265 255.0 -200 80 1.363120446666901 43.685369123455025 255.0 -210 80 1.3631808656886888 43.68536953758239 255.0 -220 80 1.3632412848323163 43.68536995167937 255.0 -230 80 1.3633017040977866 43.68537036574596 255.0 -240 80 1.3633621234851023 43.68537077978216 255.0 -250 80 1.3634225429942666 43.68537119378797 255.0 -260 80 1.3634829626252825 43.6853716077634 255.0 -270 80 1.3635433823781524 43.68537202170843 255.0 -280 80 1.3636038022528798 43.68537243562308 255.0 -290 80 1.3636642222494675 43.68537284950734 255.0 -0 90 1.3619123266851798 43.6853157169107 255.0 -10 90 1.3619727432550741 43.685316131601034 255.0 -20 90 1.3620331599467503 43.68531654626098 255.0 -30 90 1.362093576760212 43.685316960890525 255.0 -40 90 1.3621539936954614 43.685317375489674 255.0 -50 90 1.3622144107525023 43.685317790058434 255.0 -60 90 1.362274827931337 43.6853182045968 255.0 -70 90 1.3623352452319686 43.68531861910477 255.0 -80 90 1.3623956626544003 43.685319033582346 255.0 -90 90 1.3624560801986347 43.68531944802953 255.0 -100 90 1.362516497864675 43.68531986244632 255.0 -110 90 1.3625769156525243 43.68532027683272 255.0 -120 90 1.3626373335621853 43.68532069118873 255.0 -130 90 1.362697751593661 43.68532110551434 255.0 -140 90 1.3627581697469542 43.68532151980956 255.0 -150 90 1.3628185880220682 43.685321934074395 255.0 -160 90 1.3628790064190057 43.68532234830884 255.0 -170 90 1.3629394249377695 43.68532276251288 255.0 -180 90 1.362999843578363 43.685323176686545 255.0 -190 90 1.3630602623407888 43.68532359082981 255.0 -200 90 1.36312068122505 43.685324004942686 255.0 -210 90 1.3631811002311494 43.68532441902518 255.0 -220 90 1.36324151935909 43.685324833077274 255.0 -230 90 1.363301938608875 43.68532524709898 255.0 -240 90 1.3633623579805068 43.685325661090296 255.0 -250 90 1.3634227774739887 43.68532607505123 255.0 -260 90 1.3634831970893235 43.68532648898177 255.0 -270 90 1.3635436168265143 43.685326902881926 255.0 -280 90 1.363604036685564 43.68532731675169 255.0 -290 90 1.3636644566664753 43.68532773059106 255.0 -0 100 1.361912561509866 43.68527059927906 255.0 -10 100 1.3619729780640404 43.68527101392451 255.0 -20 100 1.3620333947399987 43.68527142853957 255.0 -30 100 1.3620938115377437 43.68527184312424 255.0 -40 100 1.362154228457278 43.68527225767851 255.0 -50 100 1.3622146454986053 43.68527267220239 255.0 -60 100 1.362275062661728 43.685273086695865 255.0 -70 100 1.3623354799466492 43.68527350115896 255.0 -80 100 1.3623958973533719 43.68527391559165 255.0 -90 100 1.3624563148818989 43.68527432999396 255.0 -100 100 1.3625167325322334 43.68527474436586 255.0 -110 100 1.3625771503043782 43.685275158707384 255.0 -120 100 1.3626375681983363 43.68527557301851 255.0 -130 100 1.3626979862141106 43.68527598729924 255.0 -140 100 1.362758404351704 43.68527640154958 255.0 -150 100 1.3628188226111198 43.685276815769534 255.0 -160 100 1.3628792409923605 43.68527722995909 255.0 -170 100 1.362939659495429 43.68527764411826 255.0 -180 100 1.3630000781203289 43.68527805824703 255.0 -190 100 1.3630604968670625 43.685278472345416 255.0 -200 100 1.363120915735633 43.685278886413414 255.0 -210 100 1.363181334726043 43.685279300451015 255.0 -220 100 1.3632417538382962 43.68527971445823 255.0 -230 100 1.3633021730723949 43.68528012843506 255.0 -240 100 1.3633625924283421 43.68528054238149 255.0 -250 100 1.363423011906141 43.68528095629754 255.0 -260 100 1.3634834315057944 43.6852813701832 255.0 -270 100 1.363543851227305 43.685281784038466 255.0 -280 100 1.3636042710706762 43.68528219786335 255.0 -290 100 1.3636646910359107 43.68528261165784 255.0 -0 110 1.361912796286987 43.685225481630496 255.0 10 110 1.3619732128254411 43.68522589623107 255.0 -20 110 1.3620336294856805 43.68522631080125 255.0 -30 110 1.362094046267708 43.68522672534103 255.0 -40 110 1.3621544631715268 43.68522713985042 255.0 -50 110 1.3622148801971397 43.685227554329416 255.0 60 110 1.3622752973445496 43.685227968778015 255.0 -70 110 1.3623357146137596 43.68522838319622 255.0 -80 110 1.3623961320047726 43.68522879758403 255.0 -90 110 1.3624565495175915 43.685229211941454 255.0 -100 110 1.3625169671522193 43.68522962626848 255.0 110 110 1.3625773849086589 43.685230040565116 255.0 -120 110 1.3626378027869135 43.685230454831355 255.0 -130 110 1.3626982207869855 43.68523086906721 255.0 -140 110 1.3627586389088786 43.685231283272664 255.0 -150 110 1.362819057152595 43.68523169744773 255.0 160 110 1.3628794755181384 43.685232111592406 255.0 -170 110 1.3629398940055113 43.685232525706695 255.0 -180 110 1.3630003126147163 43.68523293979059 255.0 -190 110 1.363060731345757 43.68523335384409 255.0 -200 110 1.3631211501986362 43.6852337678672 255.0 210 110 1.3631815691733566 43.68523418185992 255.0 -220 110 1.3632419882699212 43.68523459582225 255.0 -230 110 1.363302407488333 43.685235009754194 255.0 -240 110 1.363362826828595 43.68523542365575 255.0 -250 110 1.36342324629071 43.68523583752691 255.0 260 110 1.3634836658746812 43.685236251367684 255.0 -270 110 1.3635440855805112 43.685236665178074 255.0 -280 110 1.3636045054082029 43.68523707895807 255.0 -290 110 1.3636649253577597 43.68523749270768 255.0 -0 120 1.3619130310165293 43.68518036396502 255.0 -10 120 1.3619734475392622 43.6851807785207 255.0 -20 120 1.3620338641837821 43.685181193046 255.0 -30 120 1.3620942809500916 43.6851816075409 255.0 -40 120 1.3621546978381938 43.68518202200541 255.0 -50 120 1.3622151148480917 43.68518243643952 255.0 -60 120 1.3622755319797881 43.68518285084323 255.0 -70 120 1.362335949233286 43.68518326521656 255.0 -80 120 1.3623963666085885 43.68518367955949 255.0 -90 120 1.3624567841056987 43.68518409387203 255.0 -100 120 1.362517201724619 43.68518450815417 255.0 -110 120 1.362577619465353 43.685184922405924 255.0 -120 120 1.362638037327903 43.685185336627285 255.0 -130 120 1.3626984553122725 43.68518575081825 255.0 -140 120 1.3627588734184641 43.68518616497882 255.0 -150 120 1.362819291646481 43.68518657910901 255.0 -160 120 1.362879709996326 43.6851869932088 255.0 -170 120 1.362940128468002 43.6851874072782 255.0 -180 120 1.363000547061512 43.68518782131721 255.0 -190 120 1.363060965776859 43.685188235325825 255.0 -200 120 1.3631213846140462 43.68518864930405 255.0 -210 120 1.3631818035730758 43.68518906325189 255.0 -220 120 1.3632422226539513 43.68518947716934 255.0 -230 120 1.3633026418566758 43.685189891056396 255.0 -240 120 1.3633630611812517 43.68519030491307 255.0 -250 120 1.3634234806276821 43.68519071873935 255.0 -260 120 1.3634839001959702 43.68519113253524 255.0 -270 120 1.3635443198861188 43.685191546300736 255.0 -280 120 1.3636047396981306 43.68519196003585 255.0 -290 120 1.3636651596320088 43.68519237374058 255.0 -0 130 1.3619132656984791 43.68513524628262 255.0 -10 130 1.3619736822054904 43.68513566079343 255.0 -20 130 1.3620340988342898 43.68513607527384 255.0 -30 130 1.3620945155848805 43.68513648972385 255.0 -40 130 1.3621549324572655 43.68513690414348 255.0 -50 130 1.3622153494514475 43.6851373185327 255.0 -60 130 1.3622757665674297 43.68513773289154 255.0 -70 130 1.362336183805215 43.68513814721998 255.0 -80 130 1.3623966011648065 43.68513856151803 255.0 -90 130 1.3624570186462068 43.685138975785684 255.0 -100 130 1.3625174362494192 43.68513939002294 255.0 -110 130 1.3625778539744464 43.68513980422981 255.0 -120 130 1.3626382718212915 43.68514021840628 255.0 -130 130 1.3626986897899573 43.68514063255237 255.0 -140 130 1.362759107880447 43.68514104666806 255.0 -150 130 1.3628195260927636 43.68514146075336 255.0 -160 130 1.3628799444269095 43.68514187480827 255.0 -170 130 1.3629403628828882 43.68514228883278 255.0 -180 130 1.3630007814607024 43.68514270282691 255.0 -190 130 1.363061200160355 43.68514311679064 255.0 -200 130 1.3631216189818491 43.685143530723984 255.0 -210 130 1.3631820379251876 43.68514394462694 255.0 -220 130 1.3632424569903734 43.6851443584995 255.0 -230 130 1.3633028761774093 43.68514477234167 255.0 -240 130 1.3633632954862984 43.685145186153456 255.0 -250 130 1.3634237149170436 43.685145599934856 255.0 -260 130 1.363484134469648 43.68514601368586 255.0 -270 130 1.3635445541441145 43.68514642740647 255.0 -280 130 1.3636049739404457 43.6851468410967 255.0 -290 130 1.3636653938586447 43.685147254756544 255.0 -0 140 1.361913500332823 43.68509012858331 255.0 -10 140 1.3619739168241116 43.685090543049235 255.0 -20 140 1.36203433343719 43.68509095748477 255.0 -30 140 1.362094750172061 43.6850913718899 255.0 -40 140 1.3621551670287282 43.685091786264636 255.0 -50 140 1.3622155840071937 43.685092200608985 255.0 -60 140 1.362276001107461 43.68509261492293 255.0 -70 140 1.3623364183295328 43.68509302920649 255.0 -80 140 1.3623968356734124 43.68509344345965 255.0 -90 140 1.3624572531391024 43.68509385768242 255.0 -100 140 1.362517670726606 43.685094271874796 255.0 -110 140 1.362578088435926 43.68509468603678 255.0 -120 140 1.3626385062670652 43.68509510016837 255.0 -130 140 1.362698924220027 43.68509551426957 255.0 -140 140 1.3627593422948139 43.685095928340374 255.0 -150 140 1.362819760491429 43.68509634238079 255.0 -160 140 1.3628801788098754 43.68509675639081 255.0 -170 140 1.3629405972501558 43.68509717037044 255.0 -180 140 1.3630010158122734 43.685097584319685 255.0 -190 140 1.3630614344962309 43.68509799823853 255.0 -200 140 1.3631218533020315 43.68509841212699 255.0 -210 140 1.3631822722296778 43.68509882598506 255.0 -220 140 1.363242691279173 43.685099239812736 255.0 -230 140 1.36330311045052 43.685099653610024 255.0 -240 140 1.3633635297437217 43.68510006737692 255.0 -250 140 1.363423949158781 43.68510048111343 255.0 -260 140 1.363484368695701 43.685100894819556 255.0 -270 140 1.3635447883544842 43.685101308495284 255.0 -280 140 1.3636052081351342 43.68510172214062 255.0 -290 140 1.3636656280376533 43.68510213575558 255.0 -0 150 1.3619137349195474 43.68504501086711 255.0 -10 150 1.3619741513951125 43.685045425288145 255.0 -20 150 1.362034567992469 43.685045839678786 255.0 -30 150 1.36209498471162 43.68504625403904 255.0 -40 150 1.362155401552568 43.68504666836889 255.0 -50 150 1.3622158185153166 43.68504708266835 255.0 -60 150 1.3622762355998683 43.685047496937415 255.0 -70 150 1.362336652806226 43.685047911176085 255.0 -80 150 1.3623970701343928 43.685048325384365 255.0 -90 150 1.3624574875843718 43.68504873956225 255.0 -100 150 1.3625179051561658 43.68504915370974 255.0 -110 150 1.3625783228497776 43.68504956782684 255.0 -120 150 1.3626387406652105 43.685049981913544 255.0 -130 150 1.362699158602467 43.68505039596986 255.0 -140 150 1.3627595766615506 43.68505080999578 255.0 -150 150 1.3628199948424637 43.68505122399131 255.0 -160 150 1.36288041314521 43.68505163795644 255.0 -170 150 1.3629408315697915 43.68505205189119 255.0 -180 150 1.3630012501162116 43.68505246579554 255.0 -190 150 1.3630616687844734 43.685052879669506 255.0 -200 150 1.3631220875745795 43.68505329351308 255.0 -210 150 1.3631825064865333 43.68505370732626 255.0 -220 150 1.363242925520337 43.685054121109054 255.0 -230 150 1.3633033446759943 43.68505453486146 255.0 -240 150 1.363363763953508 43.68505494858347 255.0 -250 150 1.3634241833528806 43.685055362275094 255.0 -260 150 1.3634846028741152 43.68505577593633 255.0 -270 150 1.363545022517215 43.68505618956717 255.0 -280 150 1.3636054422821828 43.685056603167624 255.0 -290 150 1.3636658621690214 43.685057016737694 255.0 -0 160 1.3619139694586382 43.684999893134 255.0 10 160 1.3619743859184794 43.68500030751015 255.0 -20 160 1.3620348025001134 43.68500072185591 255.0 -30 160 1.3620952192035434 43.68500113617127 255.0 -40 160 1.362155636028772 43.68500155045624 255.0 -50 160 1.3622160529758025 43.685001964710814 255.0 60 160 1.3622764700446377 43.685002378934996 255.0 -70 160 1.3623368872352806 43.68500279312878 255.0 -80 160 1.362397304547734 43.68500320729217 255.0 -90 160 1.362457721982001 43.685003621425174 255.0 -100 160 1.3625181395380848 43.685004035527776 255.0 110 160 1.362578557215988 43.68500444959999 255.0 -120 160 1.3626389750157135 43.68500486364181 255.0 -130 160 1.3626993929372646 43.68500527765323 255.0 -140 160 1.3627598109806438 43.685005691634274 255.0 -150 160 1.3628202291458544 43.68500610558491 255.0 160 160 1.3628806474328994 43.685006519505166 255.0 -170 160 1.3629410658417813 43.68500693339502 255.0 -180 160 1.3630014843725033 43.68500734725449 255.0 -190 160 1.3630619030250686 43.68500776108357 255.0 -200 160 1.36312232179948 43.685008174882256 255.0 210 160 1.36318274069574 43.685008588650554 255.0 -220 160 1.363243159713852 43.685009002388455 255.0 -230 160 1.3633035788538188 43.68500941609597 255.0 -240 160 1.3633639981156433 43.6850098297731 255.0 -250 160 1.3634244174993286 43.68501024341983 255.0 260 160 1.3634848370048773 43.68501065703618 255.0 -270 160 1.3635452566322928 43.68501107062214 255.0 -280 160 1.3636056763815776 43.68501148417771 255.0 -290 160 1.363666096252735 43.685011897702886 255.0 -0 170 1.361914203950082 43.68495477538399 255.0 -10 170 1.3619746203941985 43.68495518971526 255.0 -20 170 1.3620350369601093 43.68495560401613 255.0 -30 170 1.3620954536478174 43.684956018286606 255.0 -40 170 1.362155870457326 43.68495643252669 255.0 -50 170 1.3622162873886379 43.68495684673638 255.0 -60 170 1.3622767044417559 43.684957260915674 255.0 -70 170 1.362337121616683 43.684957675064574 255.0 -80 170 1.3623975389134226 43.68495808918308 255.0 -90 170 1.3624579563319772 43.68495850327119 255.0 -100 170 1.3625183738723496 43.68495891732891 255.0 -110 170 1.3625787915345433 43.68495933135624 255.0 -120 170 1.362639209318561 43.68495974535317 255.0 -130 170 1.3626996272244056 43.68496015931971 255.0 -140 170 1.36276004525208 43.68496057325586 255.0 -150 170 1.3628204634015872 43.68496098716162 255.0 -160 170 1.36288088167293 43.68496140103698 255.0 -170 170 1.362941300066112 43.68496181488195 255.0 -180 170 1.3630017185811352 43.684962228696534 255.0 -190 170 1.3630621372180032 43.68496264248072 255.0 -200 170 1.3631225559767186 43.68496305623452 255.0 -210 170 1.3631829748572843 43.68496346995793 255.0 -220 170 1.3632433938597037 43.68496388365095 255.0 -230 170 1.3633038129839794 43.68496429731358 255.0 -240 170 1.3633642322301143 43.68496471094581 255.0 -250 170 1.3634246515981114 43.68496512454767 255.0 -260 170 1.3634850710879738 43.68496553811912 255.0 -270 170 1.363545490699704 43.684965951660196 255.0 -280 170 1.3636059104333054 43.68496636517087 255.0 -290 170 1.3636663302887806 43.684966778651166 255.0 -0 180 1.3619144383938655 43.68490965761709 255.0 -10 180 1.3619748548222563 43.684910071903474 255.0 -20 180 1.362035271372443 43.68491048615946 255.0 -30 180 1.3620956880444288 43.684910900385056 255.0 -40 180 1.3621561048382165 43.68491131458025 255.0 -50 180 1.3622165217538087 43.68491172874505 255.0 -60 180 1.362276938791209 43.684912142879455 255.0 -70 180 1.36233735595042 43.68491255698347 255.0 -80 180 1.3623977732314445 43.68491297105709 255.0 -90 180 1.3624581906342859 43.684913385100316 255.0 -100 180 1.3625186081589467 43.68491379911315 255.0 -110 180 1.3625790258054302 43.68491421309559 255.0 -120 180 1.362639443573739 43.68491462704763 255.0 -130 180 1.3626998614638766 43.68491504096929 255.0 -140 180 1.3627602794758453 43.684915454860544 255.0 -150 180 1.3628206976096484 43.68491586872142 255.0 -160 180 1.3628811158652887 43.68491628255189 255.0 -170 180 1.3629415342427693 43.684916696351976 255.0 -180 180 1.3630019527420931 43.684917110121674 255.0 -190 180 1.3630623713632632 43.684917523860975 255.0 -200 180 1.3631227901062821 43.684917937569885 255.0 -210 180 1.363183208971153 43.684918351248406 255.0 -220 180 1.363243627957879 43.68491876489654 255.0 -230 180 1.3633040470664628 43.68491917851428 255.0 -240 180 1.3633644662969073 43.68491959210163 255.0 -250 180 1.3634248856492155 43.68492000565859 255.0 -260 180 1.3634853051233906 43.68492041918516 255.0 -270 180 1.3635457247194351 43.68492083268134 255.0 -280 180 1.3636061444373522 43.684921246147134 255.0 -290 180 1.3636665642771446 43.684921659582535 255.0 -0 190 1.3619146727899745 43.68486453983331 255.0 -10 190 1.3619750892026392 43.684864954074804 255.0 -20 190 1.3620355057371012 43.684865368285905 255.0 -30 190 1.3620959223933637 43.68486578246661 255.0 -40 190 1.3621563391714295 43.684866196616916 255.0 -50 190 1.3622167560713019 43.68486661073683 255.0 -60 190 1.3622771730929835 43.68486702482635 255.0 -70 190 1.3623375902364774 43.684867438885476 255.0 -80 190 1.3623980075017865 43.68486785291421 255.0 -90 190 1.3624584248889138 43.684868266912545 255.0 -100 190 1.362518842397862 43.68486868088049 255.0 -110 190 1.3625792600286346 43.68486909481804 255.0 -120 190 1.3626396777812342 43.6848695087252 255.0 -130 190 1.3627000956556636 43.68486992260197 255.0 -140 190 1.362760513651926 43.68487033644834 255.0 -150 190 1.3628209317700244 43.68487075026432 255.0 -160 190 1.3628813500099615 43.68487116404991 255.0 -170 190 1.3629417683717404 43.684871577805104 255.0 -180 190 1.363002186855364 43.68487199152991 255.0 -190 190 1.3630626054608352 43.684872405224326 255.0 -200 190 1.363123024188157 43.684872818888344 255.0 -210 190 1.3631834430373322 43.68487323252198 255.0 -220 190 1.363243862008364 43.68487364612522 255.0 -230 190 1.3633042811012552 43.684874059698075 255.0 -240 190 1.3633647003160085 43.684874473240534 255.0 -250 190 1.3634251196526272 43.68487488675261 255.0 -260 190 1.3634855391111143 43.68487530023429 255.0 -270 190 1.3635459586914722 43.684875713685585 255.0 -280 190 1.3636063783937045 43.684876127106484 255.0 -290 190 1.3636667982178134 43.684876540497 255.0 -0 200 1.3619149071383958 43.684819422032646 255.0 -10 200 1.3619753235353333 43.68481983622925 255.0 -20 200 1.36203574005407 43.68482025039547 255.0 -30 200 1.3620961566946086 43.68482066453128 255.0 -40 200 1.362156573456952 43.6848210786367 255.0 -50 200 1.3622169903411034 43.68482149271173 255.0 -60 200 1.3622774073470658 43.68482190675636 255.0 -70 200 1.3623378244748419 43.6848223207706 255.0 -80 200 1.3623982417244347 43.68482273475444 255.0 -90 200 1.3624586590958472 43.68482314870789 255.0 -100 200 1.3625190765890824 43.684823562630946 255.0 -110 200 1.3625794942041434 43.68482397652361 255.0 -120 200 1.3626399119410326 43.68482439038588 255.0 -130 200 1.3627003297997535 43.684824804217754 255.0 -140 200 1.362760747780309 43.68482521801924 255.0 -150 200 1.3628211658827016 43.68482563179033 255.0 -160 200 1.3628815841069348 43.68482604553103 255.0 -170 200 1.362942002453011 43.68482645924134 255.0 -180 200 1.3630024209209337 43.684826872921256 255.0 -190 200 1.3630628395107054 43.68482728657078 255.0 -200 200 1.3631232582223294 43.68482770018991 255.0 -210 200 1.3631836770558083 43.68482811377866 255.0 -220 200 1.3632440960111452 43.68482852733701 255.0 -230 200 1.363304515088343 43.684828940864975 255.0 -240 200 1.3633649342874048 43.68482935436255 255.0 -250 200 1.3634253536083332 43.684829767829726 255.0 -260 200 1.3634857730511314 43.68483018126652 255.0 -270 200 1.3635461926158021 43.684830594672924 255.0 -280 200 1.3636066123023485 43.68483100804894 255.0 -290 200 1.3636670321107733 43.68483142139456 255.0 -0 210 1.3619151414391155 43.684774304215104 255.0 10 210 1.3619755578203252 43.684774718366825 255.0 -20 210 1.3620359743233357 43.68477513248815 255.0 -30 210 1.3620963909481496 43.684775546579075 255.0 -40 210 1.36215680769477 43.684775960639605 255.0 -50 210 1.3622172245631998 43.684776374669745 255.0 60 210 1.362277641553442 43.68477678866949 255.0 -70 210 1.3623380586654996 43.684777202638834 255.0 -80 210 1.3623984758993755 43.68477761657779 255.0 -90 210 1.3624588932550725 43.68477803048635 255.0 -100 210 1.362519310732594 43.68477844436452 255.0 110 210 1.3625797283319423 43.68477885821229 255.0 -120 210 1.3626401460531208 43.68477927202967 255.0 -130 210 1.3627005638961325 43.68477968581666 255.0 -140 210 1.36276098186098 43.68478009957325 255.0 -150 210 1.3628213999476664 43.68478051329946 255.0 160 210 1.3628818181561948 43.684780926995266 255.0 -170 210 1.362942236486568 43.684781340660685 255.0 -180 210 1.3630026549387888 43.68478175429571 255.0 -190 210 1.3630630735128606 43.68478216790035 255.0 -200 210 1.3631234922087858 43.68478258147459 255.0 210 210 1.3631839110265676 43.684782995018445 255.0 -220 210 1.363244329966209 43.684783408531906 255.0 -230 210 1.3633047490277128 43.68478382201498 255.0 -240 210 1.363365168211082 43.68478423546766 255.0 -250 210 1.3634255875163193 43.68478464888996 255.0 260 210 1.363486006943428 43.68478506228186 255.0 -270 210 1.3635464264924109 43.68478547564337 255.0 -280 210 1.3636068461632709 43.684785888974496 255.0 -290 210 1.363667265956011 43.68478630227523 255.0 -0 220 1.36191537569212 43.68472918638069 255.0 -10 220 1.3619757920576014 43.68472960048752 255.0 -20 220 1.362036208544885 43.684730014563954 255.0 -30 220 1.3620966251539735 43.684730428609996 255.0 -40 220 1.36215704188487 43.68473084262563 255.0 -50 220 1.3622174587375775 43.68473125661088 255.0 -60 220 1.362277875712099 43.68473167056574 255.0 -70 220 1.3623382928084373 43.6847320844902 255.0 -80 220 1.3623987100265955 43.684732498384264 255.0 -90 220 1.3624591273665763 43.68473291224793 255.0 -100 220 1.362519544828383 43.68473332608121 255.0 -110 220 1.3625799624120183 43.684733739884095 255.0 -120 220 1.3626403801174851 43.684734153656585 255.0 -130 220 1.3627007979447867 43.684734567398685 255.0 -140 220 1.3627612158939257 43.68473498111039 255.0 -150 220 1.3628216339649053 43.6847353947917 255.0 -160 220 1.362882052157728 43.68473580844262 255.0 -170 220 1.3629424704723974 43.68473622206315 255.0 -180 220 1.3630028889089159 43.68473663565329 255.0 -190 220 1.3630633074672867 43.68473704921303 255.0 -200 220 1.3631237261475126 43.68473746274238 255.0 -210 220 1.3631841449495965 43.68473787624135 255.0 -220 220 1.3632445638735415 43.68473828970992 255.0 -230 220 1.3633049829193506 43.6847387031481 255.0 -240 220 1.3633654020870265 43.684739116555896 255.0 -250 220 1.3634258213765722 43.684739529933296 255.0 -260 220 1.3634862407879909 43.684739943280306 255.0 -270 220 1.3635466603212851 43.684740356596926 255.0 -280 220 1.363607079976458 43.68474076988316 255.0 -290 220 1.3636674997535123 43.684741183139 255.0 -0 230 1.3619156098973957 43.68468406852941 255.0 -10 230 1.3619760262471479 43.68468448259135 255.0 -20 230 1.362036442718704 43.68468489662289 255.0 -30 230 1.3620968593120664 43.68468531062404 255.0 -40 230 1.3621572760272382 43.68468572459479 255.0 -50 230 1.3622176928642227 43.68468613853515 255.0 -60 230 1.3622781098230228 43.684686552445115 255.0 -70 230 1.362338526903641 43.68468696632468 255.0 -80 230 1.3623989441060806 43.68468738017386 255.0 -90 230 1.3624593614303446 43.68468779399264 255.0 -100 230 1.362519778876436 43.68468820778103 255.0 -110 230 1.3625801964443573 43.68468862153902 255.0 -120 230 1.362640614134112 43.68468903526662 255.0 -130 230 1.3627010319457027 43.68468944896383 255.0 -140 230 1.3627614498791325 43.68468986263064 255.0 -150 230 1.3628218679344044 43.68469027626706 255.0 -160 230 1.362882286111521 43.684690689873094 255.0 -170 230 1.3629427044104856 43.68469110344873 255.0 -180 230 1.363003122831301 43.68469151699398 255.0 -190 230 1.3630635413739702 43.68469193050883 255.0 -200 230 1.3631239600384961 43.68469234399329 255.0 -210 230 1.3631843788248816 43.684692757447365 255.0 -220 230 1.3632447977331295 43.68469317087105 255.0 -230 230 1.3633052167632431 43.68469358426434 255.0 -240 230 1.363365635915225 43.684693997627235 255.0 -250 230 1.3634260551890784 43.68469441095975 255.0 -260 230 1.363486474584806 43.68469482426187 255.0 -270 230 1.363546894102411 43.684695237533596 255.0 -280 230 1.3636073137418958 43.68469565077494 255.0 -290 230 1.363667733503264 43.68469606398589 255.0 -0 240 1.361915844054929 43.68463895066126 255.0 -10 240 1.3619762603889514 43.68463936467831 255.0 -20 240 1.362036676844779 43.684639778664966 255.0 -30 240 1.3620970934224146 43.684640192621224 255.0 -40 240 1.3621575101218613 43.684640606547084 255.0 -50 240 1.3622179269431218 43.684641020442555 255.0 -60 240 1.3622783438861996 43.68464143430763 255.0 -70 240 1.3623387609510973 43.684641848142306 255.0 -80 240 1.3623991781378177 43.684642261946586 255.0 -90 240 1.362459595446364 43.684642675720475 255.0 -100 240 1.3625200128767394 43.684643089463975 255.0 -110 240 1.3625804304289462 43.68464350317708 255.0 -120 240 1.362640848102988 43.684643916859784 255.0 -130 240 1.362701265898867 43.6846443305121 255.0 -140 240 1.3627616838165868 43.684644744134026 255.0 -150 240 1.3628221018561502 43.684645157725555 255.0 -160 240 1.36288252001756 43.684645571286694 255.0 -170 240 1.3629429383008191 43.684645984817436 255.0 -180 240 1.3630033567059308 43.684646398317796 255.0 -190 240 1.3630637752328976 43.68464681178776 255.0 -200 240 1.3631241938817227 43.68464722522733 255.0 -210 240 1.363184612652409 43.684647638636505 255.0 -220 240 1.3632450315449594 43.6846480520153 255.0 -230 240 1.3633054505593765 43.68464846536369 255.0 -240 240 1.3633658696956639 43.684648878681706 255.0 -250 240 1.363426288953824 43.68464929196932 255.0 -260 240 1.36348670833386 43.68464970522655 255.0 -270 240 1.363547127835775 43.68465011845339 255.0 -280 240 1.3636075474595712 43.68465053164984 255.0 -290 240 1.3636679672052523 43.6846509448159 255.0 -0 250 1.3619160781647064 43.68459383277626 255.0 -10 250 1.3619764944829982 43.68459424674842 255.0 -20 250 1.3620369109230965 43.68459466069018 255.0 -30 250 1.3620973274850046 43.684595074601546 255.0 -40 250 1.3621577441687251 43.684595488482515 255.0 -50 250 1.3622181609742614 43.68459590233309 255.0 -60 250 1.3622785779016162 43.684596316153275 255.0 -70 250 1.3623389949507925 43.68459672994306 255.0 -80 250 1.362399412121793 43.684597143702455 255.0 -90 250 1.362459829414621 43.68459755743145 255.0 -100 250 1.3625202468292794 43.68459797113005 255.0 -110 250 1.362580664365771 43.684598384798264 255.0 -120 250 1.3626410820240988 43.684598798436085 255.0 -130 250 1.362701499804266 43.68459921204351 255.0 -140 250 1.3627619177062749 43.684599625620535 255.0 -150 250 1.3628223357301292 43.68460003916718 255.0 -160 250 1.3628827538758312 43.684600452683426 255.0 -170 250 1.3629431721433845 43.684600866169276 255.0 -180 250 1.3630035905327915 43.68460127962474 255.0 -190 250 1.3630640090440551 43.68460169304981 255.0 -200 250 1.3631244276771788 43.68460210644449 255.0 -210 250 1.363184846432165 43.68460251980878 255.0 -220 250 1.363245265309017 43.68460293314267 255.0 -230 250 1.3633056843077374 43.68460334644618 255.0 -240 250 1.3633661034283293 43.684603759719295 255.0 -250 250 1.3634265226707956 43.68460417296202 255.0 -260 250 1.3634869420351394 43.68460458617435 255.0 -270 250 1.3635473615213634 43.6846049993563 255.0 -280 250 1.3636077811294705 43.68460541250786 255.0 -290 250 1.3636682008594638 43.68460582562902 255.0 -0 260 1.3619163122267142 43.684548714874396 255.0 10 260 1.3619767285292745 43.68454912880166 255.0 -20 260 1.362037144953643 43.684549542698534 255.0 -30 260 1.3620975614998228 43.68454995656501 255.0 -40 260 1.3621579781678166 43.68455037040109 255.0 -50 260 1.3622183949576276 43.68455078420677 255.0 60 260 1.3622788118692586 43.68455119798206 255.0 -70 260 1.3623392289027128 43.68455161172696 255.0 -80 260 1.3623996460579928 43.684552025441455 255.0 -90 260 1.3624600633351016 43.68455243912556 255.0 -100 260 1.3625204807340425 43.68455285277928 255.0 110 260 1.3625808982548182 43.684553266402595 255.0 -120 260 1.3626413158974315 43.68455367999552 255.0 -130 260 1.3627017336618856 43.68455409355805 255.0 -140 260 1.3627621515481834 43.68455450709019 255.0 -150 260 1.3628225695563276 43.684554920591935 255.0 160 260 1.3628829876863213 43.68455533406329 255.0 -170 260 1.3629434059381678 43.68455574750425 255.0 -180 260 1.3630038243118694 43.684556160914816 255.0 -190 260 1.3630642428074295 43.684556574294994 255.0 -200 260 1.363124661424851 43.68455698764478 255.0 210 260 1.3631850801641365 43.684557400964174 255.0 -220 260 1.3632454990252891 43.68455781425318 255.0 -230 260 1.363305918008312 43.68455822751179 255.0 -240 260 1.3633663371132079 43.684558640740015 255.0 -250 260 1.3634267563399796 43.684559053937846 255.0 260 260 1.3634871756886302 43.68455946710529 255.0 -270 260 1.3635475951591627 43.68455988024234 255.0 -280 260 1.3636080147515799 43.684560293349 255.0 -290 260 1.3636684344658847 43.68456070642527 255.0 -0 270 1.3619165462409386 43.684503596955686 255.0 -10 270 1.361976962527767 43.68450401083806 255.0 -20 270 1.3620373789364049 43.68450442469004 255.0 -30 270 1.3620977954668556 43.68450483851162 255.0 -40 270 1.3621582121191218 43.68450525230281 255.0 -50 270 1.362218628893207 43.6845056660636 255.0 -60 270 1.3622790457891136 43.684506079794 255.0 -70 270 1.3623394628068448 43.684506493494 255.0 -80 270 1.3623998799464034 43.68450690716361 255.0 -90 270 1.3624602972077926 43.68450732080282 255.0 -100 270 1.3625207145910152 43.68450773441164 255.0 -110 270 1.3625811320960741 43.684508147990066 255.0 -120 270 1.3626415497229722 43.684508561538095 255.0 -130 270 1.3627019674717127 43.684508975055735 255.0 -140 270 1.362762385342298 43.68450938854298 255.0 -150 270 1.3628228033347318 43.68450980199983 255.0 -160 270 1.3628832214490167 43.68451021542629 255.0 -170 270 1.3629436396851555 43.68451062882236 255.0 -180 270 1.363004058043151 43.684511042188035 255.0 -190 270 1.3630644765230067 43.68451145552332 255.0 -200 270 1.3631248951247252 43.68451186882821 255.0 -210 270 1.3631853138483094 43.68451228210271 255.0 -220 270 1.3632457326937621 43.684512695346825 255.0 -230 270 1.3633061516610867 43.684513108560544 255.0 -240 270 1.3633665707502858 43.68451352174387 255.0 -250 270 1.3634269899613622 43.684513934896806 255.0 -260 270 1.3634874092943192 43.684514348019356 255.0 -270 270 1.3635478287491594 43.684514761111515 255.0 -280 270 1.3636082483258858 43.68451517417328 255.0 -290 270 1.3636686680245016 43.68451558720466 255.0 -0 280 1.3619167802073662 43.68445847902013 255.0 -10 280 1.3619771964784615 43.68445889285761 255.0 -20 280 1.3620376128713683 43.6844593066647 255.0 -30 280 1.3620980293860891 43.68445972044139 255.0 -40 280 1.3621584460226275 43.68446013418768 255.0 -50 280 1.3622188627809857 43.68446054790358 255.0 -60 280 1.3622792796611671 43.68446096158908 255.0 -70 280 1.362339696663175 43.68446137524419 255.0 -80 280 1.3624001137870114 43.68446178886891 255.0 -90 280 1.36246053103268 43.68446220246322 255.0 -100 280 1.3625209484001837 43.684462616027155 255.0 -110 280 1.3625813658895252 43.68446302956068 255.0 -120 280 1.3626417835007072 43.68446344306382 255.0 -130 280 1.3627022012337333 43.68446385653657 255.0 -140 280 1.3627626190886062 43.68446426997892 255.0 -150 280 1.3628230370653285 43.68446468339088 255.0 -160 280 1.3628834551639035 43.68446509677244 255.0 -170 280 1.362943873384334 43.684465510123616 255.0 -180 280 1.363004291726623 43.6844659234444 255.0 -190 280 1.3630647101907734 43.684466336734786 255.0 -200 280 1.3631251287767883 43.68446674999478 255.0 -210 280 1.3631855474846704 43.68446716322439 255.0 -220 280 1.3632459663144225 43.68446757642361 255.0 -230 280 1.3633063852660479 43.68446798959243 255.0 -240 280 1.3633668043395495 43.684468402730865 255.0 -250 280 1.36342722353493 43.684468815838905 255.0 -260 280 1.3634876428521925 43.68446922891656 255.0 -270 280 1.3635480622913396 43.68446964196382 255.0 -280 280 1.3636084818523748 43.68447005498069 255.0 -290 280 1.3636689015353007 43.68447046796718 255.0 -0 290 1.361917014125983 43.68441336106773 255.0 -10 290 1.361977430381345 43.684413774860325 255.0 -20 290 1.3620378467585197 43.68441418862252 255.0 -30 290 1.3620982632575103 43.68441460235431 255.0 -40 290 1.3621586798783194 43.68441501605571 255.0 -50 290 1.3622190966209504 43.68441542972671 255.0 -60 290 1.362279513485406 43.684415843367326 255.0 -70 290 1.3623399304716894 43.68441625697754 255.0 -80 290 1.3624003475798032 43.68441667055736 255.0 -90 290 1.3624607648097506 43.684417084106784 255.0 -100 290 1.3625211821615344 43.684417497625816 255.0 -110 290 1.3625815996351576 43.68441791111445 255.0 -120 290 1.3626420172306233 43.6844183245727 255.0 -130 290 1.3627024349479342 43.684418738000545 255.0 -140 290 1.3627628527870934 43.684419151398004 255.0 -150 290 1.3628232707481038 43.684419564765065 255.0 -160 290 1.362883688830968 43.68441997810174 255.0 -170 290 1.3629441070356898 43.68442039140802 255.0 -180 290 1.3630045253622713 43.6844208046839 255.0 -190 290 1.3630649438107159 43.6844212179294 255.0 -200 290 1.3631253623810262 43.6844216311445 255.0 -210 290 1.3631857810732055 43.68442204432921 255.0 -220 290 1.3632461998872565 43.684422457483535 255.0 -230 290 1.3633066188231822 43.68442287060746 255.0 -240 290 1.3633670378809855 43.684423283701 255.0 -250 290 1.3634274570606693 43.68442369676415 255.0 -260 290 1.3634878763622365 43.68442410979691 255.0 -270 290 1.3635482957856901 43.684424522799276 255.0 -280 290 1.3636087153310332 43.68442493577125 255.0 -290 290 1.3636691349982684 43.684425348712836 255.0 diff --git a/Data/Input/spot6/spot6-1.gcp2 b/Data/Input/spot6/spot6-1.gcp2 index 3a18ceb077..9869d7f717 100644 --- a/Data/Input/spot6/spot6-1.gcp2 +++ b/Data/Input/spot6/spot6-1.gcp2 @@ -1,901 +1,37 @@ -#From file /work/scratch/osmanj/otb_valid/spot6-1.geom -0 0 1.7338304667177207 41.681598613425585 500.0 -10 0 1.7345895029992957 41.68160260991629 500.0 -20 0 1.7353485280057404 41.68160660099113 500.0 -30 0 1.7361075417393081 41.681610586650365 500.0 -40 0 1.7368665442022515 41.68161456689424 500.0 -50 0 1.7376255353968233 41.68161854172301 500.0 -60 0 1.7383845153252757 41.68162251113692 500.0 -70 0 1.739143483989861 41.68162647513622 500.0 -80 0 1.7399024413928317 41.68163043372117 500.0 -90 0 1.7406613875364398 41.681634386892 500.0 -100 0 1.7414203224229374 41.68163833464897 500.0 -110 0 1.7421792460545766 41.681642276992335 500.0 -120 0 1.7429381584336088 41.68164621392234 500.0 -130 0 1.7436970595622858 41.681650145439235 500.0 -140 0 1.744455949442859 41.68165407154327 500.0 -150 0 1.7452148280775805 41.68165799223469 500.0 -160 0 1.745973695468701 41.68166190751375 500.0 -170 0 1.746732551618472 41.6816658173807 500.0 -180 0 1.7474913965291445 41.68166972183578 500.0 -190 0 1.7482502302029697 41.681673620879245 500.0 -200 0 1.749009052642198 41.68167751451135 500.0 -210 0 1.7497678638490806 41.68168140273233 500.0 -220 0 1.7505266638258679 41.68168528554244 500.0 -230 0 1.7512854525748107 41.681689162941936 500.0 -240 0 1.7520442300981591 41.681693034931065 500.0 -250 0 1.7528029963981635 41.681696901510065 500.0 -260 0 1.7535617514770743 41.68170076267919 500.0 -270 0 1.7543204953371414 41.681704618438694 500.0 -280 0 1.7550792279806149 41.68170846878882 500.0 -290 0 1.7558379494097442 41.68171231372982 500.0 -0 10 1.7338356457135158 41.68103555876609 500.0 +# column row longitude latitude elevation 10 10 1.7345946713155105 41.68103955441226 500.0 -20 10 1.7353536856459966 41.68104354464274 500.0 -30 10 1.7361126887072271 41.68104752945778 500.0 -40 10 1.7368716805014537 41.68105150885763 500.0 -50 10 1.7376306610309293 41.68105548284253 500.0 60 10 1.7383896302979058 41.68105945141275 500.0 -70 10 1.739148588304635 41.68106341456853 500.0 -80 10 1.739907535053369 41.68106737231011 500.0 -90 10 1.7406664705463593 41.681071324637756 500.0 -100 10 1.7414253947858578 41.681075271551705 500.0 110 10 1.742184307774116 41.68107921305222 500.0 -120 10 1.742943209513385 41.68108314913954 500.0 -130 10 1.7437021000059167 41.68108707981391 500.0 -140 10 1.7444609792539618 41.68109100507559 500.0 -150 10 1.7452198472597713 41.68109492492483 500.0 160 10 1.7459787040255967 41.681098839361866 500.0 -170 10 1.7467375495536888 41.681102748386955 500.0 -180 10 1.7474963838462976 41.68110665200035 500.0 -190 10 1.7482552069056743 41.6811105502023 500.0 -200 10 1.7490140187340695 41.68111444299305 500.0 210 10 1.7497728193337332 41.68111833037284 500.0 -220 10 1.7505316087069158 41.68112221234194 500.0 -230 10 1.7512903868558678 41.68112608890058 500.0 -240 10 1.7520491537828389 41.68112996004901 500.0 -250 10 1.7528079094900788 41.6811338257875 500.0 260 10 1.753566653979838 41.68113768611627 500.0 -270 10 1.7543253872543656 41.681141541035586 500.0 -280 10 1.7550841093159115 41.68114539054569 500.0 -290 10 1.7558428201667249 41.68114923464683 500.0 -0 20 1.7338408230276385 41.68047250360779 500.0 -10 20 1.7345998379512135 41.68047649840954 500.0 -20 20 1.7353588416069015 41.680480487795776 500.0 -30 20 1.736117833996955 41.68048447176673 500.0 -40 20 1.736876815123625 41.68048845032267 500.0 -50 20 1.7376357849891642 41.68049242346383 500.0 -60 20 1.7383947435958238 41.680496391190474 500.0 -70 20 1.7391536909458558 41.68050035350284 500.0 -80 20 1.7399126270415117 41.68050431040119 500.0 -90 20 1.7406715518850424 41.68050826188576 500.0 -100 20 1.7414304654786998 41.68051220795681 500.0 -110 20 1.7421893678247349 41.68051614861458 500.0 -120 20 1.7429482589253984 41.68052008385932 500.0 -130 20 1.7437071387829415 41.6805240136913 500.0 -140 20 1.7444660073996152 41.680527938110735 500.0 -150 20 1.7452248647776696 41.6805318571179 500.0 -160 20 1.745983710919356 41.680535770713036 500.0 -170 20 1.7467425458269243 41.680539678896395 500.0 -180 20 1.7475013695026254 41.68054358166822 500.0 -190 20 1.748260181948709 41.68054747902877 500.0 -200 20 1.7490189831674257 41.68055137097828 500.0 -210 20 1.7497777731610251 41.680555257517 500.0 -220 20 1.7505365519317573 41.680559138645194 500.0 -230 20 1.7512953194818721 41.6805630143631 500.0 -240 20 1.7520540758136192 41.68056688467097 500.0 -250 20 1.7528128209292482 41.68057074956904 500.0 -260 20 1.7535715548310085 41.68057460905757 500.0 -270 20 1.7543302775211493 41.68057846313682 500.0 -280 20 1.75508898900192 41.680582311807015 500.0 -290 20 1.7558476892755694 41.68058615506841 500.0 -0 30 1.7338459986601353 41.67990944795114 500.0 -10 30 1.734605002906452 41.679913441908596 500.0 -20 30 1.7353639958885023 41.6799174304507 500.0 -30 30 1.7361229776085387 41.679921413577695 500.0 -40 30 1.736881948068812 41.67992539128984 500.0 -50 30 1.7376409072715742 41.67992936358738 500.0 -60 30 1.7383998552190765 41.67993333047056 500.0 -70 30 1.7391587919135703 41.67993729193964 500.0 -80 30 1.7399177173573066 41.679941247994854 500.0 -90 30 1.7406766315525362 41.679945198636474 500.0 -100 30 1.7414355345015105 41.67994914386473 500.0 -110 30 1.7421944262064797 41.679953083679884 500.0 -120 30 1.742953306669695 41.67995701808217 500.0 -130 30 1.7437121758934064 41.679960947071855 500.0 -140 30 1.744471033879865 41.67996487064918 500.0 -150 30 1.745229880631321 41.67996878881439 500.0 -160 30 1.745988716150024 41.67997270156774 500.0 -170 30 1.7467475404382249 41.67997660890948 500.0 -180 30 1.7475063534981732 41.67998051083985 500.0 -190 30 1.7482651553321187 41.67998440735911 500.0 -200 30 1.7490239459423116 41.6799882984675 500.0 -210 30 1.7497827253310012 41.67999218416527 500.0 -220 30 1.750541493500437 41.67999606445268 500.0 -230 30 1.7513002504528687 41.67999993932996 500.0 -240 30 1.7520589961905455 41.68000380879737 500.0 -250 30 1.7528177307157162 41.68000767285516 500.0 -260 30 1.7535764540306307 41.680011531503574 500.0 -270 30 1.7543351661375373 41.68001538474286 500.0 -280 30 1.7550938670386849 41.680019232573265 500.0 -290 30 1.7558525567363223 41.68002307499504 500.0 -0 40 1.733851172611054 41.679346391796614 500.0 -10 40 1.7346101661812727 41.67935038490989 500.0 -20 40 1.7353691484908458 41.67935437260798 500.0 -30 40 1.736128119542025 41.67935835489113 500.0 -40 40 1.7368870793370614 41.6793623317596 500.0 -50 40 1.7376460278782064 41.67936630321363 500.0 -60 40 1.7384049651677105 41.67937026925347 500.0 -70 40 1.7391638912078247 41.67937422987937 500.0 -80 40 1.7399228060007996 41.679378185091586 500.0 -90 40 1.7406817095488862 41.67938213489036 500.0 -100 40 1.7414406018543351 41.67938607927594 500.0 -110 40 1.7421994829193963 41.67939001824859 500.0 -120 40 1.7429583527463206 41.67939395180854 500.0 -130 40 1.7437172113373576 41.679397879956056 500.0 -140 40 1.7444760586947579 41.67940180269138 500.0 -150 40 1.745234894820771 41.679405720014756 500.0 -160 40 1.7459937197176472 41.67940963192643 500.0 -170 40 1.7467525333876357 41.679413538426665 500.0 -180 40 1.7475113358329866 41.6794174395157 500.0 -190 40 1.748270127055949 41.679421335193794 500.0 -200 40 1.7490289070587728 41.67942522546118 500.0 -210 40 1.749787675843707 41.67942911031812 500.0 -220 40 1.7505464334130005 41.679432989764855 500.0 -230 40 1.7513051797689025 41.679436863801634 500.0 -240 40 1.7520639149136623 41.67944073242871 500.0 -250 40 1.7528226388495283 41.67944459564632 500.0 -260 40 1.7535813515787493 41.67944845345473 500.0 -270 40 1.754340053103574 41.67945230585418 500.0 -280 40 1.7550987434262506 41.679456152844914 500.0 -290 40 1.755857422549028 41.679459994427184 500.0 -0 50 1.7338563448804416 41.67878333514467 500.0 -10 50 1.734615327775723 41.678787327413886 500.0 -20 50 1.7353742994139791 41.67879131426808 500.0 -30 50 1.7361332597974615 41.6787952957075 500.0 -40 50 1.7368922089284207 41.67879927173241 500.0 -50 50 1.7376511468091074 41.678803242343044 500.0 -60 50 1.738410073441772 41.67880720753966 500.0 -70 50 1.7391689888286654 41.67881116732251 500.0 -80 50 1.7399278929720379 41.678815121691834 500.0 -90 50 1.7406867858741395 41.67881907064788 500.0 -100 50 1.7414456675372207 41.67882301419092 500.0 -110 50 1.7422045379635314 41.678826952321174 500.0 -120 50 1.7429633971553216 41.678830885038906 500.0 -130 50 1.7437222451148406 41.67883481234437 500.0 -140 50 1.744481081844339 41.6788387342378 500.0 -150 50 1.7452399073460658 41.67884265071946 500.0 -160 50 1.7459987216222703 41.678846561789584 500.0 -170 50 1.7467575246752025 41.678850467448434 500.0 -180 50 1.7475163165071113 41.67885436769625 500.0 -190 50 1.7482750971202456 41.67885826253329 500.0 -200 50 1.7490338665168548 41.67886215195979 500.0 -210 50 1.7497926246991875 41.67886603597601 500.0 -220 50 1.7505513716694927 41.67886991458219 500.0 -230 50 1.7513101074300188 41.678873787778585 500.0 -240 50 1.7520688319830147 41.67887765556544 500.0 -250 50 1.752827545330729 41.678881517943 500.0 -260 50 1.7535862474754091 41.678885374911516 500.0 -270 50 1.7543449384193042 41.67888922647124 500.0 -280 50 1.7551036181646622 41.678893072622415 500.0 -290 50 1.7558622867137308 41.67889691336529 500.0 -0 60 1.733861515468345 41.678220277995784 500.0 10 60 1.7346204876898499 41.67822426942105 500.0 -20 60 1.7353794486579492 41.67822825543146 500.0 -30 60 1.7361383983748946 41.67823223602728 500.0 -40 60 1.736897336842936 41.67823621120874 500.0 -50 60 1.7376562640643238 41.678240180976104 500.0 60 60 1.7384151800413081 41.67824414532961 500.0 -70 60 1.7391740847761392 41.678248104269514 500.0 -80 60 1.7399329782710673 41.678252057796065 500.0 -90 60 1.7406918605283421 41.67825600590952 500.0 -100 60 1.7414507315502132 41.67825994861011 500.0 110 60 1.7422095913389306 41.6782638858981 500.0 -120 60 1.7429684398967435 41.67826781777373 500.0 -130 60 1.743727277225902 41.67827174423725 500.0 -140 60 1.7444861033286545 41.678275665288915 500.0 -150 60 1.745244918207251 41.678279580928965 500.0 160 60 1.7460037218639402 41.67828349115766 500.0 -170 60 1.746762514300971 41.67828739597524 500.0 -180 60 1.7475212955205925 41.67829129538195 500.0 -190 60 1.7482800655250534 41.678295189378055 500.0 -200 60 1.7490388243166024 41.678299077963786 500.0 210 60 1.749797571897488 41.6783029611394 500.0 -220 60 1.7505563082699587 41.678306838905144 500.0 -230 60 1.7513150334362626 41.67831071126127 500.0 -240 60 1.7520737473986479 41.67831457820802 500.0 -250 60 1.7528324501593628 41.67831843974564 500.0 260 60 1.7535911417206551 41.67832229587439 500.0 -270 60 1.7543498220847729 41.6783261465945 500.0 -280 60 1.7551084912539638 41.67832999190624 500.0 -290 60 1.7558671492304754 41.678333831809844 500.0 -0 70 1.7338666843748118 41.67765722035041 500.0 -10 70 1.7346256459237004 41.67766121093185 500.0 -20 70 1.7353845962228034 41.6776651960986 500.0 -30 70 1.7361435352743713 41.67766917585092 500.0 -40 70 1.7369024630806542 41.67767315018906 500.0 -50 70 1.7376613796439024 41.67767711911326 500.0 -60 70 1.7384202849663652 41.67768108262378 500.0 -70 70 1.7391791790502926 41.67768504072086 500.0 -80 70 1.7399380618979345 41.67768899340476 500.0 -90 70 1.74069693351154 41.67769294067572 500.0 -100 70 1.7414557938933588 41.677696882533986 500.0 -110 70 1.7422146430456402 41.67770081897982 500.0 -120 70 1.742973480970633 41.67770475001346 500.0 -130 70 1.7437323076705868 41.67770867563517 500.0 -140 70 1.7444911231477502 41.67771259584518 500.0 -150 70 1.7452499274043722 41.67771651064375 500.0 -160 70 1.7460087204427015 41.677720420031115 500.0 -170 70 1.7467675022649864 41.67772432400754 500.0 -180 70 1.747526272873476 41.67772822257327 500.0 -190 70 1.7482850322704182 41.67773211572855 500.0 -200 70 1.7490437804580614 41.67773600347363 500.0 -210 70 1.749802517438654 41.67773988580876 500.0 -220 70 1.7505612432144437 41.67774376273419 500.0 -230 70 1.7513199577876786 41.67774763425015 500.0 -240 70 1.7520786611606063 41.67775150035692 500.0 -250 70 1.7528373533354749 41.67775536105472 500.0 -260 70 1.7535960343145318 41.67775921634381 500.0 -270 70 1.7543547041000245 41.677763066224436 500.0 -280 70 1.7551133626942002 41.677766910696846 500.0 -290 70 1.7558720100993062 41.677770749761294 500.0 -0 80 1.7338718515998892 41.67709416220902 500.0 -10 80 1.7346308024773216 41.677098151946744 500.0 -20 80 1.7353897421085878 41.67710213626995 500.0 -30 80 1.7361486704959384 41.677106115178894 500.0 -40 80 1.7369075876416227 41.67711008867382 500.0 -50 80 1.73766649354789 41.67711405675498 500.0 -60 80 1.73842538821699 41.67711801942263 500.0 -70 80 1.7391842716511723 41.67712197667701 500.0 -80 80 1.7399431438526858 41.677125928518365 500.0 -90 80 1.74070200482378 41.67712987494695 500.0 -100 80 1.741460854566704 41.67713381596302 500.0 -110 80 1.7422196930837064 41.67713775156681 500.0 -120 80 1.742978520377036 41.677141681758584 500.0 -130 80 1.743737336448942 41.67714560653859 500.0 -140 80 1.7444961413016722 41.67714952590706 500.0 -150 80 1.7452549349374755 41.67715343986426 500.0 -160 80 1.7460137173586003 41.67715734841043 500.0 -170 80 1.7467724885672948 41.67716125154582 500.0 -180 80 1.747531248565807 41.67716514927068 500.0 -190 80 1.7482899973563852 41.67716904158526 500.0 -200 80 1.7490487349412769 41.6771729284898 500.0 -210 80 1.7498074613227301 41.67717680998456 500.0 -220 80 1.750566176502993 41.67718068606978 500.0 -230 80 1.751324880484312 41.677184556745715 500.0 -240 80 1.7520835732689353 41.677188422012605 500.0 -250 80 1.7528422548591105 41.6771922818707 500.0 -260 80 1.7536009252570839 41.677196136320255 500.0 -270 80 1.7543595844651032 41.677199985361504 500.0 -280 80 1.7551182324854155 41.677203828994706 500.0 -290 80 1.7558768693202675 41.67720766722011 500.0 -0 90 1.7338770171436237 41.676531103572074 500.0 -10 90 1.7346359573507604 41.6765350924662 500.0 -20 90 1.7353948863153503 41.67653907594598 500.0 -30 90 1.736153804039643 41.67654305401167 500.0 -40 90 1.7369127105258872 41.6765470266635 500.0 -50 90 1.737671605776333 41.67655099390174 500.0 -60 90 1.738430489793229 41.67655495572663 500.0 -70 90 1.7391893625788244 41.67655891213841 500.0 -80 90 1.7399482241353679 41.67656286313735 500.0 -90 90 1.7407070744651085 41.676566808723685 500.0 -100 90 1.7414659135702948 41.67657074889766 500.0 -110 90 1.742224741453175 41.67657468365954 500.0 -120 90 1.7429835581159983 41.67657861300956 500.0 -130 90 1.7437423635610125 41.676582536947976 500.0 -140 90 1.7445011577904657 41.676586455475025 500.0 -150 90 1.7452599408066063 41.67659036859097 500.0 -160 90 1.7460187126116824 41.67659427629606 500.0 -170 90 1.7467774732079413 41.67659817859053 500.0 -180 90 1.7475362225976312 41.67660207547464 500.0 -190 90 1.7482949607829996 41.67660596694863 500.0 -200 90 1.7490536877662943 41.676609853012756 500.0 -210 90 1.7498124035497622 41.67661373366726 500.0 -220 90 1.7505711081356512 41.676617608912395 500.0 -230 90 1.751329801526208 41.6766214787484 500.0 -240 90 1.7520884837236796 41.67662534317554 500.0 -250 90 1.7528471547303135 41.67662920219405 500.0 -260 90 1.7536058145483562 41.676633055804174 500.0 -270 90 1.7543644631800546 41.67663690400617 500.0 -280 90 1.755123100627655 41.67664074680029 500.0 -290 90 1.7558817268934042 41.67664458418676 500.0 -0 100 1.7338821810060632 41.67596804444004 500.0 -10 100 1.7346411105440642 41.67597203249069 500.0 -20 100 1.7354000288431375 41.67597601512716 500.0 -30 100 1.7361589359055314 41.6759799923497 500.0 -40 100 1.7369178317334955 41.67598396415856 500.0 -50 100 1.7376767163292783 41.675987930553994 500.0 -60 100 1.738435589695129 41.675991891536235 500.0 -70 100 1.7391944518332956 41.675995847105554 500.0 -80 100 1.7399533027460268 41.675999797262186 500.0 -90 100 1.7407121424355714 41.67600374200638 500.0 -100 100 1.7414709709041774 41.67600768133839 500.0 -110 100 1.742229788154093 41.67601161525846 500.0 -120 100 1.742988594187566 41.676015543766844 500.0 -130 100 1.743747389006845 41.67601946686379 500.0 -140 100 1.7445061726141773 41.676023384549545 500.0 -150 100 1.745264945011811 41.67602729682435 500.0 -160 100 1.7460237062019932 41.67603120368847 500.0 -170 100 1.7467824561869716 41.67603510514214 500.0 -180 100 1.747541194968994 41.67603900118561 500.0 -190 100 1.7482999225503073 41.67604289181914 500.0 -200 100 1.7490586389331586 41.676046777042956 500.0 -210 100 1.749817344119795 41.67605065685732 500.0 -220 100 1.7505760381124638 41.67605453126249 500.0 -230 100 1.7513347209134111 41.6760584002587 500.0 -240 100 1.7520933925248843 41.67606226384619 500.0 -250 100 1.7528520529491294 41.676066122025226 500.0 -260 100 1.7536107021883933 41.67606997479605 500.0 -270 100 1.7543693402449225 41.676073822158905 500.0 -280 100 1.7551279671209628 41.67607766411405 500.0 -290 100 1.7558865828187602 41.67608150066171 500.0 -0 110 1.7338873431872546 41.67540498481338 500.0 10 110 1.7346462620572802 41.67540897202067 500.0 -20 110 1.735405169691996 41.67541295381395 500.0 -30 110 1.736164066093651 41.675416930193464 500.0 -40 110 1.736922951264494 41.67542090115946 500.0 -50 110 1.7376818252067727 41.675424866712206 500.0 60 110 1.738440687922736 41.67542882685193 500.0 -70 110 1.7391995394146322 41.675432781578884 500.0 -80 110 1.7399583796847091 41.67543673089333 500.0 -90 110 1.740717208735215 41.6754406747955 500.0 -100 110 1.741476026568398 41.67544461328566 500.0 110 110 1.7422348331865054 41.675448546364045 500.0 -120 110 1.7429936285917853 41.67545247403091 500.0 -130 110 1.7437524127864852 41.675456396286506 500.0 -140 110 1.7445111857728524 41.67546031313107 500.0 -150 110 1.7452699475531344 41.67546422456486 500.0 160 110 1.7460286981295783 41.67546813058813 500.0 -170 110 1.7467874375044314 41.67547203120111 500.0 -180 110 1.747546165679941 41.67547592640406 500.0 -190 110 1.7483048826583532 41.67547981619723 500.0 -200 110 1.7490635884419152 41.67548370058087 500.0 210 110 1.7498222830328738 41.67548757955522 500.0 -220 110 1.7505809664334757 41.67549145312053 500.0 -230 110 1.751339638645967 41.67549532127705 500.0 -240 110 1.7520982996725938 41.67549918402502 500.0 -250 110 1.752856949515603 41.6755030413647 500.0 260 110 1.7536155881772402 41.67550689329634 500.0 -270 110 1.7543742156597515 41.67551073982017 500.0 -280 110 1.7551328319653832 41.675514580936444 500.0 -290 110 1.7558914370963805 41.675518416645424 500.0 -0 120 1.7338925036872446 41.674841924692565 500.0 -10 120 1.7346514118904546 41.67484591105661 500.0 -20 120 1.7354103088619734 41.674849892006804 500.0 -30 120 1.7361691946040487 41.67485386754341 500.0 -40 120 1.736928069118929 41.67485783766668 500.0 -50 120 1.7376869324088626 41.67486180237684 500.0 -60 120 1.7384457844760972 41.67486576167416 500.0 -70 120 1.7392046253228808 41.674869715558884 500.0 -80 120 1.739963454951461 41.67487366403125 500.0 -90 120 1.740722273364086 41.674877607091524 500.0 -100 120 1.7414810805630028 41.67488154473995 500.0 -110 120 1.742239876550459 41.67488547697676 500.0 -120 120 1.742998661328702 41.674889403802226 500.0 -130 120 1.743757434899979 41.67489332521658 500.0 -140 120 1.7445161972665368 41.67489724122008 500.0 -150 120 1.745274948430623 41.67490115181297 500.0 -160 120 1.7460336883944836 41.67490505699549 500.0 -170 120 1.7467924171603664 41.67490895676791 500.0 -180 120 1.747551134730517 41.67491285113046 500.0 -190 120 1.7483098411071827 41.6749167400834 500.0 -200 120 1.7490685362926095 41.67492062362696 500.0 -210 120 1.749827220289044 41.6749245017614 500.0 -220 120 1.750585893098732 41.674928374486974 500.0 -230 120 1.75134455472392 41.67493224180392 500.0 -240 120 1.7521032051668535 41.6749361037125 500.0 -250 120 1.7528618444297785 41.67493996021294 500.0 -260 120 1.7536204725149416 41.674943811305496 500.0 -270 120 1.754379089424587 41.67494765699042 500.0 -280 120 1.755137695160961 41.67495149726796 500.0 -290 120 1.755896289726309 41.67495533213836 500.0 -0 130 1.7338976625060807 41.67427886407805 500.0 -10 130 1.7346565600436352 41.67428284959897 500.0 -20 130 1.735415446353116 41.67428682970621 500.0 -30 130 1.736174321436771 41.67429080440002 500.0 -40 130 1.736933185296848 41.674294773680664 500.0 -50 130 1.7376920379355947 41.67429873754837 500.0 -60 130 1.7384508793552589 41.6743026960034 500.0 -70 130 1.7392097095580878 41.674306649046 500.0 -80 130 1.7399685285463293 41.67431059667642 500.0 -90 130 1.7407273363222302 41.674314538894905 500.0 -100 130 1.7414861328880382 41.6743184757017 500.0 -110 130 1.7422449182459996 41.674322407097065 500.0 -120 130 1.743003692398362 41.67432633308124 500.0 -130 130 1.743762455347372 41.67433025365448 500.0 -140 130 1.7445212070952765 41.674334168817026 500.0 -150 130 1.7452799476443217 41.67433807856913 500.0 -160 130 1.7460386769967549 41.67434198291104 500.0 -170 130 1.7467973951548212 41.674345881843 500.0 -180 130 1.7475561021207682 41.674349775365265 500.0 -190 130 1.7483147978968414 41.67435366347808 500.0 -200 130 1.7490734824852865 41.674357546181696 500.0 -210 130 1.7498321558883503 41.674361423476356 500.0 -220 130 1.7505908181082779 41.67436529536231 500.0 -230 130 1.7513494691473155 41.6743691618398 500.0 -240 130 1.7521081090077082 41.67437302290908 500.0 -250 130 1.7528667376917018 41.6743768785704 500.0 -260 130 1.7536253552015417 41.674380728824 500.0 -270 130 1.754383961539473 41.67438457367014 500.0 -280 130 1.7551425567077408 41.67438841310905 500.0 -290 130 1.7559011407085903 41.674392247140986 500.0 -0 140 1.7339028196438102 41.67371580297031 500.0 -10 140 1.734661706516869 41.67371978764822 500.0 -20 140 1.7354205821654713 41.673723766912616 500.0 -30 140 1.736179446591865 41.67372774076376 500.0 -40 140 1.7369382997982974 41.67373170920189 500.0 -50 140 1.737697141787016 41.67373567222726 500.0 -60 140 1.7384559725602675 41.673739629840114 500.0 -70 140 1.7392147921202998 41.67374358204071 500.0 -80 140 1.7399736004693598 41.67374752882929 500.0 -90 140 1.7407323976096944 41.673751470206106 500.0 -100 140 1.7414911835435498 41.6737554061714 500.0 -110 140 1.7422499582731734 41.673759336725425 500.0 -120 140 1.7430087218008115 41.67376326186844 500.0 -130 140 1.7437674741287108 41.673767181600674 500.0 -140 140 1.7445262152591172 41.67377109592238 500.0 -150 140 1.7452849451942771 41.673775004833814 500.0 -160 140 1.746043663936437 41.67377890833522 500.0 -170 140 1.7468023714878425 41.67378280642685 500.0 -180 140 1.7475610678507396 41.673786699108945 500.0 -190 140 1.7483197530273742 41.67379058638176 500.0 -200 140 1.7490784270199917 41.67379446824554 500.0 -210 140 1.749837089830838 41.67379834470052 500.0 -220 140 1.7505957414621582 41.673802215746974 500.0 -230 140 1.751354381916198 41.67380608138513 500.0 -240 140 1.7521130111952026 41.67380994161524 500.0 -250 140 1.7528716293014166 41.67381379643755 500.0 -260 140 1.7536302362370857 41.67381764585231 500.0 -270 140 1.754388832004454 41.673821489859776 500.0 -280 140 1.755147416605767 41.673825328460175 500.0 -290 140 1.755905990043269 41.67382916165377 500.0 -0 150 1.7339079751004798 41.673152741369805 500.0 -10 150 1.7346668513102024 41.67315672520482 500.0 -20 150 1.7354257162990858 41.67316070362649 500.0 -30 150 1.7361845700693772 41.673164676635075 500.0 -40 150 1.7369434126233239 41.67316864423081 500.0 -50 150 1.7377022439631724 41.673172606413964 500.0 -60 150 1.73846106409117 41.67317656318477 500.0 -70 150 1.7392198730095634 41.673180514543475 500.0 -80 150 1.7399786707205993 41.67318446049033 500.0 -90 150 1.7407374572265242 41.67318840102559 500.0 -100 150 1.7414962325295846 41.673192336149505 500.0 -110 150 1.7422549966320264 41.673196265862316 500.0 -120 150 1.7430137495360967 41.673200190164266 500.0 -130 150 1.7437724912440407 41.67320410905562 500.0 -140 150 1.7445312217581048 41.67320802253661 500.0 -150 150 1.7452899410805347 41.67321193060749 500.0 -160 150 1.7460486492135763 41.673215833268515 500.0 -170 150 1.746807346159475 41.673219730519925 500.0 -180 150 1.7475660319204769 41.67322362236197 500.0 -190 150 1.7483247064988268 41.673227508794895 500.0 -200 150 1.7490833698967703 41.67323138981895 500.0 -210 150 1.7498420221165525 41.673235265434386 500.0 -220 150 1.7506006631604183 41.673239135641445 500.0 -230 150 1.751359293030613 41.67324300044038 500.0 -240 150 1.7521179117293815 41.67324685983144 500.0 -250 150 1.7528765192589681 41.67325071381486 500.0 -260 150 1.753635115621618 41.673254562390895 500.0 -270 150 1.754393700819575 41.6732584055598 500.0 -280 150 1.755152274855084 41.67326224332181 500.0 -290 150 1.7559108377303891 41.673266075677176 500.0 -0 160 1.7339131288761371 41.672589679276996 500.0 10 160 1.734671994423683 41.672593662269236 500.0 -20 160 1.7354308487540067 41.672597639848306 500.0 -30 160 1.7361896918693547 41.67260161201445 500.0 -40 160 1.7369485237719737 41.672605578767914 500.0 -50 160 1.737707344464111 41.67260954010896 500.0 60 160 1.7384661539480124 41.67261349603782 500.0 -70 160 1.7392249522259247 41.67261744655476 500.0 -80 160 1.7399837393000939 41.672621391660016 500.0 -90 160 1.7407425151727662 41.672625331353835 500.0 -100 160 1.741501279846188 41.67262926563648 500.0 110 160 1.742260033322605 41.67263319450819 500.0 -120 160 1.7430187756042628 41.6726371179692 500.0 -130 160 1.7437775066934076 41.67264103601978 500.0 -140 160 1.7445362265922846 41.67264494866018 500.0 -150 160 1.7452949353031397 41.67264885589062 500.0 160 160 1.7460536328282181 41.672652757711376 500.0 -170 160 1.7468123191697649 41.67265665412268 500.0 -180 160 1.747570994330025 41.67266054512479 500.0 -190 160 1.7483296583112444 41.67266443071795 500.0 -200 160 1.7490883111156674 41.6726683109024 500.0 210 160 1.7498469527455387 41.6726721856784 500.0 -220 160 1.750605583203103 41.67267605504619 500.0 -230 160 1.7513642024906053 41.67267991900602 500.0 -240 160 1.75212281061029 41.672683777558134 500.0 -250 160 1.7528814075644013 41.67268763070279 500.0 260 160 1.7536399933551832 41.672691478440214 500.0 -270 160 1.7543985679848804 41.67269532077068 500.0 -280 160 1.7551571314557366 41.67269915769441 500.0 -290 160 1.7559156837699956 41.67270298921167 500.0 -0 170 1.7339182809708287 41.67202661669236 500.0 -10 170 1.7346771358573576 41.672030598841936 500.0 -20 170 1.7354359795302805 41.672034575578515 500.0 -30 170 1.736194811991844 41.672038546902336 500.0 -40 170 1.7369536332442947 41.67204251281365 500.0 -50 170 1.7377124432898785 41.6720464733127 500.0 -60 170 1.7384712421308417 41.67205042839974 500.0 -70 170 1.73923002976943 41.672054378075025 500.0 -80 170 1.7399888062078899 41.67205832233879 500.0 -90 170 1.7407475714484668 41.6720622611913 500.0 -100 170 1.7415063254934064 41.67206619463279 500.0 -110 170 1.7422650683449548 41.67207012266351 500.0 -120 170 1.7430238000053566 41.67207404528371 500.0 -130 170 1.7437825204768576 41.67207796249364 500.0 -140 170 1.7445412297617033 41.672081874293546 500.0 -150 170 1.7452999278621382 41.67208578068367 500.0 -160 170 1.7460586147804078 41.672089681664275 500.0 -170 170 1.746817290518757 41.6720935772356 500.0 -180 170 1.74757595507943 41.67209746739788 500.0 -190 170 1.7483346084646723 41.672101352151394 500.0 -200 170 1.749093250676728 41.67210523149636 500.0 -210 170 1.7498518817178417 41.67210910543304 500.0 -220 170 1.7506105015902576 41.672112973961674 500.0 -230 170 1.7513691102962199 41.67211683708251 500.0 -240 170 1.752127707837973 41.67212069479581 500.0 -250 170 1.7528862942177603 41.6721245471018 500.0 -260 170 1.7536448694378264 41.67212839400074 500.0 -270 170 1.7544034335004146 41.672132235492874 500.0 -280 170 1.7551619864077688 41.67213607157845 500.0 -290 170 1.7559205281621324 41.67213990225772 500.0 -0 180 1.7339234313846017 41.67146355361635 500.0 -10 180 1.7346822756112728 41.67146753492339 500.0 -20 180 1.7354411086279544 41.67147151081759 500.0 -30 180 1.7361999304368925 41.671475481299204 500.0 -40 180 1.7369587410403327 41.67147944636847 500.0 -50 180 1.7377175404405214 41.67148340602566 500.0 -60 180 1.7384763286397038 41.671487360270994 500.0 -70 180 1.7392351056401263 41.671491309104745 500.0 -80 180 1.7399938714440337 41.671495252527144 500.0 -90 180 1.740752626053672 41.67149919053845 500.0 -100 180 1.7415113694712865 41.6715031231389 500.0 -110 180 1.7422701016991218 41.67150705032875 500.0 -120 180 1.7430288227394235 41.67151097210825 500.0 -130 180 1.7437875325944368 41.671514888477645 500.0 -140 180 1.7445462312664057 41.67151879943718 500.0 -150 180 1.7453049187575758 41.67152270498711 500.0 -160 180 1.7460635950701913 41.671526605127674 500.0 -170 180 1.7468222602064971 41.67153049985913 500.0 -180 180 1.747580914168737 41.671534389181716 500.0 -190 180 1.748339556959156 41.671538273095685 500.0 -200 180 1.7490981885799979 41.67154215160128 500.0 -210 180 1.7498568090335067 41.671546024698756 500.0 -220 180 1.7506154183219267 41.67154989238835 500.0 -230 180 1.7513740164475016 41.67155375467032 500.0 -240 180 1.752132603412475 41.671557611544905 500.0 -250 180 1.7528911792190904 41.67156146301236 500.0 -260 180 1.7536497438695917 41.67156530907293 500.0 -270 180 1.7544082973662225 41.67156914972686 500.0 -280 180 1.7551668397112254 41.67157298497439 500.0 -290 180 1.7559253709068439 41.67157681481577 500.0 -0 190 1.7339285801175035 41.67090049004944 500.0 -10 190 1.7346874136854764 41.67090447051405 500.0 -20 190 1.7354462360470753 41.67090844556599 500.0 -30 190 1.7362050472045463 41.67091241520552 500.0 -40 190 1.7369638471601345 41.67091637943287 500.0 -50 190 1.7377226359160862 41.670920338248294 500.0 -60 190 1.738481413474646 41.67092429165205 500.0 -70 190 1.7392401798380595 41.670928239644375 500.0 -80 190 1.7399989350085718 41.67093218222552 500.0 -90 190 1.7407576789884283 41.67093611939574 500.0 -100 190 1.7415164117798736 41.67094005115527 500.0 -110 190 1.7422751333851525 41.67094397750437 500.0 -120 190 1.74303384380651 41.67094789844329 500.0 -130 190 1.7437925430461902 41.670951813972266 500.0 -140 190 1.7445512311064382 41.67095572409155 500.0 -150 190 1.745309907989498 41.67095962880139 500.0 -160 190 1.746068573697614 41.67096352810204 500.0 -170 190 1.7468272282330306 41.67096742199374 500.0 -180 190 1.7475858715979915 41.670971310476745 500.0 -190 190 1.7483445037947405 41.67097519355129 500.0 -200 190 1.7491031248255218 41.67097907121764 500.0 -210 190 1.7498617346925789 41.67098294347602 500.0 -220 190 1.7506203333981554 41.670986810326696 500.0 -230 190 1.751378920944495 41.670990671769914 500.0 -240 190 1.7521374973338408 41.67099452780591 500.0 -250 190 1.7528960625684362 41.67099837843494 500.0 -260 190 1.7536546166505245 41.67100222365725 500.0 -270 190 1.7544131595823482 41.67100606347308 500.0 -280 190 1.7551716913661508 41.67100989788269 500.0 -290 190 1.7559302120041747 41.671013726886315 500.0 -0 200 1.7339337271695807 41.67033742599209 500.0 -10 200 1.7346925500800146 41.670341405614394 500.0 -20 200 1.73545136178769 41.6703453798242 500.0 -30 200 1.7362101622948525 41.67034934862175 500.0 -40 200 1.7369689516037474 41.67035331200729 500.0 -50 200 1.7377277297166194 41.67035726998108 500.0 -60 200 1.7384864966357143 41.67036122254336 500.0 -70 200 1.7392452523632762 41.670365169694385 500.0 -80 200 1.7400039969015504 41.6703691114344 500.0 -90 200 1.7407627302527815 41.67037304776365 500.0 -100 200 1.741521452419214 41.67037697868238 500.0 -110 200 1.7422801634030927 41.67038090419084 500.0 -120 200 1.7430388632066613 41.670384824289286 500.0 -130 200 1.7437975518321644 41.67038873897796 500.0 -140 200 1.7445562292818464 41.67039264825711 500.0 -150 200 1.7453148955579507 41.67039655212699 500.0 -160 200 1.7460735506627216 41.670400450587834 500.0 -170 200 1.746832194598403 41.6704043436399 500.0 -180 200 1.7475908273672383 41.67040823128343 500.0 -190 200 1.7483494489714713 41.67041211351868 500.0 -200 200 1.749108059413345 41.67041599034589 500.0 -210 200 1.7498666586951035 41.6704198617653 500.0 -220 200 1.7506252468189891 41.67042372777718 500.0 -230 200 1.7513838237872454 41.67042758838175 500.0 -240 200 1.7521423896021158 41.670431443579275 500.0 -250 200 1.7529009442658425 41.67043529337 500.0 -260 200 1.7536594877806686 41.670439137754165 500.0 -270 200 1.7544180201488366 41.670442976732026 500.0 -280 200 1.7551765413725893 41.67044681030382 500.0 -290 200 1.755935051454169 41.6704506384698 500.0 -0 210 1.733938872540881 41.66977436144476 500.0 10 210 1.7346976847949347 41.66977834022487 500.0 -20 210 1.7354564858498454 41.669782313592655 500.0 -30 210 1.736215275707858 41.66978628154835 500.0 -40 210 1.736974054371217 41.66979024409221 500.0 -50 210 1.7377328218421682 41.66979420122448 500.0 60 210 1.738491578122955 41.669798152945404 500.0 -70 210 1.739250323215823 41.66980209925524 500.0 -80 210 1.7400090571230158 41.669806040154235 500.0 -90 210 1.7407677798467782 41.66980997564263 500.0 -100 210 1.7415264913893544 41.66981390572068 500.0 110 210 1.7422851917529882 41.669817830388624 500.0 -120 210 1.7430438809399238 41.66982174964672 500.0 -130 210 1.743802558952405 41.66982566349521 500.0 -140 210 1.744561225792676 41.66982957193434 500.0 -150 210 1.7453198814629796 41.66983347496436 500.0 160 210 1.7460785259655598 41.669837372585526 500.0 -170 210 1.74683715930266 41.66984126479807 500.0 -180 210 1.7475957814765235 41.66984515160225 500.0 -190 210 1.7483543924893934 41.669849032998314 500.0 -200 210 1.749112992343513 41.6698529089865 500.0 210 210 1.7498715810411252 41.66985677956706 500.0 -220 210 1.7506301585844726 41.66986064474025 500.0 -230 210 1.751388724975798 41.6698645045063 500.0 -240 210 1.7521472802173441 41.669868358865465 500.0 -250 210 1.7529058243113538 41.669872207818 500.0 260 210 1.753664357260069 41.66987605136414 500.0 -270 210 1.7544228790657321 41.66987988950414 500.0 -280 210 1.7551813897305855 41.66988372223824 500.0 -290 210 1.7559398892568712 41.669887549566695 500.0 -0 220 1.733944016231451 41.66921129640792 500.0 -10 220 1.7347028178302837 41.669215274345966 500.0 -20 220 1.735461608233588 41.66921924687184 500.0 -30 220 1.7362203874436093 41.669223213985795 500.0 -40 220 1.736979155462591 41.669227175688086 500.0 -50 220 1.7377379122927783 41.66923113197895 500.0 -60 220 1.738496657936415 41.66923508285864 500.0 -70 220 1.7392553923957457 41.66923902832741 500.0 -80 220 1.740014115673014 41.6692429683855 500.0 -90 220 1.7407728277704644 41.66924690303316 500.0 -100 220 1.7415315286903401 41.66925083227064 500.0 -110 220 1.7422902184348854 41.669254756098184 500.0 -120 220 1.7430488970063434 41.669258674516044 500.0 -130 220 1.743807564406958 41.669262587524464 500.0 -140 220 1.7445662206389725 41.66926649512369 500.0 -150 220 1.74532486570463 41.66927039731399 500.0 -160 220 1.7460834996061736 41.66927429409558 500.0 -170 220 1.7468421223458468 41.66927818546872 500.0 -180 220 1.747600733925892 41.66928207143366 500.0 -190 220 1.7483593343485526 41.66928595199065 500.0 -200 220 1.7491179236160705 41.66928982713994 500.0 -210 220 1.7498765017306892 41.669293696881766 500.0 -220 220 1.7506350686946504 41.669297561216375 500.0 -230 220 1.751393624510197 41.66930142014402 500.0 -240 220 1.7521521691795712 41.66930527366495 500.0 -250 220 1.752910702705015 41.66930912177941 500.0 -260 220 1.7536692250887704 41.669312964487645 500.0 -270 220 1.7544277363330796 41.669316801789904 500.0 -280 220 1.755186236440184 41.669320633686425 500.0 -290 220 1.7559447254123255 41.669324460177464 500.0 -0 230 1.7339491582413376 41.66864823088204 500.0 -10 230 1.7347079491861084 41.66865220797813 500.0 -20 230 1.7354667289389654 41.668656179662214 500.0 -30 230 1.7362254975021532 41.66866014593455 500.0 -40 230 1.7369842548779155 41.66866410679538 500.0 -50 230 1.7377430010684967 41.66866806224496 500.0 -60 230 1.7385017360761408 41.66867201228354 500.0 -70 230 1.7392604599030912 41.66867595691135 500.0 -80 230 1.7400191725515919 41.66867989612865 500.0 -90 230 1.7407778740238862 41.668683829935695 500.0 -100 230 1.7415365643222178 41.66868775833272 500.0 -110 230 1.74229524344883 41.668691681319984 500.0 -120 230 1.743053911405966 41.66869559889773 500.0 -130 230 1.743812568195869 41.668699511066194 500.0 -140 230 1.7445712138207818 41.66870341782564 500.0 -150 230 1.7453298482829478 41.66870731917631 500.0 -160 230 1.746088471584609 41.668711215118456 500.0 -170 230 1.746847083728009 41.66871510565231 500.0 -180 230 1.7476056847153896 41.66871899077814 500.0 -190 230 1.7483642745489933 41.668722870496175 500.0 -200 230 1.7491228532310632 41.66872674480667 500.0 -210 230 1.7498814207638407 41.668730613709876 500.0 -220 230 1.7506399771495682 41.66873447720603 500.0 -230 230 1.751398522390488 41.668738335295394 500.0 -240 230 1.7521570564888413 41.6687421879782 500.0 -250 230 1.7529155794468707 41.6687460352547 500.0 -260 230 1.7536740912668174 41.66874987712514 500.0 -270 230 1.754432591950923 41.668753713589766 500.0 -280 230 1.7551910815014289 41.668757544648834 500.0 -290 230 1.7559495599205766 41.668761370302576 500.0 -0 240 1.7339542985705882 41.668085164867584 500.0 -10 240 1.7347130788624556 41.66808914112183 500.0 -20 240 1.7354718479660238 41.66809311196425 500.0 -30 240 1.7362306058835364 41.668097077395075 500.0 -40 240 1.7369893526172373 41.66810103741457 500.0 -50 240 1.73774808816937 41.66810499202298 500.0 -60 240 1.7385068125421785 41.66810894122055 500.0 -70 240 1.7392655257379057 41.66811288500753 500.0 -80 240 1.7400242277587952 41.66811682338417 500.0 -90 240 1.74078291860709 41.6681207563507 500.0 -100 240 1.7415415982850333 41.6681246839074 500.0 -110 240 1.7423002667948682 41.66812860605449 500.0 -120 240 1.7430589241388375 41.668132522792234 500.0 -130 240 1.7438175703191838 41.66813643412087 500.0 -140 240 1.74457620533815 41.668140340040644 500.0 -150 240 1.7453348291979784 41.66814424055181 500.0 -160 240 1.7460934419009115 41.66814813565462 500.0 -170 240 1.7468520434491916 41.66815202534931 500.0 -180 240 1.747610633845061 41.668155909636134 500.0 -190 240 1.7483692130907618 41.66815978851533 500.0 -200 240 1.7491277811885357 41.66816366198716 500.0 -210 240 1.7498863381406247 41.66816753005186 500.0 -220 240 1.7506448839492708 41.66817139270968 500.0 -230 240 1.7514034186167153 41.66817524996087 500.0 -240 240 1.7521619421451997 41.66817910180566 500.0 -250 240 1.7529204545369657 41.66818294824432 500.0 -260 240 1.7536789557942545 41.66818678927709 500.0 -270 240 1.7544374459193073 41.668190624904206 500.0 -280 240 1.7551959249143647 41.66819445512593 500.0 -290 240 1.7559543927816685 41.668198279942494 500.0 -0 250 1.7339594372192497 41.66752209836501 500.0 -10 250 1.7347182068593725 41.66752607377754 500.0 -20 250 1.7354769653148103 41.66753004377839 500.0 -30 250 1.7362357125878058 41.66753400836784 500.0 -40 250 1.736994448680603 41.66753796754611 500.0 -50 250 1.7377531735954448 41.667541921313465 500.0 -60 250 1.7385118873345746 41.66754586967015 500.0 -70 250 1.7392705899002354 41.667549812616414 500.0 -80 250 1.7400292812946703 41.6675537501525 500.0 -90 250 1.7407879615201218 41.667557682278655 500.0 -100 250 1.7415466305788327 41.66756160899513 500.0 -110 250 1.7423052884730459 41.66756553030217 500.0 -120 250 1.7430639352050035 41.66756944620003 500.0 -130 250 1.7438225707769484 41.66757335668894 500.0 -140 250 1.7445811951911223 41.66757726176917 500.0 -150 250 1.7453398084497678 41.66758116144096 500.0 -160 250 1.7460984105551265 41.66758505570454 500.0 -170 250 1.7468570015094407 41.66758894456018 500.0 -180 250 1.747615581314952 41.66759282800812 500.0 -190 250 1.7483741499739025 41.6675967060486 500.0 -200 250 1.7491327074885337 41.66760057868187 500.0 -210 250 1.7498912538610865 41.66760444590818 500.0 -220 250 1.7506497890938029 41.66760830772778 500.0 -230 250 1.751408313188924 41.667612164140905 500.0 -240 250 1.7521668261486907 41.667616015147814 500.0 -250 250 1.7529253279753447 41.66761986074875 500.0 -260 250 1.7536838186711263 41.667623700943956 500.0 -270 250 1.7544422982382766 41.667627535733686 500.0 -280 250 1.7552007666790361 41.667631365118176 500.0 -290 250 1.7559592239956459 41.66763518909768 500.0 -0 260 1.733964574187369 41.66695903137479 500.0 10 260 1.734723333176906 41.6669630059457 500.0 -20 260 1.7354820809853715 41.666966975105126 500.0 -30 260 1.7362408176150081 41.6669709388533 500.0 -40 260 1.7369995430680594 41.66697489719047 500.0 -50 260 1.7377582573467676 41.66697885011689 500.0 60 260 1.7385169604533761 41.666982797632805 500.0 -70 260 1.7392756523901272 41.66698673973847 500.0 -80 260 1.7400343331592636 41.66699067643412 500.0 -90 260 1.740793002763028 41.66699460772 500.0 -100 260 1.7415516612036623 41.66699853359638 500.0 110 260 1.7423103084834093 41.667002454063486 500.0 -120 260 1.7430689446045105 41.66700636912157 500.0 -130 260 1.7438275695692083 41.66701027877089 500.0 -140 260 1.7445861833797445 41.66701418301168 500.0 -150 260 1.745344786038361 41.6670180818442 500.0 160 260 1.7461033775472994 41.66702197526868 500.0 -170 260 1.7468619579088012 41.66702586328539 500.0 -180 260 1.747620527125108 41.66702974589455 500.0 -190 260 1.748379085198461 41.66703362309643 500.0 -200 260 1.7491376321311016 41.66703749489127 500.0 210 260 1.7498961679252707 41.66704136127931 500.0 -220 260 1.7506546925832096 41.667045222260796 500.0 -230 260 1.7514132061071588 41.66704907783599 500.0 -240 260 1.7521717084993595 41.66705292800513 500.0 -250 260 1.752930199762052 41.66705677276845 500.0 260 260 1.7536886798974773 41.667060612126214 500.0 -270 260 1.7544471489078755 41.66706444607866 500.0 -280 260 1.755205606795487 41.66706827462604 500.0 -290 260 1.7559640535625523 41.667072097768596 500.0 -0 270 1.733969709474993 41.666395963897386 500.0 -10 270 1.734728457815103 41.666399937626814 500.0 -20 270 1.7354871949777544 41.66640390594491 500.0 -30 270 1.7362459209651901 41.66640786885193 500.0 -40 270 1.7370046357796527 41.66641182634812 500.0 -50 270 1.737763339423385 41.666415778433716 500.0 -60 270 1.7385220318986288 41.66641972510898 500.0 -70 270 1.739280713207627 41.66642366637415 500.0 -80 270 1.7400393833526213 41.66642760222948 500.0 -90 270 1.7407980423358544 41.66643153267522 500.0 -100 270 1.7415566901595678 41.666435457711614 500.0 -110 270 1.7423153268260037 41.666439377338904 500.0 -120 270 1.743073952337404 41.666443291557336 500.0 -130 270 1.7438325666960095 41.66644720036717 500.0 -140 270 1.7445911699040626 41.666451103768644 500.0 -150 270 1.745349761963804 41.66645500176201 500.0 -160 270 1.7461083428774757 41.666458894347514 500.0 -170 270 1.7468669126473189 41.6664627815254 500.0 -180 270 1.747625471275574 41.66646666329591 500.0 -190 270 1.7483840187644828 41.6664705396593 500.0 -200 270 1.7491425551162854 41.66647441061581 500.0 -210 270 1.749901080333223 41.6664782761657 500.0 -220 270 1.7506595944175358 41.666482136309206 500.0 -230 270 1.751418097371465 41.66648599104657 500.0 -240 270 1.7521765891972507 41.66648984037805 500.0 -250 270 1.752935069897133 41.66649368430388 500.0 -260 270 1.7536935394733524 41.66649752282432 500.0 -270 270 1.754451997928149 41.66650135593961 500.0 -280 270 1.7552104452637625 41.66650518364999 500.0 -290 270 1.7559688814824328 41.66650900595572 500.0 -0 280 1.733974843082169 41.66583289593326 500.0 -10 280 1.7347335807740103 41.665836868821316 500.0 -20 280 1.7354923072920059 41.66584083629821 500.0 -30 280 1.7362510226383983 41.66584479836419 500.0 -40 280 1.7370097268154299 41.66584875501951 500.0 -50 280 1.737768419825343 41.66585270626441 500.0 -60 280 1.7385271016703792 41.66585665209914 500.0 -70 280 1.7392857723527808 41.66586059252394 500.0 -80 280 1.7400444318747899 41.66586452753907 500.0 -90 280 1.7408030802386474 41.665868457144775 500.0 -100 280 1.7415617174465958 41.665872381341295 500.0 -110 280 1.742320343500876 41.665876300128886 500.0 -120 280 1.7430789584037296 41.66588021350779 500.0 -130 280 1.7438375621573976 41.66588412147825 500.0 -140 280 1.7445961547641218 41.66588802404053 500.0 -150 280 1.7453547362261428 41.665891921194856 500.0 -160 280 1.7461133065457015 41.665895812941486 500.0 -170 280 1.7468718657250388 41.66589969928067 500.0 -180 280 1.7476304137663956 41.66590358021265 500.0 -190 280 1.7483889506720123 41.66590745573767 500.0 -200 280 1.7491474764441295 41.66591132585598 500.0 -210 280 1.7499059910849875 41.66591519056783 500.0 -220 280 1.7506644945968266 41.66591904987346 500.0 -230 280 1.7514229869818871 41.665922903773115 500.0 -240 280 1.7521814682424088 41.665926752267055 500.0 -250 280 1.752939938380632 41.66593059535551 500.0 -260 280 1.753698397398796 41.66593443303874 500.0 -270 280 1.754456845299141 41.66593826531698 500.0 -280 280 1.7552152820839062 41.66594209219049 500.0 -290 280 1.7559737077553315 41.6659459136595 500.0 -0 290 1.733979975008944 41.665269827482874 500.0 -10 290 1.7347387020536746 41.66527379952968 500.0 -20 290 1.7354974179281726 41.66527776616549 500.0 -30 290 1.7362561226346795 41.66528172739055 500.0 -40 290 1.7370148161754377 41.66528568320511 500.0 -50 290 1.7377734985526887 41.665289633609426 500.0 -60 290 1.7385321697686742 41.66529357860374 500.0 -70 290 1.7392908298256358 41.66529751818829 500.0 -80 290 1.7400494787258152 41.66530145236334 500.0 -90 290 1.7408081164714533 41.66530538112912 500.0 -100 290 1.7415667430647916 41.665309304485895 500.0 -110 290 1.7423253585080714 41.6653132224339 500.0 -120 290 1.7430839628035335 41.665317134973385 500.0 -130 290 1.7438425559534187 41.6653210421046 500.0 -140 290 1.7446011379599682 41.66532494382779 500.0 -150 290 1.745359708825422 41.6653288401432 500.0 -160 290 1.7461182685520216 41.66533273105108 500.0 -170 290 1.7468768171420066 41.66533661655168 500.0 -180 290 1.747635354597618 41.665340496645236 500.0 -190 290 1.7483938809210955 41.665344371332004 500.0 -200 290 1.7491523961146795 41.665348240612225 500.0 -210 290 1.7499109001806101 41.66535210448615 500.0 -220 290 1.750669393121127 41.665355962954024 500.0 -230 290 1.7514278749384702 41.66535981601609 500.0 -240 290 1.752186345634879 41.66536366367261 500.0 -250 290 1.7529448052125933 41.665367505923804 500.0 -260 290 1.7537032536738526 41.665371342769944 500.0 -270 290 1.754461691020896 41.665375174211256 500.0 -280 290 1.755220117255963 41.665379000247995 500.0 -290 290 1.7559785323812924 41.66538282088041 500.0 diff --git a/Data/Input/wv2/wv2-1.gcp2 b/Data/Input/wv2/wv2-1.gcp2 index 5001268e7c..d6b110c828 100644 --- a/Data/Input/wv2/wv2-1.gcp2 +++ b/Data/Input/wv2/wv2-1.gcp2 @@ -1,901 +1,37 @@ -#From file /work/scratch/osmanj/otb_valid/wv2-1.geom -0 0 12.478020308441684 41.9002203915641 94.0 -10 0 12.478080529474209 41.900221714945744 94.0 -20 0 12.47814075051079 41.900223038295856 94.0 -30 0 12.478200971551427 41.90022436161443 94.0 -40 0 12.47826119259612 41.900225684901464 94.0 -50 0 12.478321413644872 41.90022700815696 94.0 -60 0 12.478381634697682 41.900228331380916 94.0 -70 0 12.478441855754548 41.900229654573344 94.0 -80 0 12.478502076815472 41.900230977734225 94.0 -90 0 12.478562297880455 41.90023230086358 94.0 -100 0 12.478622518949493 41.900233623961384 94.0 -110 0 12.47868274002259 41.900234947027656 94.0 -120 0 12.478742961099744 41.90023627006239 94.0 -130 0 12.478803182180958 41.90023759306559 94.0 -140 0 12.478863403266228 41.900238916037246 94.0 -150 0 12.478923624355557 41.90024023897737 94.0 -160 0 12.478983845448946 41.90024156188595 94.0 -170 0 12.479044066546392 41.900242884762996 94.0 -180 0 12.479104287647896 41.9002442076085 94.0 -190 0 12.479164508753458 41.900245530422474 94.0 -200 0 12.479224729863079 41.900246853204905 94.0 -210 0 12.479284950976758 41.900248175955795 94.0 -220 0 12.479345172094497 41.90024949867515 94.0 -230 0 12.479405393216295 41.90025082136297 94.0 -240 0 12.47946561434215 41.90025214401925 94.0 -250 0 12.479525835472066 41.90025346664399 94.0 -260 0 12.479586056606038 41.90025478923719 94.0 -270 0 12.479646277744072 41.90025611179885 94.0 -280 0 12.479706498886163 41.90025743432898 94.0 -290 0 12.479766720032313 41.90025875682757 94.0 -0 10 12.478022079848719 41.90017540115891 94.0 +# column row longitude latitude elevation 10 10 12.478082300839052 41.90017672453848 94.0 -20 10 12.478142521833442 41.90017804788652 94.0 -30 10 12.47820274283189 41.900179371203016 94.0 -40 10 12.478262963834394 41.90018069448797 94.0 -50 10 12.478323184840956 41.9001820177414 94.0 60 10 12.478383405851574 41.90018334096328 94.0 -70 10 12.47844362686625 41.90018466415363 94.0 -80 10 12.478503847884983 41.90018598731244 94.0 -90 10 12.478564068907774 41.90018731043971 94.0 -100 10 12.478624289934624 41.90018863353544 94.0 110 10 12.47868451096553 41.90018995659964 94.0 -120 10 12.478744732000495 41.9001912796323 94.0 -130 10 12.478804953039516 41.900192602633425 94.0 -140 10 12.478865174082598 41.900193925603006 94.0 -150 10 12.478925395129735 41.90019524854105 94.0 160 10 12.478985616180934 41.90019657144756 94.0 -170 10 12.479045837236189 41.90019789432253 94.0 -180 10 12.479106058295502 41.90019921716596 94.0 -190 10 12.479166279358873 41.90020053997786 94.0 -200 10 12.479226500426305 41.900201862758216 94.0 210 10 12.479286721497793 41.90020318550703 94.0 -220 10 12.479346942573342 41.90020450822431 94.0 -230 10 12.479407163652949 41.90020583091005 94.0 -240 10 12.479467384736614 41.90020715356426 94.0 -250 10 12.479527605824337 41.900208476186926 94.0 260 10 12.479587826916122 41.90020979877805 94.0 -270 10 12.479648048011963 41.90021112133764 94.0 -280 10 12.479708269111864 41.90021244386569 94.0 -290 10 12.479768490215825 41.90021376636221 94.0 -0 20 12.47802385125172 41.90013041075331 94.0 -10 20 12.478084072199863 41.90013173413081 94.0 -20 20 12.478144293152063 41.90013305747677 94.0 -30 20 12.478204514108318 41.900134380791194 94.0 -40 20 12.478264735068633 41.900135704074074 94.0 -50 20 12.478324956033005 41.90013702732542 94.0 -60 20 12.478385177001432 41.900138350545234 94.0 -70 20 12.478445397973918 41.900139673733506 94.0 -80 20 12.47850561895046 41.90014099689024 94.0 -90 20 12.478565839931061 41.90014232001543 94.0 -100 20 12.478626060915719 41.9001436431091 94.0 -110 20 12.478686281904436 41.90014496617121 94.0 -120 20 12.47874650289721 41.9001462892018 94.0 -130 20 12.478806723894042 41.90014761220085 94.0 -140 20 12.478866944894932 41.90014893516835 94.0 -150 20 12.478927165899881 41.900150258104325 94.0 -160 20 12.478987386908887 41.90015158100876 94.0 -170 20 12.479047607921952 41.900152903881654 94.0 -180 20 12.479107828939075 41.90015422672301 94.0 -190 20 12.479168049960256 41.900155549532826 94.0 -200 20 12.479228270985496 41.90015687231111 94.0 -210 20 12.479288492014796 41.900158195057855 94.0 -220 20 12.479348713048154 41.90015951777306 94.0 -230 20 12.47940893408557 41.90016084045673 94.0 -240 20 12.479469155127045 41.90016216310885 94.0 -250 20 12.479529376172579 41.90016348572944 94.0 -260 20 12.479589597222171 41.9001648083185 94.0 -270 20 12.479649818275822 41.900166130876016 94.0 -280 20 12.479710039333533 41.90016745340199 94.0 -290 20 12.479770260395304 41.900168775896425 94.0 -0 30 12.478025622650684 41.9000854203473 94.0 -10 30 12.478085843556636 41.900086743722724 94.0 -20 30 12.478146064466646 41.900088067066605 94.0 -30 30 12.478206285380713 41.90008939037895 94.0 -40 30 12.478266506298837 41.900090713659765 94.0 -50 30 12.478326727221017 41.90009203690903 94.0 -60 30 12.478386948147255 41.90009336012677 94.0 -70 30 12.47844716907755 41.900094683312965 94.0 -80 30 12.478507390011902 41.90009600646762 94.0 -90 30 12.478567610950313 41.90009732959074 94.0 -100 30 12.478627831892782 41.900098652682324 94.0 -110 30 12.478688052839308 41.90009997574237 94.0 -120 30 12.478748273789892 41.900101298770885 94.0 -130 30 12.478808494744532 41.90010262176785 94.0 -140 30 12.478868715703232 41.90010394473329 94.0 -150 30 12.47892893666599 41.90010526766718 94.0 -160 30 12.478989157632807 41.90010659056954 94.0 -170 30 12.479049378603682 41.90010791344036 94.0 -180 30 12.479109599578614 41.90010923627964 94.0 -190 30 12.479169820557606 41.90011055908739 94.0 -200 30 12.479230041540657 41.900111881863594 94.0 -210 30 12.479290262527764 41.90011320460826 94.0 -220 30 12.479350483518932 41.90011452732139 94.0 -230 30 12.479410704514157 41.90011585000298 94.0 -240 30 12.479470925513443 41.90011717265304 94.0 -250 30 12.479531146516786 41.900118495271556 94.0 -260 30 12.479591367524188 41.90011981785853 94.0 -270 30 12.47965158853565 41.90012114041397 94.0 -280 30 12.47971180955117 41.90012246293787 94.0 -290 30 12.47977203057075 41.90012378543024 94.0 -0 40 12.478027394045613 41.90004042994088 94.0 -10 40 12.478087614909375 41.90004175331423 94.0 -20 40 12.478147835777195 41.90004307665603 94.0 -30 40 12.478208056649072 41.900044399966305 94.0 -40 40 12.478268277525006 41.900045723245036 94.0 -50 40 12.478328498404995 41.90004704649223 94.0 -60 40 12.478388719289043 41.90004836970789 94.0 -70 40 12.478448940177149 41.90004969289201 94.0 -80 40 12.478509161069312 41.90005101604459 94.0 -90 40 12.478569381965531 41.90005233916564 94.0 -100 40 12.478629602865809 41.90005366225515 94.0 -110 40 12.478689823770145 41.90005498531312 94.0 -120 40 12.478750044678538 41.90005630833955 94.0 -130 40 12.47881026559099 41.90005763133445 94.0 -140 40 12.4788704865075 41.900058954297805 94.0 -150 40 12.478930707428066 41.90006027722963 94.0 -160 40 12.478990928352694 41.90006160012991 94.0 -170 40 12.479051149281377 41.90006292299865 94.0 -180 40 12.47911137021412 41.90006424583586 94.0 -190 40 12.479171591150921 41.90006556864153 94.0 -200 40 12.479231812091781 41.90006689141566 94.0 -210 40 12.4792920330367 41.90006821415825 94.0 -220 40 12.479352253985677 41.90006953686931 94.0 -230 40 12.479412474938712 41.900070859548826 94.0 -240 40 12.479472695895806 41.90007218219681 94.0 -250 40 12.47953291685696 41.90007350481325 94.0 -260 40 12.479593137822173 41.90007482739815 94.0 -270 40 12.479653358791444 41.900076149951516 94.0 -280 40 12.479713579764773 41.90007747247335 94.0 -290 40 12.479773800742164 41.90007879496363 94.0 -0 50 12.478029165436508 41.899995439534045 94.0 -10 50 12.47808938625808 41.89999676290531 94.0 -20 50 12.47814960708371 41.89999808624504 94.0 -30 50 12.478209827913396 41.89999940955324 94.0 -40 50 12.478270048747138 41.900000732829895 94.0 -50 50 12.478330269584939 41.90000205607501 94.0 -60 50 12.478390490426797 41.9000033792886 94.0 -70 50 12.478450711272712 41.90000470247064 94.0 -80 50 12.478510932122685 41.90000602562115 94.0 -90 50 12.478571152976714 41.90000734874012 94.0 -100 50 12.478631373834801 41.90000867182755 94.0 -110 50 12.478691594696947 41.90000999488345 94.0 -120 50 12.47875181556315 41.900011317907804 94.0 -130 50 12.478812036433412 41.90001264090063 94.0 -140 50 12.478872257307732 41.90001396386191 94.0 -150 50 12.47893247818611 41.90001528679166 94.0 -160 50 12.478992699068545 41.900016609689864 94.0 -170 50 12.47905291995504 41.90001793255653 94.0 -180 50 12.479113140845593 41.90001925539166 94.0 -190 50 12.479173361740203 41.90002057819526 94.0 -200 50 12.479233582638873 41.90002190096732 94.0 -210 50 12.479293803541601 41.900023223707834 94.0 -220 50 12.479354024448389 41.900024546416816 94.0 -230 50 12.479414245359234 41.90002586909426 94.0 -240 50 12.479474466274139 41.900027191740165 94.0 -250 50 12.479534687193102 41.90002851435453 94.0 -260 50 12.479594908116125 41.90002983693736 94.0 -270 50 12.479655129043206 41.90003115948865 94.0 -280 50 12.479715349974345 41.900032482008406 94.0 -290 50 12.479775570909544 41.900033804496616 94.0 -0 60 12.478030936823366 41.89995044912679 94.0 10 60 12.47809115760275 41.89995177249598 94.0 -20 60 12.478151378386189 41.89995309583364 94.0 -30 60 12.478211599173685 41.89995441913976 94.0 -40 60 12.478271819965238 41.89995574241434 94.0 -50 60 12.478332040760849 41.89995706565738 94.0 60 60 12.478392261560515 41.89995838886889 94.0 -70 60 12.47845248236424 41.89995971204886 94.0 -80 60 12.478512703172024 41.89996103519729 94.0 -90 60 12.478572923983863 41.899962358314184 94.0 -100 60 12.478633144799762 41.89996368139955 94.0 110 60 12.478693365619717 41.899965004453364 94.0 -120 60 12.47875358644373 41.899966327475646 94.0 -130 60 12.478813807271802 41.899967650466394 94.0 -140 60 12.478874028103931 41.8999689734256 94.0 -150 60 12.478934248940119 41.899970296353274 94.0 160 60 12.478994469780364 41.899971619249406 94.0 -170 60 12.479054690624668 41.899972942114 94.0 -180 60 12.479114911473031 41.899974264947055 94.0 -190 60 12.479175132325453 41.89997558774858 94.0 -200 60 12.479235353181933 41.89997691051856 94.0 210 60 12.479295574042471 41.899978233257 94.0 -220 60 12.479355794907068 41.89997955596391 94.0 -230 60 12.479416015775723 41.899980878639276 94.0 -240 60 12.479476236648438 41.89998220128311 94.0 -250 60 12.479536457525212 41.8999835238954 94.0 260 60 12.479596678406043 41.89998484647615 94.0 -270 60 12.479656899290934 41.89998616902537 94.0 -280 60 12.479717120179885 41.899987491543044 94.0 -290 60 12.479777341072893 41.899988814029186 94.0 -0 70 12.47803270820619 41.899905458719125 94.0 -10 70 12.478092928943383 41.89990678208624 94.0 -20 70 12.478153149684632 41.89990810542182 94.0 -30 70 12.478213370429938 41.89990942872586 94.0 -40 70 12.478273591179303 41.89991075199837 94.0 -50 70 12.478333811932723 41.89991207523934 94.0 -60 70 12.4783940326902 41.899913398448774 94.0 -70 70 12.478454253451735 41.899914721626665 94.0 -80 70 12.478514474217327 41.89991604477302 94.0 -90 70 12.478574694986978 41.899917367887845 94.0 -100 70 12.478634915760686 41.89991869097113 94.0 -110 70 12.478695136538452 41.89992001402287 94.0 -120 70 12.478755357320274 41.899921337043075 94.0 -130 70 12.478815578106156 41.89992266003175 94.0 -140 70 12.478875798896096 41.89992398298888 94.0 -150 70 12.478936019690094 41.89992530591447 94.0 -160 70 12.47899624048815 41.89992662880853 94.0 -170 70 12.479056461290265 41.89992795167105 94.0 -180 70 12.479116682096437 41.899929274502036 94.0 -190 70 12.479176902906667 41.89993059730148 94.0 -200 70 12.479237123720958 41.899931920069385 94.0 -210 70 12.479297344539306 41.89993324280575 94.0 -220 70 12.479357565361713 41.899934565510584 94.0 -230 70 12.47941778618818 41.899935888183876 94.0 -240 70 12.479478007018704 41.899937210825634 94.0 -250 70 12.479538227853286 41.89993853343585 94.0 -260 70 12.47959844869193 41.899939856014534 94.0 -270 70 12.479658669534631 41.899941178561676 94.0 -280 70 12.47971889038139 41.89994250107728 94.0 -290 70 12.47977911123221 41.899943823561344 94.0 -0 80 12.478034479584979 41.89986046831105 94.0 -10 80 12.478094700279982 41.89986179167609 94.0 -20 80 12.47815492097904 41.899863115009595 94.0 -30 80 12.478215141682158 41.89986443831156 94.0 -40 80 12.478275362389331 41.89986576158199 94.0 -50 80 12.478335583100561 41.89986708482088 94.0 -60 80 12.47839580381585 41.89986840802824 94.0 -70 80 12.478456024535195 41.899869731204056 94.0 -80 80 12.478516245258598 41.89987105434834 94.0 -90 80 12.478576465986057 41.89987237746108 94.0 -100 80 12.478636686717577 41.89987370054229 94.0 -110 80 12.478696907453152 41.89987502359196 94.0 -120 80 12.478757128192786 41.89987634661009 94.0 -130 80 12.478817348936477 41.899877669596684 94.0 -140 80 12.478877569684228 41.89987899255174 94.0 -150 80 12.478937790436035 41.899880315475265 94.0 -160 80 12.478998011191901 41.89988163836725 94.0 -170 80 12.479058231951825 41.89988296122769 94.0 -180 80 12.47911845271581 41.8998842840566 94.0 -190 80 12.479178673483851 41.89988560685397 94.0 -200 80 12.47923889425595 41.8998869296198 94.0 -210 80 12.47929911503211 41.899888252354096 94.0 -220 80 12.479359335812326 41.899889575056854 94.0 -230 80 12.479419556596602 41.89989089772807 94.0 -240 80 12.479479777384936 41.89989222036775 94.0 -250 80 12.47953999817733 41.899893542975896 94.0 -260 80 12.479600218973783 41.8998948655525 94.0 -270 80 12.479660439774294 41.899896188097564 94.0 -280 80 12.479720660578865 41.89989751061109 94.0 -290 80 12.479780881387493 41.89989883309308 94.0 -0 90 12.478036250959732 41.89981547790255 94.0 -10 90 12.478096471612545 41.899816801265516 94.0 -20 90 12.478156692269415 41.89981812459695 94.0 -30 90 12.47821691293034 41.89981944789684 94.0 -40 90 12.478277133595325 41.899820771165196 94.0 -50 90 12.478337354264367 41.89982209440201 94.0 -60 90 12.478397574937464 41.899823417607294 94.0 -70 90 12.47845779561462 41.899824740781035 94.0 -80 90 12.478518016295833 41.89982606392324 94.0 -90 90 12.478578236981104 41.89982738703391 94.0 -100 90 12.478638457670431 41.89982871011304 94.0 -110 90 12.478698678363818 41.89983003316063 94.0 -120 90 12.478758899061262 41.89983135617669 94.0 -130 90 12.478819119762765 41.899832679161214 94.0 -140 90 12.478879340468325 41.8998340021142 94.0 -150 90 12.478939561177942 41.89983532503564 94.0 -160 90 12.47899978189162 41.89983664792555 94.0 -170 90 12.479060002609353 41.89983797078391 94.0 -180 90 12.479120223331147 41.899839293610746 94.0 -190 90 12.479180444056999 41.899840616406046 94.0 -200 90 12.479240664786909 41.8998419391698 94.0 -210 90 12.479300885520878 41.89984326190202 94.0 -220 90 12.479361106258905 41.899844584602704 94.0 -230 90 12.479421327000992 41.899845907271846 94.0 -240 90 12.479481547747136 41.899847229909454 94.0 -250 90 12.47954176849734 41.89984855251552 94.0 -260 90 12.479601989251604 41.89984987509005 94.0 -270 90 12.479662210009925 41.89985119763304 94.0 -280 90 12.479722430772306 41.8998525201445 94.0 -290 90 12.479782651538745 41.89985384262441 94.0 -0 100 12.47803802233045 41.89977048749365 94.0 -10 100 12.478098242941073 41.89977181085454 94.0 -20 100 12.478158463555753 41.89977313418389 94.0 -30 100 12.478218684174491 41.899774457481705 94.0 -40 100 12.478278904797286 41.89977578074799 94.0 -50 100 12.478339125424137 41.89977710398273 94.0 -60 100 12.478399346055046 41.89977842718593 94.0 -70 100 12.478459566690011 41.899779750357595 94.0 -80 100 12.478519787329034 41.89978107349773 94.0 -90 100 12.478580007972115 41.89978239660632 94.0 -100 100 12.478640228619254 41.89978371968338 94.0 -110 100 12.47870044927045 41.8997850427289 94.0 -120 100 12.478760669925705 41.89978636574288 94.0 -130 100 12.478820890585018 41.899787688725326 94.0 -140 100 12.478881111248388 41.89978901167623 94.0 -150 100 12.478941331915816 41.8997903345956 94.0 -160 100 12.479001552587304 41.89979165748343 94.0 -170 100 12.479061773262849 41.899792980339726 94.0 -180 100 12.479121993942453 41.899794303164484 94.0 -190 100 12.479182214626114 41.89979562595771 94.0 -200 100 12.479242435313834 41.899796948719384 94.0 -210 100 12.479302656005615 41.899798271449534 94.0 -220 100 12.479362876701451 41.899799594148135 94.0 -230 100 12.479423097401348 41.89980091681521 94.0 -240 100 12.479483318105304 41.899802239450736 94.0 -250 100 12.479543538813319 41.89980356205473 94.0 -260 100 12.479603759525391 41.89980488462719 94.0 -270 100 12.479663980241524 41.899806207168105 94.0 -280 100 12.479724200961714 41.89980752967749 94.0 -290 100 12.479784421685965 41.899808852155324 94.0 -0 110 12.478039793697132 41.899725497084326 94.0 10 110 12.478100014265566 41.89972682044314 94.0 -20 110 12.478160234838057 41.89972814377042 94.0 -30 110 12.478220455414604 41.89972946706616 94.0 -40 110 12.47828067599521 41.89973079033036 94.0 -50 110 12.478340896579871 41.899732113563026 94.0 60 110 12.478401117168591 41.89973343676416 94.0 -70 110 12.478461337761367 41.89973475993375 94.0 -80 110 12.478521558358201 41.8997360830718 94.0 -90 110 12.478581778959093 41.899737406178325 94.0 -100 110 12.478641999564042 41.8997387292533 94.0 110 110 12.478702220173048 41.89974005229675 94.0 -120 110 12.478762440786113 41.89974137530865 94.0 -130 110 12.478822661403235 41.899742698289025 94.0 -140 110 12.478882882024417 41.89974402123785 94.0 -150 110 12.478943102649657 41.89974534415515 94.0 160 110 12.479003323278954 41.89974666704091 94.0 -170 110 12.479063543912309 41.899747989895125 94.0 -180 110 12.479123764549724 41.89974931271781 94.0 -190 110 12.479183985191195 41.89975063550895 94.0 -200 110 12.479244205836727 41.89975195826856 94.0 210 110 12.479304426486317 41.89975328099663 94.0 -220 110 12.479364647139965 41.89975460369316 94.0 -230 110 12.479424867797672 41.899755926358154 94.0 -240 110 12.479485088459437 41.89975724899161 94.0 -250 110 12.479545309125262 41.89975857159353 94.0 260 110 12.479605529795146 41.899759894163914 94.0 -270 110 12.479665750469088 41.89976121670276 94.0 -280 110 12.47972597114709 41.89976253921006 94.0 -290 110 12.47978619182915 41.89976386168583 94.0 -0 120 12.47804156505978 41.89968050667459 94.0 -10 120 12.478101785586025 41.899681830031334 94.0 -20 120 12.478162006116326 41.899683153356534 94.0 -30 120 12.478222226650685 41.899684476650194 94.0 -40 120 12.478282447189098 41.899685799912326 94.0 -50 120 12.478342667731571 41.89968712314292 94.0 -60 120 12.4784028882781 41.89968844634197 94.0 -70 120 12.478463108828688 41.899689769509486 94.0 -80 120 12.478523329383332 41.89969109264546 94.0 -90 120 12.478583549942035 41.89969241574991 94.0 -100 120 12.478643770504794 41.89969373882281 94.0 -110 120 12.478703991071612 41.89969506186418 94.0 -120 120 12.478764211642488 41.89969638487401 94.0 -130 120 12.47882443221742 41.899697707852305 94.0 -140 120 12.478884652796413 41.89969903079906 94.0 -150 120 12.478944873379463 41.89970035371428 94.0 -160 120 12.47900509396657 41.899701676597964 94.0 -170 120 12.479065314557737 41.899702999450106 94.0 -180 120 12.479125535152962 41.899704322270715 94.0 -190 120 12.479185755752244 41.89970564505979 94.0 -200 120 12.479245976355585 41.899706967817316 94.0 -210 120 12.479306196962986 41.899708290543316 94.0 -220 120 12.479366417574445 41.89970961323777 94.0 -230 120 12.479426638189963 41.89971093590069 94.0 -240 120 12.479486858809539 41.89971225853207 94.0 -250 120 12.479547079433175 41.89971358113192 94.0 -260 120 12.479607300060868 41.89971490370022 94.0 -270 120 12.479667520692622 41.89971622623699 94.0 -280 120 12.479727741328434 41.899717548742224 94.0 -290 120 12.479787961968304 41.89971887121592 94.0 -0 130 12.478043336418391 41.899635516264446 94.0 -10 130 12.478103556902447 41.899636839619106 94.0 -20 130 12.47816377739056 41.89963816294223 94.0 -30 130 12.478223997882727 41.89963948623382 94.0 -40 130 12.478284218378954 41.899640809493874 94.0 -50 130 12.478344438879237 41.89964213272239 94.0 -60 130 12.478404659383578 41.89964345591937 94.0 -70 130 12.478464879891975 41.89964477908481 94.0 -80 130 12.47852510040443 41.89964610221871 94.0 -90 130 12.478585320920944 41.89964742532108 94.0 -100 130 12.478645541441514 41.89964874839191 94.0 -110 130 12.478705761966141 41.8996500714312 94.0 -120 130 12.478765982494828 41.89965139443896 94.0 -130 130 12.478826203027571 41.89965271741518 94.0 -140 130 12.478886423564374 41.899654040359856 94.0 -150 130 12.478946644105235 41.899655363273006 94.0 -160 130 12.479006864650154 41.89965668615461 94.0 -170 130 12.47906708519913 41.89965800900468 94.0 -180 130 12.479127305752165 41.89965933182321 94.0 -190 130 12.479187526309259 41.89966065461021 94.0 -200 130 12.479247746870412 41.89966197736567 94.0 -210 130 12.479307967435624 41.899663300089586 94.0 -220 130 12.479368188004893 41.89966462278197 94.0 -230 130 12.47942840857822 41.89966594544281 94.0 -240 130 12.479488629155608 41.89966726807212 94.0 -250 130 12.479548849737053 41.89966859066989 94.0 -260 130 12.479609070322558 41.89966991323612 94.0 -270 130 12.479669290912122 41.89967123577081 94.0 -280 130 12.479729511505745 41.89967255827397 94.0 -290 130 12.479789732103427 41.89967388074559 94.0 -0 140 12.478045107772969 41.89959052585388 94.0 -10 140 12.478105328214834 41.89959184920647 94.0 -20 140 12.478165548660758 41.89959317252752 94.0 -30 140 12.478225769110738 41.899594495817034 94.0 -40 140 12.478285989564775 41.89959581907501 94.0 -50 140 12.478346210022869 41.89959714230145 94.0 -60 140 12.47840643048502 41.899598465496354 94.0 -70 140 12.478466650951228 41.89959978865972 94.0 -80 140 12.478526871421494 41.89960111179155 94.0 -90 140 12.478587091895816 41.89960243489184 94.0 -100 140 12.478647312374198 41.89960375796059 94.0 -110 140 12.478707532856637 41.89960508099781 94.0 -120 140 12.478767753343135 41.89960640400349 94.0 -130 140 12.47882797383369 41.899607726977635 94.0 -140 140 12.478888194328302 41.899609049920244 94.0 -150 140 12.478948414826974 41.89961037283131 94.0 -160 140 12.479008635329702 41.89961169571084 94.0 -170 140 12.479068855836491 41.89961301855884 94.0 -180 140 12.479129076347336 41.89961434137529 94.0 -190 140 12.479189296862241 41.899615664160216 94.0 -200 140 12.479249517381204 41.89961698691359 94.0 -210 140 12.479309737904225 41.89961830963544 94.0 -220 140 12.479369958431306 41.89961963232575 94.0 -230 140 12.479430178962446 41.89962095498452 94.0 -240 140 12.479490399497644 41.89962227761175 94.0 -250 140 12.4795506200369 41.89962360020745 94.0 -260 140 12.479610840580216 41.8996249227716 94.0 -270 140 12.47967106112759 41.89962624530422 94.0 -280 140 12.479731281679022 41.899627567805304 94.0 -290 140 12.479791502234516 41.89962889027485 94.0 -0 150 12.47804687912351 41.89954553544291 94.0 -10 150 12.478107099523188 41.89954685879342 94.0 -20 150 12.478167319926921 41.89954818211239 94.0 -30 150 12.478227540334712 41.89954950539983 94.0 -40 150 12.478287760746559 41.899550828655734 94.0 -50 150 12.478347981162464 41.899552151880094 94.0 -60 150 12.478408201582425 41.89955347507292 94.0 -70 150 12.478468422006445 41.89955479823421 94.0 -80 150 12.478528642434522 41.899556121363965 94.0 -90 150 12.478588862866657 41.89955744446218 94.0 -100 150 12.478649083302848 41.89955876752886 94.0 -110 150 12.478709303743099 41.899560090564 94.0 -120 150 12.478769524187406 41.89956141356761 94.0 -130 150 12.478829744635773 41.89956273653968 94.0 -140 150 12.478889965088197 41.89956405948021 94.0 -150 150 12.478950185544678 41.899565382389206 94.0 -160 150 12.479010406005218 41.89956670526666 94.0 -170 150 12.479070626469817 41.89956802811258 94.0 -180 150 12.479130846938475 41.89956935092696 94.0 -190 150 12.47919106741119 41.8995706737098 94.0 -200 150 12.479251287887964 41.89957199646111 94.0 -210 150 12.479311508368795 41.89957331918088 94.0 -220 150 12.479371728853687 41.899574641869116 94.0 -230 150 12.479431949342636 41.89957596452581 94.0 -240 150 12.479492169835646 41.89957728715097 94.0 -250 150 12.479552390332714 41.89957860974459 94.0 -260 150 12.47961261083384 41.89957993230667 94.0 -270 150 12.479672831339025 41.899581254837216 94.0 -280 150 12.47973305184827 41.899582577336226 94.0 -290 150 12.479793272361572 41.899583899803694 94.0 -0 160 12.478048650470017 41.89950054503152 94.0 10 160 12.478108870827505 41.89950186837996 94.0 -20 160 12.47816909118905 41.89950319169685 94.0 -30 160 12.478229311554651 41.89950451498221 94.0 -40 160 12.47828953192431 41.89950583823604 94.0 -50 160 12.478349752298026 41.89950716145833 94.0 60 160 12.478409972675799 41.89950848464908 94.0 -70 160 12.478470193057628 41.89950980780829 94.0 -80 160 12.478530413443517 41.89951113093597 94.0 -90 160 12.478590633833463 41.89951245403211 94.0 -100 160 12.478650854227466 41.899513777096715 94.0 110 160 12.478711074625526 41.89951510012978 94.0 -120 160 12.478771295027645 41.89951642313132 94.0 -130 160 12.478831515433821 41.89951774610131 94.0 -140 160 12.478891735844057 41.89951906903976 94.0 -150 160 12.47895195625835 41.89952039194668 94.0 160 160 12.4790121766767 41.899521714822065 94.0 -170 160 12.47907239709911 41.89952303766591 94.0 -180 160 12.479132617525577 41.89952436047822 94.0 -190 160 12.479192837956104 41.899525683258986 94.0 -200 160 12.47925305839069 41.89952700600822 94.0 210 160 12.479313278829332 41.899528328725914 94.0 -220 160 12.479373499272034 41.899529651412074 94.0 -230 160 12.479433719718795 41.89953097406669 94.0 -240 160 12.479493940169615 41.89953229668978 94.0 -250 160 12.479554160624494 41.89953361928132 94.0 260 160 12.479614381083431 41.89953494184133 94.0 -270 160 12.479674601546428 41.8995362643698 94.0 -280 160 12.479734822013482 41.899537586866735 94.0 -290 160 12.479795042484596 41.89953890933213 94.0 -0 170 12.478050421812489 41.89945555461972 94.0 -10 170 12.478110642127788 41.899456877966074 94.0 -20 170 12.478170862447143 41.8994582012809 94.0 -30 170 12.478231082770556 41.899459524564186 94.0 -40 170 12.478291303098025 41.89946084781594 94.0 -50 170 12.478351523429552 41.89946217103615 94.0 -60 170 12.478411743765136 41.899463494224825 94.0 -70 170 12.478471964104777 41.89946481738196 94.0 -80 170 12.478532184448476 41.89946614050756 94.0 -90 170 12.478592404796233 41.89946746360163 94.0 -100 170 12.478652625148047 41.89946878666416 94.0 -110 170 12.47871284550392 41.89947010969515 94.0 -120 170 12.478773065863848 41.899471432694604 94.0 -130 170 12.478833286227836 41.89947275566252 94.0 -140 170 12.478893506595883 41.89947407859891 94.0 -150 170 12.478953726967987 41.89947540150375 94.0 -160 170 12.479013947344148 41.89947672437705 94.0 -170 170 12.47907416772437 41.89947804721882 94.0 -180 170 12.479134388108648 41.899479370029056 94.0 -190 170 12.479194608496986 41.89948069280775 94.0 -200 170 12.479254828889381 41.89948201555491 94.0 -210 170 12.479315049285836 41.89948333827053 94.0 -220 170 12.479375269686349 41.89948466095461 94.0 -230 170 12.479435490090921 41.89948598360716 94.0 -240 170 12.479495710499553 41.89948730622817 94.0 -250 170 12.479555930912241 41.899488628817636 94.0 -260 170 12.47961615132899 41.89948995137557 94.0 -270 170 12.479676371749797 41.899491273901965 94.0 -280 170 12.479736592174664 41.899492596396826 94.0 -290 170 12.479796812603588 41.899493918860145 94.0 -0 180 12.478052193150925 41.8994105642075 94.0 -10 180 12.478112413424034 41.899411887551786 94.0 -20 180 12.478172633701202 41.89941321086453 94.0 -30 180 12.478232853982425 41.89941453414574 94.0 -40 180 12.478293074267706 41.89941585739542 94.0 -50 180 12.478353294557044 41.899417180613554 94.0 -60 180 12.47841351485044 41.899418503800156 94.0 -70 180 12.478473735147892 41.89941982695522 94.0 -80 180 12.478533955449402 41.899421150078744 94.0 -90 180 12.478594175754969 41.89942247317074 94.0 -100 180 12.478654396064595 41.89942379623119 94.0 -110 180 12.478714616378278 41.8994251192601 94.0 -120 180 12.478774836696019 41.899426442257486 94.0 -130 180 12.478835057017818 41.89942776522333 94.0 -140 180 12.478895277343675 41.89942908815763 94.0 -150 180 12.47895549767359 41.8994304110604 94.0 -160 180 12.479015718007563 41.89943173393163 94.0 -170 180 12.479075938345595 41.89943305677133 94.0 -180 180 12.479136158687686 41.89943437957948 94.0 -190 180 12.479196379033834 41.8994357023561 94.0 -200 180 12.47925659938404 41.899437025101186 94.0 -210 180 12.479316819738306 41.89943834781473 94.0 -220 180 12.479377040096631 41.89943967049674 94.0 -230 180 12.479437260459013 41.89944099314721 94.0 -240 180 12.479497480825456 41.899442315766144 94.0 -250 180 12.479557701195956 41.89944363835354 94.0 -260 180 12.479617921570517 41.8994449609094 94.0 -270 180 12.479678141949135 41.89944628343372 94.0 -280 180 12.479738362331812 41.899447605926504 94.0 -290 180 12.479798582718548 41.89944892838775 94.0 -0 190 12.478053964485326 41.899365573794874 94.0 -10 190 12.478114184716247 41.89936689713708 94.0 -20 190 12.478174404951226 41.89936822044775 94.0 -30 190 12.47823462519026 41.899369543726884 94.0 -40 190 12.478294845433352 41.899370866974486 94.0 -50 190 12.478355065680502 41.89937219019055 94.0 -60 190 12.478415285931707 41.89937351337507 94.0 -70 190 12.478475506186971 41.89937483652806 94.0 -80 190 12.478535726446292 41.899376159649506 94.0 -90 190 12.478595946709671 41.899377482739425 94.0 -100 190 12.478656166977109 41.8993788057978 94.0 -110 190 12.478716387248602 41.899380128824646 94.0 -120 190 12.478776607524155 41.89938145181995 94.0 -130 190 12.478836827803764 41.89938277478372 94.0 -140 190 12.478897048087433 41.899384097715945 94.0 -150 190 12.47895726837516 41.89938542061664 94.0 -160 190 12.479017488666944 41.89938674348579 94.0 -170 190 12.479077708962787 41.89938806632341 94.0 -180 190 12.479137929262688 41.899389389129496 94.0 -190 190 12.479198149566649 41.89939071190404 94.0 -200 190 12.479258369874668 41.89939203464705 94.0 -210 190 12.479318590186743 41.89939335735852 94.0 -220 190 12.47937881050288 41.899394680038455 94.0 -230 190 12.479439030823073 41.89939600268685 94.0 -240 190 12.479499251147327 41.89939732530371 94.0 -250 190 12.479559471475639 41.89939864788903 94.0 -260 190 12.47961969180801 41.899399970442815 94.0 -270 190 12.479679912144439 41.89940129296506 94.0 -280 190 12.479740132484928 41.89940261545577 94.0 -290 190 12.479800352829475 41.89940393791494 94.0 -0 200 12.47805573581569 41.89932058338183 94.0 -10 200 12.478115956004423 41.89932190672196 94.0 -20 200 12.478176176197213 41.899323230030554 94.0 -30 200 12.47823639639406 41.899324553307615 94.0 -40 200 12.478296616594964 41.899325876553135 94.0 -50 200 12.478356836799923 41.89932719976712 94.0 -60 200 12.478417057008942 41.899328522949574 94.0 -70 200 12.478477277222016 41.899329846100485 94.0 -80 200 12.478537497439149 41.89933116921986 94.0 -90 200 12.478597717660339 41.8993324923077 94.0 -100 200 12.478657937885588 41.899333815364 94.0 -110 200 12.478718158114892 41.89933513838877 94.0 -120 200 12.478778378348256 41.899336461382 94.0 -130 200 12.478838598585678 41.899337784343686 94.0 -140 200 12.478898818827158 41.899339107273846 94.0 -150 200 12.478959039072695 41.899340430172465 94.0 -160 200 12.47901925932229 41.89934175303954 94.0 -170 200 12.479079479575946 41.89934307587509 94.0 -180 200 12.479139699833658 41.8993443986791 94.0 -190 200 12.47919992009543 41.89934572145157 94.0 -200 200 12.479260140361259 41.899347044192496 94.0 -210 200 12.479320360631148 41.8993483669019 94.0 -220 200 12.479380580905095 41.89934968957975 94.0 -230 200 12.4794408011831 41.89935101222608 94.0 -240 200 12.479501021465165 41.899352334840856 94.0 -250 200 12.479561241751288 41.89935365742411 94.0 -260 200 12.47962146204147 41.89935497997581 94.0 -270 200 12.47968168233571 41.89935630249599 94.0 -280 200 12.47974190263401 41.899357624984624 94.0 -290 200 12.47980212293637 41.89935894744172 94.0 -0 210 12.478057507142022 41.89927559296837 94.0 10 210 12.478117727288566 41.89927691630643 94.0 -20 210 12.478177947439166 41.89927823961295 94.0 -30 210 12.478238167593824 41.89927956288793 94.0 -40 210 12.47829838775254 41.89928088613138 94.0 -50 210 12.478358607915311 41.89928220934328 94.0 60 210 12.478418828082141 41.89928353252366 94.0 -70 210 12.478479048253027 41.8992848556725 94.0 -80 210 12.478539268427971 41.8992861787898 94.0 -90 210 12.478599488606973 41.89928750187556 94.0 -100 210 12.478659708790032 41.89928882492979 94.0 110 210 12.47871992897715 41.89929014795248 94.0 -120 210 12.478780149168324 41.89929147094363 94.0 -130 210 12.478840369363557 41.89929279390325 94.0 -140 210 12.478900589562848 41.89929411683133 94.0 -150 210 12.478960809766198 41.89929543972787 94.0 160 210 12.479021029973605 41.89929676259288 94.0 -170 210 12.479081250185072 41.89929808542635 94.0 -180 210 12.479141470400595 41.89929940822828 94.0 -190 210 12.479201690620178 41.899300730998675 94.0 -200 210 12.47926191084382 41.899302053737536 94.0 210 210 12.479322131071518 41.899303376444855 94.0 -220 210 12.479382351303277 41.89930469912064 94.0 -230 210 12.479442571539094 41.899306021764886 94.0 -240 210 12.47950279177897 41.8993073443776 94.0 -250 210 12.479563012022904 41.89930866695877 94.0 260 210 12.479623232270898 41.8993099895084 94.0 -270 210 12.47968345252295 41.8993113120265 94.0 -280 210 12.479743672779062 41.89931263451306 94.0 -290 210 12.479803893039232 41.89931395696808 94.0 -0 220 12.478059278464317 41.8992306025545 94.0 -10 220 12.478119498568672 41.89923192589048 94.0 -20 220 12.478179718677085 41.89923324919492 94.0 -30 220 12.478239938789555 41.89923457246783 94.0 -40 220 12.47830015890608 41.899235895709204 94.0 -50 220 12.478360379026665 41.89923721891904 94.0 -60 220 12.478420599151304 41.899238542097336 94.0 -70 220 12.478480819280003 41.8992398652441 94.0 -80 220 12.47854103941276 41.89924118835932 94.0 -90 220 12.478601259549572 41.89924251144301 94.0 -100 220 12.478661479690443 41.89924383449516 94.0 -110 220 12.478721699835372 41.89924515751578 94.0 -120 220 12.478781919984359 41.89924648050486 94.0 -130 220 12.478842140137402 41.899247803462394 94.0 -140 220 12.478902360294505 41.899249126388405 94.0 -150 220 12.478962580455667 41.89925044928287 94.0 -160 220 12.479022800620886 41.8992517721458 94.0 -170 220 12.479083020790162 41.8992530949772 94.0 -180 220 12.479143240963499 41.89925441777705 94.0 -190 220 12.479203461140893 41.89925574054537 94.0 -200 220 12.479263681322346 41.89925706328216 94.0 -210 220 12.479323901507856 41.8992583859874 94.0 -220 220 12.479384121697427 41.89925970866111 94.0 -230 220 12.479444341891055 41.89926103130328 94.0 -240 220 12.479504562088742 41.89926235391392 94.0 -250 220 12.479564782290488 41.899263676493014 94.0 -260 220 12.479625002496293 41.899264999040575 94.0 -270 220 12.479685222706157 41.899266321556595 94.0 -280 220 12.47974544292008 41.89926764404108 94.0 -290 220 12.479805663138062 41.899268966494034 94.0 -0 230 12.478061049782577 41.899185612140215 94.0 -10 230 12.478121269844744 41.89918693547412 94.0 -20 230 12.478181489910968 41.89918825877649 94.0 -30 230 12.47824170998125 41.89918958204732 94.0 -40 230 12.478301930055586 41.899190905286616 94.0 -50 230 12.478362150133982 41.89919222849437 94.0 -60 230 12.478422370216435 41.8991935516706 94.0 -70 230 12.478482590302944 41.89919487481529 94.0 -80 230 12.478542810393511 41.89919619792843 94.0 -90 230 12.478603030488136 41.899197521010045 94.0 -100 230 12.47866325058682 41.89919884406012 94.0 -110 230 12.478723470689559 41.89920016707866 94.0 -120 230 12.478783690796357 41.899201490065664 94.0 -130 230 12.478843910907214 41.899202813021134 94.0 -140 230 12.478904131022128 41.89920413594506 94.0 -150 230 12.4789643511411 41.89920545883746 94.0 -160 230 12.479024571264132 41.89920678169831 94.0 -170 230 12.47908479139122 41.89920810452763 94.0 -180 230 12.479145011522368 41.89920942732541 94.0 -190 230 12.479205231657573 41.899210750091655 94.0 -200 230 12.479265451796838 41.899212072826366 94.0 -210 230 12.47932567194016 41.899213395529536 94.0 -220 230 12.479385892087542 41.89921471820117 94.0 -230 230 12.479446112238982 41.89921604084127 94.0 -240 230 12.47950633239448 41.89921736344983 94.0 -250 230 12.47956655255404 41.89921868602685 94.0 -260 230 12.479626772717657 41.899220008572335 94.0 -270 230 12.479686992885332 41.89922133108628 94.0 -280 230 12.479747213057067 41.89922265356869 94.0 -290 230 12.47980743323286 41.89922397601957 94.0 -0 240 12.478062821096803 41.899140621725515 94.0 -10 240 12.478123041116781 41.899141945057345 94.0 -20 240 12.478183261140817 41.89914326835764 94.0 -30 240 12.47824348116891 41.899144591626396 94.0 -40 240 12.478303701201058 41.89914591486362 94.0 -50 240 12.478363921237266 41.8991472380693 94.0 -60 240 12.47842414127753 41.89914856124344 94.0 -70 240 12.478484361321852 41.899149884386055 94.0 -80 240 12.47854458137023 41.89915120749713 94.0 -90 240 12.478604801422668 41.899152530576664 94.0 -100 240 12.478665021479161 41.89915385362467 94.0 -110 240 12.478725241539713 41.89915517664113 94.0 -120 240 12.478785461604323 41.89915649962606 94.0 -130 240 12.478845681672992 41.899157822579454 94.0 -140 240 12.478905901745717 41.89915914550131 94.0 -150 240 12.478966121822502 41.89916046839162 94.0 -160 240 12.479026341903344 41.89916179125041 94.0 -170 240 12.479086561988245 41.899163114077645 94.0 -180 240 12.479146782077203 41.899164436873356 94.0 -190 240 12.479207002170222 41.899165759637526 94.0 -200 240 12.479267222267298 41.89916708237016 94.0 -210 240 12.479327442368431 41.89916840507126 94.0 -220 240 12.479387662473625 41.89916972774081 94.0 -230 240 12.479447882582877 41.89917105037884 94.0 -240 240 12.479508102696188 41.89917237298532 94.0 -250 240 12.479568322813558 41.89917369556027 94.0 -260 240 12.479628542934986 41.89917501810368 94.0 -270 240 12.479688763060473 41.899176340615554 94.0 -280 240 12.479748983190019 41.89917766309589 94.0 -290 240 12.479809203323624 41.899178985544694 94.0 -0 250 12.47806459240699 41.8990956313104 94.0 -10 250 12.478124812384783 41.89909695464016 94.0 -20 250 12.47818503236663 41.89909827793837 94.0 -30 250 12.478245252352535 41.89909960120505 94.0 -40 250 12.478305472342496 41.8991009244402 94.0 -50 250 12.478365692336515 41.8991022476438 94.0 -60 250 12.47842591233459 41.899103570815875 94.0 -70 250 12.478486132336723 41.89910489395641 94.0 -80 250 12.478546352342915 41.89910621706541 94.0 -90 250 12.478606572353163 41.89910754014287 94.0 -100 250 12.47866679236747 41.8991088631888 94.0 -110 250 12.478727012385834 41.89911018620319 94.0 -120 250 12.478787232408255 41.89911150918604 94.0 -130 250 12.478847452434735 41.899112832137355 94.0 -140 250 12.478907672465272 41.899114155057134 94.0 -150 250 12.478967892499869 41.89911547794538 94.0 -160 250 12.479028112538522 41.899116800802084 94.0 -170 250 12.479088332581235 41.899118123627254 94.0 -180 250 12.479148552628006 41.89911944642088 94.0 -190 250 12.479208772678836 41.89912076918298 94.0 -200 250 12.479268992733724 41.89912209191354 94.0 -210 250 12.47932921279267 41.89912341461256 94.0 -220 250 12.479389432855674 41.89912473728005 94.0 -230 250 12.479449652922739 41.89912605991599 94.0 -240 250 12.47950987299386 41.899127382520405 94.0 -250 250 12.479570093069043 41.899128705093275 94.0 -260 250 12.479630313148283 41.89913002763461 94.0 -270 250 12.479690533231581 41.899131350144415 94.0 -280 250 12.47975075331894 41.89913267262268 94.0 -290 250 12.479810973410357 41.8991339950694 94.0 -0 260 12.478066363713145 41.89905064089488 94.0 10 260 12.478126583648748 41.89905196422256 94.0 -20 260 12.478186803588407 41.8990532875187 94.0 -30 260 12.478247023532125 41.8990546107833 94.0 -40 260 12.478307243479899 41.89905593401637 94.0 -50 260 12.478367463431729 41.899057257217905 94.0 60 260 12.478427683387617 41.899058580387894 94.0 -70 260 12.478487903347562 41.89905990352636 94.0 -80 260 12.478548123311565 41.89906122663328 94.0 -90 260 12.478608343279625 41.89906254970867 94.0 -100 260 12.478668563251743 41.89906387275252 94.0 110 260 12.478728783227918 41.899065195764834 94.0 -120 260 12.478789003208153 41.899066518745606 94.0 -130 260 12.478849223192444 41.89906784169485 94.0 -140 260 12.478909443180793 41.899069164612555 94.0 -150 260 12.478969663173201 41.89907048749872 94.0 160 260 12.479029883169668 41.89907181035335 94.0 -170 260 12.479090103170192 41.899073133176444 94.0 -180 260 12.479150323174775 41.899074455968005 94.0 -190 260 12.479210543183417 41.899075778728026 94.0 -200 260 12.479270763196116 41.899077101456506 94.0 210 260 12.479330983212876 41.89907842415345 94.0 -220 260 12.47939120323369 41.89907974681886 94.0 -230 260 12.479451423258567 41.899081069452734 94.0 -240 260 12.479511643287502 41.89908239205507 94.0 -250 260 12.479571863320496 41.89908371462587 94.0 260 260 12.479632083357547 41.89908503716513 94.0 -270 260 12.479692303398659 41.89908635967286 94.0 -280 260 12.479752523443828 41.899087682149045 94.0 -290 260 12.479812743493058 41.89908900459369 94.0 -0 270 12.478068135015265 41.89900565047894 94.0 -10 270 12.47812835490868 41.89900697380454 94.0 -20 270 12.47818857480615 41.899008297098604 94.0 -30 270 12.47824879470768 41.899009620361134 94.0 -40 270 12.478309014613265 41.899010943592124 94.0 -50 270 12.478369234522908 41.89901226679159 94.0 -60 270 12.478429454436608 41.8990135899595 94.0 -70 270 12.478489674354366 41.89901491309589 94.0 -80 270 12.47854989427618 41.89901623620074 94.0 -90 270 12.478610114202052 41.89901755927405 94.0 -100 270 12.478670334131982 41.89901888231582 94.0 -110 270 12.47873055406597 41.89902020532606 94.0 -120 270 12.478790774004016 41.899021528304765 94.0 -130 270 12.47885099394612 41.89902285125193 94.0 -140 270 12.478911213892282 41.89902417416756 94.0 -150 270 12.478971433842501 41.899025497051646 94.0 -160 270 12.47903165379678 41.89902681990421 94.0 -170 270 12.479091873755117 41.89902814272522 94.0 -180 270 12.479152093717511 41.89902946551471 94.0 -190 270 12.479212313683965 41.899030788272654 94.0 -200 270 12.479272533654475 41.89903211099906 94.0 -210 270 12.479332753629047 41.89903343369393 94.0 -220 270 12.479392973607675 41.89903475635727 94.0 -230 270 12.479453193590363 41.89903607898906 94.0 -240 270 12.47951341357711 41.899037401589325 94.0 -250 270 12.479573633567915 41.899038724158046 94.0 -260 270 12.47963385356278 41.899040046695234 94.0 -270 270 12.479694073561703 41.89904136920089 94.0 -280 270 12.479754293564683 41.899042691675 94.0 -290 270 12.479814513571725 41.89904401411758 94.0 -0 280 12.47806990631335 41.898960660062585 94.0 -10 280 12.478130126164576 41.89896198338611 94.0 -20 280 12.47819034601986 41.8989633066781 94.0 -30 280 12.4782505658792 41.898964629938554 94.0 -40 280 12.478310785742599 41.89896595316747 94.0 -50 280 12.478371005610052 41.89896727636485 94.0 -60 280 12.478431225481565 41.8989685995307 94.0 -70 280 12.478491445357134 41.898969922665 94.0 -80 280 12.478551665236761 41.898971245767775 94.0 -90 280 12.478611885120445 41.898972568839014 94.0 -100 280 12.478672105008188 41.89897389187871 94.0 -110 280 12.478732324899987 41.898975214886875 94.0 -120 280 12.478792544795846 41.898976537863504 94.0 -130 280 12.47885276469576 41.89897786080859 94.0 -140 280 12.478912984599734 41.89897918372215 94.0 -150 280 12.478973204507767 41.89898050660416 94.0 -160 280 12.479033424419857 41.89898182945464 94.0 -170 280 12.479093644336006 41.89898315227359 94.0 -180 280 12.479153864256213 41.89898447506099 94.0 -190 280 12.479214084180478 41.89898579781686 94.0 -200 280 12.479274304108802 41.8989871205412 94.0 -210 280 12.479334524041185 41.898988443233996 94.0 -220 280 12.479394743977625 41.89898976589526 94.0 -230 280 12.479454963918126 41.89899108852498 94.0 -240 280 12.479515183862684 41.89899241112317 94.0 -250 280 12.479575403811301 41.898993733689814 94.0 -260 280 12.47963562376398 41.898995056224926 94.0 -270 280 12.479695843720714 41.898996378728505 94.0 -280 280 12.479756063681508 41.89899770120054 94.0 -290 280 12.479816283646361 41.89899902364104 94.0 -0 290 12.478071677607398 41.89891566964582 94.0 -10 290 12.478131897416437 41.898916992967266 94.0 -20 290 12.478192117229533 41.89891831625718 94.0 -30 290 12.478252337046685 41.89891963951556 94.0 -40 290 12.478312556867895 41.8989209627424 94.0 -50 290 12.478372776693163 41.89892228593771 94.0 -60 290 12.478432996522487 41.89892360910147 94.0 -70 290 12.478493216355869 41.898924932233705 94.0 -80 290 12.478553436193307 41.8989262553344 94.0 -90 290 12.478613656034804 41.898927578403566 94.0 -100 290 12.478673875880359 41.89892890144119 94.0 -110 290 12.47873409572997 41.89893022444728 94.0 -120 290 12.478794315583642 41.89893154742183 94.0 -130 290 12.47885453544137 41.898932870364845 94.0 -140 290 12.478914755303155 41.898934193276325 94.0 -150 290 12.478974975168999 41.898935516156264 94.0 -160 290 12.479035195038902 41.89893683900467 94.0 -170 290 12.479095414912862 41.89893816182154 94.0 -180 290 12.479155634790882 41.89893948460687 94.0 -190 290 12.47921585467296 41.89894080736067 94.0 -200 290 12.479276074559095 41.89894213008292 94.0 -210 290 12.47933629444929 41.89894345277364 94.0 -220 290 12.479396514343543 41.89894477543283 94.0 -230 290 12.479456734241856 41.89894609806048 94.0 -240 290 12.479516954144227 41.89894742065659 94.0 -250 290 12.479577174050656 41.89894874322117 94.0 -260 290 12.479637393961145 41.89895006575421 94.0 -270 290 12.479697613875691 41.8989513882557 94.0 -280 290 12.479757833794299 41.898952710725666 94.0 -290 290 12.479818053716963 41.898954033164095 94.0 diff --git a/Modules/IO/IOGDAL/test/CMakeLists.txt b/Modules/IO/IOGDAL/test/CMakeLists.txt index fd29305dd3..2afa0e09da 100644 --- a/Modules/IO/IOGDAL/test/CMakeLists.txt +++ b/Modules/IO/IOGDAL/test/CMakeLists.txt @@ -274,8 +274,8 @@ otb_add_test(NAME ioTvGDALRPCTransformerTest_ikonos otbGDALRPCTransformerTest2 ${INPUTDATA}/ikonos/ikonos-1.geom # Geom ${INPUTDATA}/ikonos/ikonos-1.gcp2 # GCP - 1 # GeoTol - 1 # ImgTol + 0.04 # GeoTol + 0.1 # ImgTol ) otb_add_test(NAME ioTvGDALRPCTransformerTest_quickbird @@ -283,8 +283,8 @@ otb_add_test(NAME ioTvGDALRPCTransformerTest_quickbird otbGDALRPCTransformerTest2 ${INPUTDATA}/QB/qb-1.geom # Geom ${INPUTDATA}/QB/qb-1.gcp2 # GCP - 1 # GeoTol - 1 # ImgTol + 0.024 # GeoTol + 0.1 # ImgTol ) otb_add_test(NAME ioTvGDALRPCTransformerTest_spot6 @@ -292,8 +292,8 @@ otb_add_test(NAME ioTvGDALRPCTransformerTest_spot6 otbGDALRPCTransformerTest2 ${INPUTDATA}/spot6/spot6-1.geom # Geom ${INPUTDATA}/spot6/spot6-1.gcp2 # GCP - 1 # GeoTol - 1 # ImgTol + 0.06 # GeoTol + 0.1 # ImgTol ) otb_add_test(NAME ioTvGDALRPCTransformerTest_worldview2 @@ -301,8 +301,8 @@ otb_add_test(NAME ioTvGDALRPCTransformerTest_worldview2 otbGDALRPCTransformerTest2 ${INPUTDATA}/wv2/wv2-1.geom # Geom ${INPUTDATA}/wv2/wv2-1.gcp2 # GCP - 1 # GeoTol - 1 # ImgTol + 0.0185 # GeoTol + 0.1 # ImgTol ) otb_add_test(NAME ioTvGDALRPCTransformerTest_pl_hnord @@ -310,7 +310,7 @@ otb_add_test(NAME ioTvGDALRPCTransformerTest_pl_hnord otbGDALRPCTransformerTest2 ${INPUTDATA}/pleiades/pleiades-1.geom # Geom ${INPUTDATA}/pleiades/pleiades-1.gcp2 # GCP - 1 # GeoTol - 1 # ImgTol + 0.02 # GeoTol + 0.1 # ImgTol ) diff --git a/Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest2.cxx b/Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest2.cxx index 6ceae6e044..0a3ca52fd2 100644 --- a/Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest2.cxx +++ b/Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest2.cxx @@ -27,15 +27,18 @@ #include "otbGeomMetadataSupplier.h" #include "otbImageMetadataInterfaceFactory.h" #include "otbMacro.h" +#include "otbDEMHandler.h" //typedef otb::Image ImageType; -typedef std::list> pointsContainerType; +typedef std::vector> pointsContainerType; typedef itk::Statistics::EuclideanDistanceMetric DistanceType; typedef otb::GeographicalDistance GeographicalDistanceType; int otbGDALRPCTransformerTest2(int itkNotUsed(argc), char* argv[]) { bool success = true; + otb::GDALRPCTransformer::PointType imagePoint; + otb::GDALRPCTransformer::PointType geo3dPoint; // Inputs std::string inputGeomFile(argv[1]); @@ -58,6 +61,7 @@ int otbGDALRPCTransformerTest2(int itkNotUsed(argc), char* argv[]) auto rpcModel = boost::any_cast(imd[otb::MDGeom::RPC]); // Setting the RPCTransformer + // otb::DEMHandler::GetInstance().SetDefaultHeightAboveEllipsoid(0.0); otb::GDALRPCTransformer transformer(rpcModel.LineOffset, rpcModel.SampleOffset, rpcModel.LatOffset, rpcModel.LonOffset, rpcModel.HeightOffset, rpcModel.LineScale, rpcModel.SampleScale, rpcModel.LatScale, rpcModel.LonScale, rpcModel.HeightScale, rpcModel.LineNum, rpcModel.LineDen, rpcModel.SampleNum, rpcModel.SampleDen, false); @@ -68,10 +72,7 @@ int otbGDALRPCTransformerTest2(int itkNotUsed(argc), char* argv[]) std::ifstream file(gcpFileName, std::ios::in); if (file) { - otb::GDALRPCTransformer::PointType imagePoint; - otb::GDALRPCTransformer::PointType geo3dPoint; std::string line; - imagePoint[2] = rpcModel.HeightOffset; while (getline(file, line)) { if (line.find_first_of("#") != 0) @@ -79,6 +80,7 @@ int otbGDALRPCTransformerTest2(int itkNotUsed(argc), char* argv[]) std::istringstream iss(line); iss >> imagePoint[0] >> imagePoint[1] >> geo3dPoint[0] >> geo3dPoint[1] >> geo3dPoint[2]; + imagePoint[2] = geo3dPoint[2]; pointsContainer.push_back(imagePoint); geo3dPointsContainer.push_back(geo3dPoint); @@ -88,35 +90,32 @@ int otbGDALRPCTransformerTest2(int itkNotUsed(argc), char* argv[]) } // For each CGP - pointsContainerType::iterator pointsIt = pointsContainer.begin(); - pointsContainerType::iterator geo3dPointsIt = geo3dPointsContainer.begin(); - while ((pointsIt != pointsContainer.end()) && (geo3dPointsIt != geo3dPointsContainer.end())) + for (pointsContainerType::iterator pointsIt = pointsContainer.begin(), geo3dPointsIt = geo3dPointsContainer.begin() ; + (pointsIt != pointsContainer.end()) && (geo3dPointsIt != geo3dPointsContainer.end()) ; + ++pointsIt, ++geo3dPointsIt) { - otbLogMacro(Debug, << "Point: " << *pointsIt << " GeoPoint: " << *geo3dPointsIt); + // std::cout << "Point: " << *pointsIt << " GeoPoint: " << *geo3dPointsIt << "\n"; // Testing forward transform - otbLogMacro(Debug, << "ForwardTransform: " << transformer.ForwardTransform(*pointsIt)); - auto forwardPointDistance = geoDistance->Evaluate(transformer.ForwardTransform(*pointsIt), *geo3dPointsIt); - otbLogMacro(Debug, << "forwardPointDistance: " << forwardPointDistance); + geo3dPoint = transformer.ForwardTransform(*pointsIt); + auto forwardPointDistance = geoDistance->Evaluate(geo3dPoint, *geo3dPointsIt); if (forwardPointDistance > geoTol) { - std::cerr << "Geo distance between otbGDALRPCTransformer->ForwardTransform and GCP too high : " + std::cerr << "Geo distance between otbGDALRPCTransformer->ForwardTransform and GCP too high :\n" + << "GCP: " << *geo3dPointsIt << " / computed: " << geo3dPoint << "\n" << "dist = " << forwardPointDistance << " (tol = " << geoTol << ")" << std::endl; success = false; } // Testing inverse transform - otbLogMacro(Debug, << "InverseTransform: " << transformer.InverseTransform(*geo3dPointsIt)); - auto inversePointDistance = distance->Evaluate(transformer.InverseTransform(*geo3dPointsIt), *pointsIt); - otbLogMacro(Debug, << "inversePointDistance: " << inversePointDistance); + imagePoint = transformer.InverseTransform(*geo3dPointsIt); + auto inversePointDistance = distance->Evaluate(imagePoint, *pointsIt); if (inversePointDistance > imgTol) { - std::cerr << "Distance between otbGDALRPCTransformer->InverseTransform and GCP too high : " + std::cerr << "Distance between otbGDALRPCTransformer->InverseTransform and GCP too high :\n" + << "GCP: " << *pointsIt << " / computed: " << imagePoint << "\n" << "dist = " << inversePointDistance << " (tol = " << imgTol << ")" << std::endl; success = false; } - - ++pointsIt; - ++geo3dPointsIt; } if (success) -- GitLab From 4a2911e9d1795b86efc1b740c279a21e211c014a Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Tue, 26 Jan 2021 12:48:52 +0100 Subject: [PATCH 097/123] TEST: Add test for GDALRPCTransformer with product instead of geom --- Modules/IO/IOGDAL/test/CMakeLists.txt | 11 ++++++- .../test/otbGDALRPCTransformerTest2.cxx | 33 ++++++++++++++----- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/Modules/IO/IOGDAL/test/CMakeLists.txt b/Modules/IO/IOGDAL/test/CMakeLists.txt index 2afa0e09da..58d250fb30 100644 --- a/Modules/IO/IOGDAL/test/CMakeLists.txt +++ b/Modules/IO/IOGDAL/test/CMakeLists.txt @@ -269,7 +269,7 @@ otb_add_test(NAME TuGDALRPCTransformerTest ${INPUTDATA}/TuGDALRPCTransformerTest_DEM.tif ) -otb_add_test(NAME ioTvGDALRPCTransformerTest_ikonos +otb_add_test(NAME ioTvGDALRPCTransformerTest_ikonos_geom COMMAND otbIOGDALTestDriver otbGDALRPCTransformerTest2 ${INPUTDATA}/ikonos/ikonos-1.geom # Geom @@ -278,6 +278,15 @@ otb_add_test(NAME ioTvGDALRPCTransformerTest_ikonos 0.1 # ImgTol ) +otb_add_test(NAME ioTvGDALRPCTransformerTest_ikonos_product + COMMAND otbIOGDALTestDriver + otbGDALRPCTransformerTest2 + LARGEINPUT{IKONOS/BLOSSEVILLE/po_2619900_blu_0000000.tif} # Product + ${INPUTDATA}/ikonos/ikonos-1.gcp2 # GCP + 0.04 # GeoTol + 0.1 # ImgTol + ) + otb_add_test(NAME ioTvGDALRPCTransformerTest_quickbird COMMAND otbIOGDALTestDriver otbGDALRPCTransformerTest2 diff --git a/Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest2.cxx b/Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest2.cxx index 0a3ca52fd2..b2195b6c47 100644 --- a/Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest2.cxx +++ b/Modules/IO/IOGDAL/test/otbGDALRPCTransformerTest2.cxx @@ -28,6 +28,8 @@ #include "otbImageMetadataInterfaceFactory.h" #include "otbMacro.h" #include "otbDEMHandler.h" +#include "otbImage.h" +#include "otbImageFileReader.h" //typedef otb::Image ImageType; typedef std::vector> pointsContainerType; @@ -41,7 +43,7 @@ int otbGDALRPCTransformerTest2(int itkNotUsed(argc), char* argv[]) otb::GDALRPCTransformer::PointType geo3dPoint; // Inputs - std::string inputGeomFile(argv[1]); + std::string rpcFile(argv[1]); std::string gcpFileName(argv[2]); double geoTol(atof(argv[3])); double imgTol(atof(argv[4])); @@ -49,15 +51,28 @@ int otbGDALRPCTransformerTest2(int itkNotUsed(argc), char* argv[]) // Tools auto distance = DistanceType::New(); auto geoDistance = GeographicalDistanceType::New(); - - // Fetching the RPC model from the product + otb::ImageMetadata imd; - otb::GeomMetadataSupplier geomSupplier(inputGeomFile); - for (int loop = 0 ; loop < geomSupplier.GetNbBands() ; ++loop) - imd.Bands.emplace_back(); - auto imi = otb::ImageMetadataInterfaceFactory::CreateIMI(imd, geomSupplier); - imd = imi->GetImageMetadata(); - geomSupplier.FetchRPC(imd); + if (0 == rpcFile.compare(rpcFile.length() - 4, 4, "geom")) + { + // Fetching the RPC model from a GEOM file + otb::GeomMetadataSupplier geomSupplier(rpcFile); + for (int loop = 0 ; loop < geomSupplier.GetNbBands() ; ++loop) + imd.Bands.emplace_back(); + auto imi = otb::ImageMetadataInterfaceFactory::CreateIMI(imd, geomSupplier); + imd = imi->GetImageMetadata(); + geomSupplier.FetchRPC(imd); + } + else + { + // Fetching the RPC model from a product + typedef otb::Image ImageType; + typedef otb::ImageFileReader ImageFileReaderType; + auto reader = ImageFileReaderType::New(); + reader->SetFileName(rpcFile); + reader->UpdateOutputInformation(); + imd = reader->GetOutput()->GetImageMetadata(); + } auto rpcModel = boost::any_cast(imd[otb::MDGeom::RPC]); // Setting the RPCTransformer -- GitLab From 71e2dcd1acae2792114f8aeca75cbc4f7074f38f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Tue, 26 Jan 2021 14:16:14 +0100 Subject: [PATCH 098/123] BUG: fix various bugs in RPCSolver --- Modules/Filtering/Projection/src/otbRPCSolver.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/Filtering/Projection/src/otbRPCSolver.cxx b/Modules/Filtering/Projection/src/otbRPCSolver.cxx index eb5582a11d..eeded82126 100644 --- a/Modules/Filtering/Projection/src/otbRPCSolver.cxx +++ b/Modules/Filtering/Projection/src/otbRPCSolver.cxx @@ -184,7 +184,7 @@ void computeCoefficients(const std::vector & f, // compute the residual auto residual = M.transpose()*w2*(M*coeffs-r); - auto residualValue = inner_product(residual,residual); + res = inner_product(residual,residual); } outCoeffs.assign(coeffs.begin(), coeffs.end()); @@ -266,7 +266,7 @@ void RPCSolver::Solve(const GCPsContainerType& gcpContainer, PrecisionType& rmsE { const auto & imagePoint = gcp.first; - minc = std::min(imagePoint[0], minl); + minc = std::min(imagePoint[0], minc); maxc = std::max(imagePoint[0], maxc); minl = std::min(imagePoint[1], minl); @@ -385,7 +385,7 @@ void RPCSolver::Solve(const GCPsContainerType& gcpContainer, PrecisionType& rmsE + (gcp.first[1] - outPoint[1]) * (gcp.first[1] - outPoint[1]); } - rmsError = std::sqrt(rmseAcc)/numberOfPoints; + rmsError = std::sqrt(rmseAcc/numberOfPoints); } } \ No newline at end of file -- GitLab From 3eb0a12bdc9302415501b08a715e02b4a1c7d795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Traizet?= Date: Tue, 26 Jan 2021 14:30:24 +0100 Subject: [PATCH 099/123] BUG: update baseline with correct RPC model --- .../otbGCPsToRPCSensorModelImageFilterWithoutDEMOutput.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Data/Baseline/OTB/Files/otbGCPsToRPCSensorModelImageFilterWithoutDEMOutput.txt b/Data/Baseline/OTB/Files/otbGCPsToRPCSensorModelImageFilterWithoutDEMOutput.txt index 69e6a3f6dd..bef7d33022 100644 --- a/Data/Baseline/OTB/Files/otbGCPsToRPCSensorModelImageFilterWithoutDEMOutput.txt +++ b/Data/Baseline/OTB/Files/otbGCPsToRPCSensorModelImageFilterWithoutDEMOutput.txt @@ -1,2 +1,2 @@ -{"LineOffset": "2224.5", "SampleOffset": "2224.5", "LatOffset": "43.6089", "LonOffset": "1.42524", "HeightOffset": "0", "LineScale": "225.5", "SampleScale": "225.5", "LatScale": "1", "LonScale": "1", "HeightScale": "1", "LineNum": [ "0.00174891", "0.469879", "-182.989", "-4.38776e-15", "0.000183514", "3.26103e-23", "1.88011e-36", "-0.000133312", "-0.00295522", "0", "0", "4.13724e-05", "-2.66117e-05", "0", "-0.0037833", "-0.00397229", "0", "0", "0", "0", ], "LineDen": [ "1", "0.119555", "-0.788492", "0", "-0.00176245", "0", "0", "-0.69207", "-0.725175", "0", "0", "4.36024e-06", "-1.21576e-05", "0", "-1.60709e-05", "-1.09766e-05", "0", "0", "0", "0", ], "SampleNum": [ "-4.02927e-05", "140.123", "0.720552", "-6.37125e-15", "-0.000306972", "3.63979e-25", "7.44761e-39", "7.06041e-05", "0.000393491", "0", "0", "0.0051405", "0.00169872", "0", "3.04758e-06", "3.05976e-05", "0", "0", "0", "0", ], "SampleDen": [ "1", "-0.0140619", "0.0561058", "0", "-0.00165426", "0", "0", "-0.720302", "-0.238048", "0", "0", "-2.11371e-07", "-2.52599e-06", "0", "1.28711e-06", "7.08205e-06", "0", "0", "0", "0", ], } -Residual ground error: 0.1243213845 +{"LineOffset": "2224.5", "SampleOffset": "2224.5", "LatOffset": "43.6089", "LonOffset": "1.42524", "HeightOffset": "0", "LineScale": "225.5", "SampleScale": "225.5", "LatScale": "1", "LonScale": "1", "HeightScale": "1", "LineNum": [ "0.00176507", "0.469826", "-182.989", "-3.97557e-14", "0.000167599", "-4.11403e-23", "4.64211e-36", "-0.000132256", "-0.00299522", "0", "0", "4.13719e-05", "-2.66116e-05", "0", "-0.00378323", "-0.0039722", "0", "0", "0", "0", ], "LineDen": [ "1", "0.116648", "-0.795797", "0", "-0.0017625", "0", "0", "-0.692057", "-0.725159", "0", "0", "4.24205e-06", "-1.2217e-05", "0", "-1.62292e-05", "-1.11751e-05", "0", "0", "0", "0", ], "SampleNum": [ "-4.03023e-05", "140.123", "0.720549", "-3.96237e-14", "-0.000307018", "-6.10744e-25", "3.08505e-39", "7.06292e-05", "0.000393857", "0", "0", "0.00514045", "0.00169871", "0", "3.04772e-06", "3.05975e-05", "0", "0", "0", "0", ], "SampleDen": [ "1", "-0.0140652", "0.0561119", "0", "-0.00165428", "0", "0", "-0.720295", "-0.238046", "0", "0", "-2.11567e-07", "-2.527e-06", "0", "1.28729e-06", "7.08213e-06", "0", "0", "0", "0", ], } +Residual ground error: 1.2432282311 -- GitLab From 2c879376f843f7b73382c3a9471b23a530ee6d2f Mon Sep 17 00:00:00 2001 From: Julien Osman Date: Wed, 27 Jan 2021 12:14:02 +0100 Subject: [PATCH 100/123] TEST: Use lattest version of Shareloc to generate the baseline for GDALRPCTransformerTest --- Data/Input/QB/qb-1.gcp2 | 72 ++++++++++++++--------------- Data/Input/ikonos/ikonos-1.gcp2 | 72 ++++++++++++++--------------- Data/Input/pleiades/pleiades-1.gcp2 | 72 ++++++++++++++--------------- Data/Input/spot6/spot6-1.gcp2 | 72 ++++++++++++++--------------- Data/Input/wv2/wv2-1.gcp2 | 72 ++++++++++++++--------------- 5 files changed, 180 insertions(+), 180 deletions(-) diff --git a/Data/Input/QB/qb-1.gcp2 b/Data/Input/QB/qb-1.gcp2 index 1fe3edbef7..a8346c428d 100644 --- a/Data/Input/QB/qb-1.gcp2 +++ b/Data/Input/QB/qb-1.gcp2 @@ -1,37 +1,37 @@ # column row longitude latitude elevation -10 10 1.3541864611935914 43.65450621864526 242.0 -60 10 1.35458364379864 43.654507267694775 242.0 -110 10 1.35498082614308 43.65450831488461 242.0 -160 10 1.355378008227317 43.65450936021477 242.0 -210 10 1.3557751900517558 43.654510403685244 242.0 -260 10 1.3561723716168024 43.65451144529606 242.0 -10 60 1.3541886458413877 43.65420173770933 242.0 -60 60 1.354585821416917 43.65420278652396 242.0 -110 60 1.3549829967333034 43.65420383347905 242.0 -160 60 1.355380171790952 43.65420487857462 242.0 -210 60 1.355777346590268 43.65420592181064 242.0 -260 60 1.3561745211316572 43.65420696318715 242.0 -10 110 1.3541908338949031 43.653897267424455 242.0 -60 110 1.3545880024419779 43.65389831600457 242.0 -110 110 1.3549851707313751 43.65389936272529 242.0 -160 110 1.3553823387635 43.65390040758662 242.0 -210 110 1.3557795065387581 43.65390145058856 242.0 -260 110 1.3561766740575545 43.653902491731124 242.0 -10 160 1.3541930253518417 43.65359280775336 242.0 -60 160 1.3545901868715258 43.65359385609933 242.0 -110 160 1.3549873481349979 43.653594902586036 242.0 -160 160 1.3553845091426628 43.653595947213496 242.0 -210 160 1.3557816698949265 43.653596989981715 242.0 -260 160 1.356178830392194 43.6535980308907 242.0 -10 210 1.3541952202099083 43.6532883586589 242.0 -60 210 1.3545923747032649 43.65328940677107 242.0 -110 210 1.3549895289418747 43.653290453024134 242.0 -160 210 1.3553866829261432 43.653291497418095 242.0 -210 210 1.3557838366564754 43.65329253995296 242.0 -260 210 1.3561809901332769 43.65329358062872 242.0 -10 260 1.35419741846681 43.65298392010406 242.0 -60 260 1.354594565934901 43.65298496798281 242.0 -110 260 1.354991713149711 43.65298601400259 242.0 -160 260 1.3553888601116448 43.65298705816341 242.0 -210 260 1.3557860068211078 43.65298810046528 242.0 -260 260 1.3561831532785054 43.65298914090819 242.0 +10 10 1.354182467536249 43.65450925300863 242.0 +60 10 1.3545796502142065 43.65451030207909 242.0 +110 10 1.3549768326315368 43.65451134928986 242.0 +160 10 1.355374014788645 43.65451239464097 242.0 +210 10 1.3557711966859367 43.65451343813239 242.0 +260 10 1.3561683783238172 43.654514479764146 242.0 +10 60 1.3541846522202792 43.65420477196834 242.0 +60 60 1.354581827868692 43.65420582080392 242.0 +110 60 1.3549790032579432 43.65420686777995 242.0 +160 60 1.355376178388438 43.65420791289645 242.0 +210 60 1.3557733532605816 43.65420895615342 242.0 +260 60 1.3561705278747793 43.65420999755086 242.0 +10 110 1.3541868403100408 43.65390030157949 242.0 +60 110 1.3545840089299739 43.65390135018054 242.0 +110 110 1.3549811772922107 43.6539023969222 242.0 +160 110 1.3553783453971564 43.65390344180446 242.0 +210 110 1.3557755132452167 43.653904484827336 242.0 +260 110 1.3561726808367964 43.65390552599083 242.0 +10 160 1.354189031803238 43.65359584180479 242.0 +60 160 1.354586193395755 43.65359689017168 242.0 +110 160 1.3549833547320413 43.65359793667932 242.0 +160 160 1.355380515812502 43.65359898132771 242.0 +210 160 1.3557776766375425 43.65360002411686 242.0 +260 160 1.356174837207568 43.653601065046765 242.0 +10 210 1.3541912266975757 43.65329139260708 242.0 +60 210 1.3545883812637398 43.65329244074018 242.0 +110 210 1.3549855355751386 43.65329348701417 242.0 +160 210 1.3553826896321772 43.653294531429054 242.0 +210 210 1.3557798434352613 43.653295573984835 242.0 +260 210 1.3561769969847954 43.65329661468152 242.0 +10 260 1.3541934249907601 43.65298695394936 242.0 +60 260 1.3545905725316338 43.65298800184903 242.0 +110 260 1.3549877198192075 43.65298904788973 242.0 +160 260 1.3553848668538861 43.65299009207148 242.0 +210 260 1.3557820136360756 43.652991134394256 242.0 +260 260 1.3561791601661808 43.652992174858085 242.0 diff --git a/Data/Input/ikonos/ikonos-1.gcp2 b/Data/Input/ikonos/ikonos-1.gcp2 index 446e4a956e..68bae8ea0c 100644 --- a/Data/Input/ikonos/ikonos-1.gcp2 +++ b/Data/Input/ikonos/ikonos-1.gcp2 @@ -1,37 +1,37 @@ # column row longitude latitude elevation -10 10 0.665903762230304 49.9234457390763 111.0 -60 10 0.6686877114762707 49.92350176329862 111.0 -110 10 0.6714716694605698 49.92355772074208 111.0 -160 10 0.6742556361727777 49.92361361140617 111.0 -210 10 0.6770396116024714 49.92366943529034 111.0 -260 10 0.6798235957392296 49.923725192394066 111.0 -10 60 0.6659905865998187 49.92164839829601 111.0 -60 60 0.6687744325161559 49.921704418974194 111.0 -110 60 0.6715582871696903 49.92176037287775 111.0 -160 60 0.6743421505499995 49.92181626000614 111.0 -210 60 0.6771260226466618 49.921872080358824 111.0 -260 60 0.6799099034492567 49.92192783393528 111.0 -10 110 0.6660774022223273 49.91985105684492 111.0 -60 110 0.6688611448194165 49.919907073979246 111.0 -110 110 0.671644896152568 49.919963024343154 111.0 -160 110 0.6744286562113604 49.92001890793611 111.0 -210 110 0.6772124249853733 49.920074724757576 111.0 -260 110 0.6799962024641872 49.920130474807024 111.0 -10 160 0.6661642090989714 49.918053714723015 111.0 -60 160 0.6689478483871932 49.91810972831376 111.0 -110 160 0.6717314964103422 49.91816567513829 111.0 -160 160 0.6745151531579986 49.91822155519608 111.0 -210 160 0.6772988186197428 49.91827736848659 111.0 -260 160 0.680082492785157 49.9183331150093 111.0 -10 210 0.6662510072308931 49.91625637193031 111.0 -60 210 0.6690345432206264 49.916312381977725 111.0 -110 210 0.6718180879441524 49.91636832526314 111.0 -160 210 0.6746016413910522 49.916424201786036 111.0 -210 210 0.6773852035509075 49.916480011545865 111.0 -260 210 0.6801687744133015 49.916535754542096 111.0 -10 260 0.6663377966192335 49.91445902846678 111.0 -60 260 0.6691212293208564 49.91451503497114 111.0 -110 260 0.6719046707551374 49.91457097471771 111.0 -160 260 0.6746881209116588 49.914626847705975 111.0 -210 260 0.6774715797800035 49.91468265393538 111.0 -260 260 0.680255047349756 49.91473839340541 111.0 +10 10 0.6658750544838034 49.923463151900904 111.0 +60 10 0.6686590046756826 49.92351917682645 111.0 +110 10 0.6714429636060101 49.92357513497311 111.0 +160 10 0.6742269312643617 49.92363102634035 111.0 +210 10 0.6770109076403149 49.923686850927645 111.0 +260 10 0.6797948927234478 49.92374260873445 111.0 +10 60 0.6659618799740855 49.92166581116278 111.0 +60 60 0.6687457268362428 49.92172183254416 111.0 +110 60 0.6715295824357131 49.92177778715086 111.0 +160 60 0.6743134467620735 49.92183367498236 111.0 +210 60 0.6770973198049026 49.92188949603812 111.0 +260 60 0.67988120155378 49.921945250317606 111.0 +10 110 0.6660486967172462 49.91986846975386 111.0 +60 110 0.6688324402600632 49.91992448759133 111.0 +110 110 0.671616192539058 49.91998043865834 111.0 +160 110 0.6743999535438092 49.92003632295436 111.0 +210 110 0.6771837232638964 49.92009214047886 111.0 +260 110 0.6799675016889003 49.920147891231295 111.0 +10 160 0.6661355047144274 49.918071127674125 111.0 +60 160 0.6689191449482844 49.91812714196796 111.0 +110 160 0.6717027939171843 49.91818308949555 111.0 +160 160 0.6744864516107071 49.91823897025636 111.0 +210 160 0.6772701180184332 49.91829478424986 111.0 +260 160 0.6800537931299447 49.91835053147551 111.0 +10 210 0.6662223039667708 49.91627378492358 111.0 +60 210 0.669005840902047 49.916329795674045 111.0 +110 210 0.6717893865712314 49.91638573966248 111.0 +160 210 0.6745729409639051 49.91644161688834 111.0 +210 210 0.6773565040696498 49.91649742735111 111.0 +260 210 0.6801400758780487 49.916553171050246 111.0 +10 260 0.6663090944754178 49.91447644150221 111.0 +60 260 0.6690925281224911 49.91453244870957 111.0 +110 260 0.671875970502338 49.91458838915912 111.0 +160 260 0.6746594216045408 49.91464426285031 111.0 +210 260 0.6774428814186826 49.91470006978261 111.0 +260 260 0.6802263499343474 49.9147558099555 111.0 diff --git a/Data/Input/pleiades/pleiades-1.gcp2 b/Data/Input/pleiades/pleiades-1.gcp2 index 829a0af67c..8337a2d25b 100644 --- a/Data/Input/pleiades/pleiades-1.gcp2 +++ b/Data/Input/pleiades/pleiades-1.gcp2 @@ -1,37 +1,37 @@ # column row longitude latitude elevation -10 10 1.361970863072613 43.68567707240341 255.0 -60 10 1.3622729483773461 43.6856791471943 255.0 -110 10 1.3625750367266993 43.68568122122537 255.0 -160 10 1.3628771281210417 43.68568329449665 255.0 -210 10 1.3631792225607426 43.68568536700817 255.0 -260 10 1.3634813200461704 43.685687438759956 255.0 -10 60 1.3619720385429164 43.68545148452901 255.0 -60 60 1.3622741234548834 43.68545355819797 255.0 -110 60 1.3625762114116604 43.685455631107104 255.0 -160 60 1.362878302413617 43.685457703256425 255.0 -210 60 1.3631803964611222 43.685459774645985 255.0 -260 60 1.3634824935545435 43.6854618452758 255.0 -10 110 1.3619732128254411 43.68522589623107 255.0 -60 110 1.3622752973445496 43.685227968778015 255.0 -110 110 1.3625773849086589 43.685230040565116 255.0 -160 110 1.3628794755181384 43.685232111592406 255.0 -210 110 1.3631815691733566 43.68523418185992 255.0 -260 110 1.3634836658746812 43.685236251367684 255.0 -10 160 1.3619743859184794 43.68500030751015 255.0 -60 160 1.3622764700446377 43.685002378934996 255.0 -110 160 1.362578557215988 43.68500444959999 255.0 -160 160 1.3628806474328994 43.685006519505166 255.0 -210 160 1.36318274069574 43.685008588650554 255.0 -260 160 1.3634848370048773 43.68501065703618 255.0 -10 210 1.3619755578203252 43.684774718366825 255.0 -60 210 1.362277641553442 43.68477678866949 255.0 -110 210 1.3625797283319423 43.68477885821229 255.0 -160 210 1.3628818181561948 43.684780926995266 255.0 -210 210 1.3631839110265676 43.684782995018445 255.0 -260 210 1.363486006943428 43.68478506228186 255.0 -10 260 1.3619767285292745 43.68454912880166 255.0 -60 260 1.3622788118692586 43.68455119798206 255.0 -110 260 1.3625