From 0245d270bc797c0abd3b3970c8b169f4a9d0f67b Mon Sep 17 00:00:00 2001 From: Jenn Nguyen Date: Tue, 18 Jan 2022 16:33:20 -0800 Subject: [PATCH 1/9] Geospatial component for heightmap & DEMs (#267) Signed-off-by: Jenn Nguyen Co-authored-by: Steve Peters Co-authored-by: Ian Chen --- .github/ci/packages.apt | 1 + CMakeLists.txt | 11 +- Migration.md | 15 +- .../include/ignition/common/CMakeLists.txt | 2 + .../include/ignition/common/Dem.hh | 22 +-- .../include/ignition/common/HeightmapData.hh | 12 ++ .../include/ignition/common/ImageHeightmap.hh | 3 +- geospatial/src/CMakeLists.txt | 22 +++ {graphics => geospatial}/src/Dem.cc | 146 ++++++++++++------ {graphics => geospatial}/src/Dem_TEST.cc | 110 ++++++++----- .../src/ImageHeightmap.cc | 0 .../src/ImageHeightmap_TEST.cc | 5 +- test/data/dem_landscape.tif | Bin 0 -> 100487 bytes test/data/dem_nodata.dem | Bin 0 -> 9441 bytes test/data/dem_portrait.tif | Bin 0 -> 100487 bytes test/data/dem_squared.tif | Bin 0 -> 67701 bytes test/data/dem_unfinished.tif | Bin 0 -> 5144 bytes 17 files changed, 248 insertions(+), 101 deletions(-) create mode 100644 geospatial/include/ignition/common/CMakeLists.txt rename {graphics => geospatial}/include/ignition/common/Dem.hh (90%) rename {graphics => geospatial}/include/ignition/common/HeightmapData.hh (84%) rename {graphics => geospatial}/include/ignition/common/ImageHeightmap.hh (98%) create mode 100644 geospatial/src/CMakeLists.txt rename {graphics => geospatial}/src/Dem.cc (69%) rename {graphics => geospatial}/src/Dem_TEST.cc (51%) rename {graphics => geospatial}/src/ImageHeightmap.cc (100%) rename {graphics => geospatial}/src/ImageHeightmap_TEST.cc (97%) create mode 100644 test/data/dem_landscape.tif create mode 100644 test/data/dem_nodata.dem create mode 100644 test/data/dem_portrait.tif create mode 100644 test/data/dem_squared.tif create mode 100644 test/data/dem_unfinished.tif diff --git a/.github/ci/packages.apt b/.github/ci/packages.apt index 9bfe4b327..f9908b5f4 100644 --- a/.github/ci/packages.apt +++ b/.github/ci/packages.apt @@ -3,6 +3,7 @@ libavdevice-dev libavformat-dev libavutil-dev libfreeimage-dev +libgdal-dev libgts-dev libignition-cmake2-dev libignition-math7-dev diff --git a/CMakeLists.txt b/CMakeLists.txt index da71892bb..a9d507c8e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,7 +48,7 @@ message(STATUS "\n\n-- ====== Finding Dependencies ======") #-------------------------------------- # Find ignition-math -ign_find_package(ignition-math7 REQUIRED_BY graphics events) +ign_find_package(ignition-math7 REQUIRED_BY geospatial graphics events) set(IGN_MATH_VER ${ignition-math7_VERSION_MAJOR}) #-------------------------------------- @@ -94,6 +94,13 @@ ign_find_package( REQUIRED_BY graphics PRIVATE_FOR graphics) +#------------------------------------ +# Find GDAL +ign_find_package(GDAL VERSION 3.0 + PKGCONFIG gdal + PRIVATE_FOR geospatial + REQUIRED_BY geospatial) + #------------------------------------ # Find libswscale ign_find_package(SWSCALE REQUIRED_BY av PRETTY libswscale) @@ -125,7 +132,7 @@ configure_file("${PROJECT_SOURCE_DIR}/cppcheck.suppress.in" ${PROJECT_BINARY_DIR}/cppcheck.suppress) ign_configure_build(QUIT_IF_BUILD_ERRORS - COMPONENTS av events graphics profiler) + COMPONENTS av events geospatial graphics profiler) #============================================================================ # Create package information diff --git a/Migration.md b/Migration.md index 69f1bb4bb..7b9385355 100644 --- a/Migration.md +++ b/Migration.md @@ -5,6 +5,20 @@ Deprecated code produces compile-time warnings. These warning serve as notification to users that their code should be upgraded. The next major release will remove the deprecated code. +## Ignition Common 4.X to 5.X + +### Additions + +1. **geospatial** component that loads heightmap images and DEMs + + Depends on the ign-common's `graphics` component and the `gdal` library + +### Modifications + +1. `HeightmapData.hh` and `ImageHeightmap.hh` have been moved out of the +`graphics` component and into the new `geospatial` component + + To use the heightmap features, users must add the `geospatial` component + to the `find_package` call + ## Ignition Common 3.X to 4.X ### Modifications @@ -72,4 +86,3 @@ release will remove the deprecated code. 1. **ignition-cmake** + Ignition-math now has a build dependency on ignition-cmake, which allows cmake scripts to be shared across all the ignition packages. - diff --git a/geospatial/include/ignition/common/CMakeLists.txt b/geospatial/include/ignition/common/CMakeLists.txt new file mode 100644 index 000000000..7155438eb --- /dev/null +++ b/geospatial/include/ignition/common/CMakeLists.txt @@ -0,0 +1,2 @@ + +ign_install_all_headers(COMPONENT geospatial) diff --git a/graphics/include/ignition/common/Dem.hh b/geospatial/include/ignition/common/Dem.hh similarity index 90% rename from graphics/include/ignition/common/Dem.hh rename to geospatial/include/ignition/common/Dem.hh index ff83c0dd8..2d251b7ec 100644 --- a/graphics/include/ignition/common/Dem.hh +++ b/geospatial/include/ignition/common/Dem.hh @@ -18,18 +18,17 @@ #define IGNITION_COMMON_DEM_HH_ #include +#include +#include + #include #include +#include #include #include -#ifdef HAVE_GDAL -# include -# include - -# include namespace ignition { @@ -53,7 +52,8 @@ namespace ignition /// \brief Get the elevation of a terrain's point in meters. /// \param[in] _x X coordinate of the terrain. /// \param[in] _y Y coordinate of the terrain. - /// \return Terrain's elevation at (x,y) in meters. + /// \return Terrain's elevation at (x,y) in meters or infinity if illegal + /// coordinates were provided. public: double Elevation(double _x, double _y); /// \brief Get the terrain's minimum elevation in meters. @@ -68,7 +68,8 @@ namespace ignition /// origin in WGS84. /// \param[out] _latitude Georeferenced latitude. /// \param[out] _longitude Georeferenced longitude. - public: void GeoReferenceOrigin(ignition::math::Angle &_latitude, + /// \return True if able to retrieve origin coordinates. False otherwise. + public: bool GeoReferenceOrigin(ignition::math::Angle &_latitude, ignition::math::Angle &_longitude) const; /// \brief Get the terrain's height. Due to the Ogre constrains, this @@ -120,7 +121,8 @@ namespace ignition /// \param[in] _y Y coordinate of the terrain. /// \param[out] _latitude Georeferenced latitude. /// \param[out] _longitude Georeferenced longitude. - private: void GeoReference(double _x, double _y, + /// \return True if able to retrieve coordinates. False otherwise. + private: bool GeoReference(double _x, double _y, ignition::math::Angle &_latitude, ignition::math::Angle &_longitude) const; @@ -130,6 +132,9 @@ namespace ignition /// \return 0 when the operation succeeds to open a file. private: int LoadData(); + // Documentation inherited. + public: std::string Filename() const; + /// internal /// \brief Pointer to the private data. IGN_UTILS_IMPL_PTR(dataPtr) @@ -137,4 +142,3 @@ namespace ignition } } #endif -#endif diff --git a/graphics/include/ignition/common/HeightmapData.hh b/geospatial/include/ignition/common/HeightmapData.hh similarity index 84% rename from graphics/include/ignition/common/HeightmapData.hh rename to geospatial/include/ignition/common/HeightmapData.hh index 22eeb4945..a67b1135a 100644 --- a/graphics/include/ignition/common/HeightmapData.hh +++ b/geospatial/include/ignition/common/HeightmapData.hh @@ -17,6 +17,7 @@ #ifndef IGNITION_COMMON_HEIGHTMAPDATA_HH_ #define IGNITION_COMMON_HEIGHTMAPDATA_HH_ +#include #include #include #include @@ -57,6 +58,17 @@ namespace ignition /// \brief Get the maximum terrain's elevation. /// \return The maximum terrain's elevation. public: virtual float MaxElevation() const = 0; + + /// \brief Get the min terrain's elevation. + /// \return The min terrain's elevation. + public: virtual float MinElevation() const + { + return 0.0f; + } + + /// \brief Get the full filename of loaded heightmap image/dem + /// \return The filename used to load the heightmap image/dem + public: virtual std::string Filename() const = 0; }; } } diff --git a/graphics/include/ignition/common/ImageHeightmap.hh b/geospatial/include/ignition/common/ImageHeightmap.hh similarity index 98% rename from graphics/include/ignition/common/ImageHeightmap.hh rename to geospatial/include/ignition/common/ImageHeightmap.hh index 43a1bccc8..5ee7431e8 100644 --- a/graphics/include/ignition/common/ImageHeightmap.hh +++ b/geospatial/include/ignition/common/ImageHeightmap.hh @@ -49,8 +49,7 @@ namespace ignition const ignition::math::Vector3d &_scale, bool _flipY, std::vector &_heights); - /// \brief Get the full filename of the image - /// \return The filename used to load the image + // Documentation inherited. public: std::string Filename() const; // Documentation inherited. diff --git a/geospatial/src/CMakeLists.txt b/geospatial/src/CMakeLists.txt new file mode 100644 index 000000000..6975e86fc --- /dev/null +++ b/geospatial/src/CMakeLists.txt @@ -0,0 +1,22 @@ + +ign_get_libsources_and_unittests(sources gtest_sources) + +ign_add_component(geospatial + SOURCES ${sources} + DEPENDS_ON_COMPONENTS graphics + GET_TARGET_NAME geospatial_target) + +target_link_libraries(${geospatial_target} + PUBLIC + ${PROJECT_LIBRARY_TARGET_NAME}-graphics + ignition-math${IGN_MATH_VER}::ignition-math${IGN_MATH_VER} + ignition-utils${IGN_UTILS_VER}::ignition-utils${IGN_UTILS_VER} + PRIVATE + ${GDAL_LIBRARY}) + +target_include_directories(${geospatial_target} + PRIVATE + ${GDAL_INCLUDE_DIR}) + +ign_build_tests(TYPE UNIT SOURCES ${gtest_sources} + LIB_DEPS ${geospatial_target}) diff --git a/graphics/src/Dem.cc b/geospatial/src/Dem.cc similarity index 69% rename from graphics/src/Dem.cc rename to geospatial/src/Dem.cc index ad52f023c..eb9318555 100644 --- a/graphics/src/Dem.cc +++ b/geospatial/src/Dem.cc @@ -15,13 +15,10 @@ * */ #include +#include -#ifdef HAVE_GDAL -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wfloat-equal" -# include -# pragma GCC diagnostic pop -#endif +#include +#include #include "ignition/common/Console.hh" #include "ignition/common/Dem.hh" @@ -30,8 +27,6 @@ using namespace ignition; using namespace common; -#ifdef HAVE_GDAL - class ignition::common::Dem::Implementation { /// \brief A set of associated raster bands. @@ -57,6 +52,9 @@ class ignition::common::Dem::Implementation /// \brief DEM data converted to be OGRE-compatible. public: std::vector demData; + + /// \brief Full filename used to load the dem. + public: std::string filename; }; ////////////////////////////////////////////////// @@ -89,12 +87,13 @@ int Dem::Load(const std::string &_filename) // Sanity check std::string fullName = _filename; if (!exists(findFilePath(fullName))) - fullName = common::find_file(_filename); + fullName = common::findFile(_filename); + + this->dataPtr->filename = fullName; if (!exists(findFilePath(fullName))) { - gzerr << "Unable to open DEM file[" << _filename - << "], check your GAZEBO_RESOURCE_PATH settings." << std::endl; + ignerr << "Unable to find DEM file[" << _filename << "]." << std::endl; return -1; } @@ -103,25 +102,25 @@ int Dem::Load(const std::string &_filename) if (this->dataPtr->dataSet == nullptr) { - gzerr << "Unable to open DEM file[" << fullName - << "]. Format not recognised as a supported dataset." << std::endl; + ignerr << "Unable to open DEM file[" << fullName + << "]. Format not recognized as a supported dataset." << std::endl; return -1; } - int nBands = this->dataPtr->dataSet->RasterCount(); + int nBands = this->dataPtr->dataSet->GetRasterCount(); if (nBands != 1) { - gzerr << "Unsupported number of bands in file [" << fullName + "]. Found " + ignerr << "Unsupported number of bands in file [" << fullName + "]. Found " << nBands << " but only 1 is a valid value." << std::endl; return -1; } // Set the pointer to the band - this->dataPtr->band = this->dataPtr->dataSet->RasterBand(1); + this->dataPtr->band = this->dataPtr->dataSet->GetRasterBand(1); // Raster width and height - xSize = this->dataPtr->dataSet->RasterXSize(); - ySize = this->dataPtr->dataSet->RasterYSize(); + xSize = this->dataPtr->dataSet->GetRasterXSize(); + ySize = this->dataPtr->dataSet->GetRasterYSize(); // Corner coordinates upLeftX = 0.0; @@ -132,9 +131,15 @@ int Dem::Load(const std::string &_filename) lowLeftY = ySize; // Calculate the georeferenced coordinates of the terrain corners - this->GeoReference(upLeftX, upLeftY, upLeftLat, upLeftLong); - this->GeoReference(upRightX, upRightY, upRightLat, upRightLong); - this->GeoReference(lowLeftX, lowLeftY, lowLeftLat, lowLeftLong); + if (!this->GeoReference(upLeftX, upLeftY, upLeftLat, upLeftLong) + || !this->GeoReference(upRightX, upRightY, upRightLat, upRightLong) + || !this->GeoReference(lowLeftX, lowLeftY, lowLeftLat, lowLeftLong)) + { + ignerr << "Failed to automatically compute DEM size. " + << "Please use the element to manually set DEM size." + << std::endl; + return -1; + } // Set the world width and height this->dataPtr->worldWidth = @@ -161,12 +166,38 @@ int Dem::Load(const std::string &_filename) if (this->LoadData() != 0) return -1; - // Set the min/max heights - this->dataPtr->minElevation = *std::min_element(&this->dataPtr->demData[0], - &this->dataPtr->demData[0] + this->dataPtr->side * this->dataPtr->side); - this->dataPtr->maxElevation = *std::max_element(&this->dataPtr->demData[0], - &this->dataPtr->demData[0] + this->dataPtr->side * this->dataPtr->side); + // Check for nodata value in dem data. This is used when computing the + // min elevation. If nodata value is not defined, we assume it will be one + // of the commonly used values such as -9999, -32768, etc. + // See https://desktop.arcgis.com/en/arcmap/10.8/manage-data/raster-and-images/nodata-in-raster-datasets.htm + // For simplicity, we will treat values <= -9999 as nodata values and + // ignore them when computing the min elevation. + int validNoData = 0; + const double defaultNoDataValue = -9999; + double noDataValue = this->dataPtr->band->GetNoDataValue(&validNoData); + if (validNoData <= 0) + noDataValue = defaultNoDataValue; + + double min = ignition::math::MAX_D; + double max = -ignition::math::MAX_D; + for (auto d : this->dataPtr->demData) + { + if (d > noDataValue) + { + if (d < min) + min = d; + if (d > max) + max = d; + } + } + if (ignition::math::equal(min, ignition::math::MAX_D) || + ignition::math::equal(max, -ignition::math::MAX_D)) + { + ignwarn << "DEM is composed of 'nodata' values!" << std::endl; + } + this->dataPtr->minElevation = min; + this->dataPtr->maxElevation = max; return 0; } @@ -175,9 +206,10 @@ double Dem::Elevation(double _x, double _y) { if (_x >= this->Width() || _y >= this->Height()) { - gzthrow("Illegal coordinates. You are asking for the elevation in (" << - _x << "," << _y << ") but the terrain is [" << this->Width() << - " x " << this->Height() << "]\n"); + ignerr << "Illegal coordinates. You are asking for the elevation in (" + << _x << "," << _y << ") but the terrain is [" + << this->Width() << " x " << this->Height() << "]" << std::endl; + return std::numeric_limits::infinity(); } return this->dataPtr->demData.at(_y * this->Width() + _x); @@ -196,11 +228,11 @@ float Dem::MaxElevation() const } ////////////////////////////////////////////////// -void Dem::GeoReference(double _x, double _y, +bool Dem::GeoReference(double _x, double _y, ignition::math::Angle &_latitude, ignition::math::Angle &_longitude) const { double geoTransf[6]; - if (this->dataPtr->dataSet->GeoTransform(geoTransf) == CE_None) + if (this->dataPtr->dataSet->GetGeoTransform(geoTransf) == CE_None) { OGRSpatialReference sourceCs; OGRSpatialReference targetCs; @@ -208,26 +240,40 @@ void Dem::GeoReference(double _x, double _y, double xGeoDeg, yGeoDeg; // Transform the terrain's coordinate system to WGS84 - char *importString = strdup(this->dataPtr->dataSet->ProjectionRef()); + const char *importString + = strdup(this->dataPtr->dataSet->GetProjectionRef()); sourceCs.importFromWkt(&importString); targetCs.SetWellKnownGeogCS("WGS84"); cT = OGRCreateCoordinateTransformation(&sourceCs, &targetCs); + if (nullptr == cT) + { + ignerr << "Unable to transform terrain coordinate system to WGS84 for " + << "coordinates (" << _x << "," << _y << ")" << std::endl; + OCTDestroyCoordinateTransformation(cT); + return false; + } xGeoDeg = geoTransf[0] + _x * geoTransf[1] + _y * geoTransf[2]; yGeoDeg = geoTransf[3] + _x * geoTransf[4] + _y * geoTransf[5]; cT->Transform(1, &xGeoDeg, &yGeoDeg); - _latitude.Degree(yGeoDeg); - _longitude.Degree(xGeoDeg); + _latitude.SetDegree(yGeoDeg); + _longitude.SetDegree(xGeoDeg); + + OCTDestroyCoordinateTransformation(cT); } else - gzthrow("Unable to obtain the georeferenced values for coordinates (" - << _x << "," << _y << ")\n"); + { + ignerr << "Unable to obtain the georeferenced values for coordinates (" + << _x << "," << _y << ")" << std::endl; + return false; + } + return true; } ////////////////////////////////////////////////// -void Dem::GeoReferenceOrigin(ignition::math::Angle &_latitude, +bool Dem::GeoReferenceOrigin(ignition::math::Angle &_latitude, ignition::math::Angle &_longitude) const { return this->GeoReference(0, 0, _latitude, _longitude); @@ -265,7 +311,7 @@ void Dem::FillHeightMap(int _subSampling, unsigned int _vertSize, { if (_subSampling <= 0) { - gzerr << "Illegal subsampling value (" << _subSampling << ")\n"; + ignerr << "Illegal subsampling value (" << _subSampling << ")\n"; return; } @@ -299,8 +345,8 @@ void Dem::FillHeightMap(int _subSampling, unsigned int _vertSize, double px4 = this->dataPtr->demData[y2 * this->dataPtr->side + x2]; float h2 = (px3 - ((px3 - px4) * dx)); - float h = (h1 - ((h1 - h2) * dy) - std::max(0.0f, - this->MinElevation())) * _scale.Z(); + float h = this->dataPtr->minElevation + + (h1 - ((h1 - h2) * dy) - this->dataPtr->minElevation) * _scale.Z(); // Invert pixel definition so 1=ground, 0=full height, // if the terrain size has a negative z component @@ -308,9 +354,9 @@ void Dem::FillHeightMap(int _subSampling, unsigned int _vertSize, if (_size.Z() < 0) h *= -1; - // Convert to 0 if a NODATA value is found - if (_size.Z() >= 0 && h < 0) - h = 0; + // Convert to minElevation if a NODATA value is found + if (_size.Z() >= 0 && h < this->dataPtr->minElevation) + h = this->dataPtr->minElevation; // Store the height for future use if (!_flipY) @@ -326,14 +372,14 @@ int Dem::LoadData() { unsigned int destWidth; unsigned int destHeight; - unsigned int nXSize = this->dataPtr->dataSet->RasterXSize(); - unsigned int nYSize = this->dataPtr->dataSet->RasterYSize(); + unsigned int nXSize = this->dataPtr->dataSet->GetRasterXSize(); + unsigned int nYSize = this->dataPtr->dataSet->GetRasterYSize(); float ratio; std::vector buffer; if (nXSize == 0 || nYSize == 0) { - gzerr << "Illegal size loading a DEM file (" << nXSize << "," + ignerr << "Illegal size loading a DEM file (" << nXSize << "," << nYSize << ")\n"; return -1; } @@ -360,7 +406,7 @@ int Dem::LoadData() if (this->dataPtr->band->RasterIO(GF_Read, 0, 0, nXSize, nYSize, &buffer[0], destWidth, destHeight, GDT_Float32, 0, 0) != CE_None) { - gzerr << "Failure calling RasterIO while loading a DEM file\n"; + ignerr << "Failure calling RasterIO while loading a DEM file\n"; return -1; } @@ -378,4 +424,8 @@ int Dem::LoadData() return 0; } -#endif +////////////////////////////////////////////////// +std::string Dem::Filename() const +{ + return this->dataPtr->filename; +} diff --git a/graphics/src/Dem_TEST.cc b/geospatial/src/Dem_TEST.cc similarity index 51% rename from graphics/src/Dem_TEST.cc rename to geospatial/src/Dem_TEST.cc index bc39e7248..5a8fcde20 100644 --- a/graphics/src/Dem_TEST.cc +++ b/geospatial/src/Dem_TEST.cc @@ -16,6 +16,7 @@ */ #include +#include #include #include @@ -26,10 +27,8 @@ using namespace ignition; class DemTest : public common::testing::AutoLogFixture { }; -#ifdef HAVE_GDAL - ///////////////////////////////////////////////// -TEST_F(DemTest, MisingFile) +TEST_F(DemTest, MissingFile) { common::Dem dem; EXPECT_NE(dem.Load("/file/shouldn/never/exist.png"), 0); @@ -39,9 +38,7 @@ TEST_F(DemTest, MisingFile) TEST_F(DemTest, NotDem) { common::Dem dem; - std::string path; - - path = "file://media/materials/scripts/CMakeLists.txt"; + const auto path = common::testing::TestFile("CMakeLists.txt"); EXPECT_NE(dem.Load(path), 0); } @@ -49,9 +46,7 @@ TEST_F(DemTest, NotDem) TEST_F(DemTest, UnsupportedDem) { common::Dem dem; - std::string path; - - path = "file://media/materials/textures/wood.jpg"; + const auto path = common::testing::TestFile("data", "heightmap_bowl.png"); EXPECT_NE(dem.Load(path), 0); } @@ -86,30 +81,34 @@ TEST_F(DemTest, BasicAPI) const auto path = common::testing::TestFile("data", "dem_squared.tif"); EXPECT_EQ(dem.Load(path), 0); + // Check filename + EXPECT_EQ(path, dem.Filename()); + // Check the heights and widths - EXPECT_EQ(129, static_cast(dem.GetHeight())); - EXPECT_EQ(129, static_cast(dem.GetWidth())); - EXPECT_FLOAT_EQ(3984.4849, dem.GetWorldHeight()); - EXPECT_FLOAT_EQ(3139.7456, dem.GetWorldWidth()); - EXPECT_FLOAT_EQ(65.3583, dem.GetMinElevation()); - EXPECT_FLOAT_EQ(318.441, dem.GetMaxElevation()); - - // Check GetElevation() - unsigned int width = dem.GetWidth(); - unsigned int height = dem.GetHeight(); - EXPECT_FLOAT_EQ(215.82324, dem.GetElevation(0, 0)); - EXPECT_FLOAT_EQ(216.04961, dem.GetElevation(width - 1, 0)); - EXPECT_FLOAT_EQ(142.2274, dem.GetElevation(0, height - 1)); - EXPECT_FLOAT_EQ(209.14784, dem.GetElevation(width - 1, height - 1)); + EXPECT_EQ(129, static_cast(dem.Height())); + EXPECT_EQ(129, static_cast(dem.Width())); + EXPECT_FLOAT_EQ(3984.4849, dem.WorldHeight()); + EXPECT_FLOAT_EQ(3139.7456, dem.WorldWidth()); + EXPECT_FLOAT_EQ(65.3583, dem.MinElevation()); + EXPECT_FLOAT_EQ(318.441, dem.MaxElevation()); + + // Check Elevation() + unsigned int width = dem.Width(); + unsigned int height = dem.Height(); + EXPECT_FLOAT_EQ(215.82324, dem.Elevation(0, 0)); + EXPECT_FLOAT_EQ(216.04961, dem.Elevation(width - 1, 0)); + EXPECT_FLOAT_EQ(142.2274, dem.Elevation(0, height - 1)); + EXPECT_FLOAT_EQ(209.14784, dem.Elevation(width - 1, height - 1)); // Illegal coordinates - ASSERT_ANY_THROW(dem.GetElevation(0, height)); - ASSERT_ANY_THROW(dem.GetElevation(width, 0)); - ASSERT_ANY_THROW(dem.GetElevation(width, height)); + double inf = std::numeric_limits::infinity(); + EXPECT_DOUBLE_EQ(inf, dem.Elevation(0, height)); + EXPECT_DOUBLE_EQ(inf, dem.Elevation(width, 0)); + EXPECT_DOUBLE_EQ(inf, dem.Elevation(width, height)); - // Check GetGeoReferenceOrigin() + // Check GeoReferenceOrigin() ignition::math::Angle latitude, longitude; - dem.GetGeoReferenceOrigin(latitude, longitude); + EXPECT_TRUE(dem.GeoReferenceOrigin(latitude, longitude)); EXPECT_FLOAT_EQ(38.001667, latitude.Degree()); EXPECT_FLOAT_EQ(-122.22278, longitude.Degree()); } @@ -130,17 +129,17 @@ TEST_F(DemTest, FillHeightmap) std::vector elevations; subsampling = 2; - vertSize = (dem.GetWidth() * subsampling) - 1; - size.X(dem.GetWorldWidth()); - size.Y(dem.GetWorldHeight()); - size.Z(dem.GetMaxElevation() - dem.GetMinElevation()); + vertSize = (dem.Width() * subsampling) - 1; + size.X(dem.WorldWidth()); + size.Y(dem.WorldHeight()); + size.Z(dem.MaxElevation() - dem.MinElevation()); scale.X(size.X() / vertSize); scale.Y(size.Y() / vertSize); - if (ignition::math::equal(dem.GetMaxElevation(), 0.0f)) + if (ignition::math::equal(dem.MaxElevation(), 0.0f)) scale.Z(fabs(size.Z())); else - scale.Z(fabs(size.Z()) / dem.GetMaxElevation()); + scale.Z(fabs(size.Z()) / dem.MaxElevation()); flipY = false; dem.FillHeightMap(subsampling, vertSize, size, scale, flipY, elevations); @@ -149,11 +148,46 @@ TEST_F(DemTest, FillHeightmap) EXPECT_EQ(vertSize * vertSize, elevations.size()); // Check the elevation of some control points - EXPECT_FLOAT_EQ(119.58285, elevations.at(0)); - EXPECT_FLOAT_EQ(114.27753, elevations.at(elevations.size() - 1)); - EXPECT_FLOAT_EQ(148.07137, elevations.at(elevations.size() / 2)); + EXPECT_FLOAT_EQ(184.94113, elevations.at(0)); + EXPECT_FLOAT_EQ(179.63583, elevations.at(elevations.size() - 1)); + EXPECT_FLOAT_EQ(213.42966, elevations.at(elevations.size() / 2)); +} + +///////////////////////////////////////////////// +TEST_F(DemTest, UnfinishedDem) +{ + common::Dem dem; + auto path = common::testing::TestFile("data", "dem_unfinished.tif"); + EXPECT_EQ(dem.Load(path), 0); + + // Check that the min and max elevations are valid for an unfinished + // and unfilled dem. + EXPECT_EQ(33, static_cast(dem.Height())); + EXPECT_EQ(33, static_cast(dem.Width())); + EXPECT_FLOAT_EQ(111287.59, dem.WorldHeight()); + EXPECT_FLOAT_EQ(88878.297, dem.WorldWidth()); + // gdal reports min elevation as -32768 but this is treated as a nodata + // by our dem class and ignored when computing the min elevation + EXPECT_FLOAT_EQ(-10, dem.MinElevation()); + EXPECT_FLOAT_EQ(1909, dem.MaxElevation()); + + // test another dem file with multiple nodata values + common::Dem demNoData; + + path = common::testing::TestFile("data", "dem_nodata.dem"); + EXPECT_EQ(demNoData.Load(path), 0); + + // Check that the min and max elevations are valid for a dem with multiple + // nodata values + EXPECT_EQ(65, static_cast(demNoData.Height())); + EXPECT_EQ(65, static_cast(demNoData.Width())); + EXPECT_FLOAT_EQ(7499.8281, demNoData.WorldHeight()); + EXPECT_FLOAT_EQ(14150.225, demNoData.WorldWidth()); + // gdal reports min elevation as -32767 but this is treated as a nodata + // by our dem class and ignored when computing the min elevation + EXPECT_FLOAT_EQ(682, demNoData.MinElevation()); + EXPECT_FLOAT_EQ(2932, demNoData.MaxElevation()); } -#endif ///////////////////////////////////////////////// int main(int argc, char **argv) diff --git a/graphics/src/ImageHeightmap.cc b/geospatial/src/ImageHeightmap.cc similarity index 100% rename from graphics/src/ImageHeightmap.cc rename to geospatial/src/ImageHeightmap.cc diff --git a/graphics/src/ImageHeightmap_TEST.cc b/geospatial/src/ImageHeightmap_TEST.cc similarity index 97% rename from graphics/src/ImageHeightmap_TEST.cc rename to geospatial/src/ImageHeightmap_TEST.cc index b40880879..2b93f845a 100644 --- a/graphics/src/ImageHeightmap_TEST.cc +++ b/geospatial/src/ImageHeightmap_TEST.cc @@ -28,7 +28,7 @@ class ImageHeightmapTest : public common::testing::AutoLogFixture { }; class DemTest : public common::testing::AutoLogFixture { }; ///////////////////////////////////////////////// -TEST_F(DemTest, MisingFile) +TEST_F(DemTest, MissingFile) { common::ImageHeightmap img; EXPECT_EQ(-1, img.Load("/file/shouldn/never/exist.png")); @@ -51,6 +51,9 @@ TEST_F(ImageHeightmapTest, BasicAPI) std::cout << "PATH[" << path << "]\n"; EXPECT_EQ(0, img.Load(path)); + // Check filename + EXPECT_EQ(path, img.Filename()); + // Check the heights and widths EXPECT_EQ(129, static_cast(img.Height())); EXPECT_EQ(129, static_cast(img.Width())); diff --git a/test/data/dem_landscape.tif b/test/data/dem_landscape.tif new file mode 100644 index 0000000000000000000000000000000000000000..b8602372826264dc6772da19b88b719d10975533 GIT binary patch literal 100487 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 literal 0 HcmV?d00001 diff --git a/test/data/dem_nodata.dem b/test/data/dem_nodata.dem new file mode 100644 index 0000000000000000000000000000000000000000..60b04bf4c2edb74b203dbeda0e0d11842d60ae0e GIT binary patch literal 9441 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%0Dk)AY}J(1HHU0cS(8CAHu%w(*=9L}AbgYA}C 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 Date: Wed, 19 Jan 2022 09:47:39 -0800 Subject: [PATCH 2/9] Move geospatial headers to subfolder (#289) This simplifies the logic required for packaging. Update Migration guide Signed-off-by: Steve Peters --- Migration.md | 3 ++- .../include/ignition/common/{ => geospatial}/Dem.hh | 10 +++++----- .../ignition/common/{ => geospatial}/HeightmapData.hh | 8 ++++---- .../ignition/common/{ => geospatial}/ImageHeightmap.hh | 10 +++++----- geospatial/src/Dem.cc | 2 +- geospatial/src/Dem_TEST.cc | 2 +- geospatial/src/ImageHeightmap.cc | 2 +- geospatial/src/ImageHeightmap_TEST.cc | 2 +- 8 files changed, 20 insertions(+), 19 deletions(-) rename geospatial/include/ignition/common/{ => geospatial}/Dem.hh (95%) rename geospatial/include/ignition/common/{ => geospatial}/HeightmapData.hh (92%) rename geospatial/include/ignition/common/{ => geospatial}/ImageHeightmap.hh (94%) diff --git a/Migration.md b/Migration.md index 7b9385355..16477163e 100644 --- a/Migration.md +++ b/Migration.md @@ -17,7 +17,8 @@ release will remove the deprecated code. 1. `HeightmapData.hh` and `ImageHeightmap.hh` have been moved out of the `graphics` component and into the new `geospatial` component + To use the heightmap features, users must add the `geospatial` component - to the `find_package` call + to the `find_package` call and update the include paths to use + the geospatial subfolder (`#include `) ## Ignition Common 3.X to 4.X diff --git a/geospatial/include/ignition/common/Dem.hh b/geospatial/include/ignition/common/geospatial/Dem.hh similarity index 95% rename from geospatial/include/ignition/common/Dem.hh rename to geospatial/include/ignition/common/geospatial/Dem.hh index 2d251b7ec..927076b11 100644 --- a/geospatial/include/ignition/common/Dem.hh +++ b/geospatial/include/ignition/common/geospatial/Dem.hh @@ -14,8 +14,8 @@ * limitations under the License. * */ -#ifndef IGNITION_COMMON_DEM_HH_ -#define IGNITION_COMMON_DEM_HH_ +#ifndef IGNITION_COMMON_GEOSPATIAL_DEM_HH_ +#define IGNITION_COMMON_GEOSPATIAL_DEM_HH_ #include #include @@ -24,8 +24,8 @@ #include #include -#include -#include +#include +#include #include @@ -36,7 +36,7 @@ namespace ignition { /// \class DEM DEM.hh common/common.hh /// \brief Encapsulates a DEM (Digital Elevation Model) file. - class IGNITION_COMMON_GRAPHICS_VISIBLE Dem : public HeightmapData + class IGNITION_COMMON_GEOSPATIAL_VISIBLE Dem : public HeightmapData { /// \brief Constructor. public: Dem(); diff --git a/geospatial/include/ignition/common/HeightmapData.hh b/geospatial/include/ignition/common/geospatial/HeightmapData.hh similarity index 92% rename from geospatial/include/ignition/common/HeightmapData.hh rename to geospatial/include/ignition/common/geospatial/HeightmapData.hh index a67b1135a..16acb544e 100644 --- a/geospatial/include/ignition/common/HeightmapData.hh +++ b/geospatial/include/ignition/common/geospatial/HeightmapData.hh @@ -14,20 +14,20 @@ * limitations under the License. * */ -#ifndef IGNITION_COMMON_HEIGHTMAPDATA_HH_ -#define IGNITION_COMMON_HEIGHTMAPDATA_HH_ +#ifndef IGNITION_COMMON_GEOSPATIAL_HEIGHTMAPDATA_HH_ +#define IGNITION_COMMON_GEOSPATIAL_HEIGHTMAPDATA_HH_ #include #include #include -#include +#include namespace ignition { namespace common { /// \brief Encapsulates a generic heightmap data file. - class IGNITION_COMMON_GRAPHICS_VISIBLE HeightmapData + class IGNITION_COMMON_GEOSPATIAL_VISIBLE HeightmapData { /// \brief Destructor. public: virtual ~HeightmapData() = default; diff --git a/geospatial/include/ignition/common/ImageHeightmap.hh b/geospatial/include/ignition/common/geospatial/ImageHeightmap.hh similarity index 94% rename from geospatial/include/ignition/common/ImageHeightmap.hh rename to geospatial/include/ignition/common/geospatial/ImageHeightmap.hh index 5ee7431e8..98b3095ce 100644 --- a/geospatial/include/ignition/common/ImageHeightmap.hh +++ b/geospatial/include/ignition/common/geospatial/ImageHeightmap.hh @@ -14,16 +14,16 @@ * limitations under the License. * */ -#ifndef IGNITION_COMMON_IMAGEHEIGHTMAPDATA_HH_ -#define IGNITION_COMMON_IMAGEHEIGHTMAPDATA_HH_ +#ifndef IGNITION_COMMON_GEOSPATIAL_IMAGEHEIGHTMAPDATA_HH_ +#define IGNITION_COMMON_GEOSPATIAL_IMAGEHEIGHTMAPDATA_HH_ #include #include #include #include -#include -#include +#include +#include #include namespace ignition @@ -31,7 +31,7 @@ namespace ignition namespace common { /// \brief Encapsulates an image that will be interpreted as a heightmap. - class IGNITION_COMMON_GRAPHICS_VISIBLE ImageHeightmap + class IGNITION_COMMON_GEOSPATIAL_VISIBLE ImageHeightmap : public ignition::common::HeightmapData { /// \brief Constructor diff --git a/geospatial/src/Dem.cc b/geospatial/src/Dem.cc index eb9318555..d25b1c909 100644 --- a/geospatial/src/Dem.cc +++ b/geospatial/src/Dem.cc @@ -21,7 +21,7 @@ #include #include "ignition/common/Console.hh" -#include "ignition/common/Dem.hh" +#include "ignition/common/geospatial/Dem.hh" #include "ignition/math/SphericalCoordinates.hh" using namespace ignition; diff --git a/geospatial/src/Dem_TEST.cc b/geospatial/src/Dem_TEST.cc index 5a8fcde20..248ce255e 100644 --- a/geospatial/src/Dem_TEST.cc +++ b/geospatial/src/Dem_TEST.cc @@ -20,7 +20,7 @@ #include #include -#include "ignition/common/Dem.hh" +#include "ignition/common/geospatial/Dem.hh" #include "test_config.h" using namespace ignition; diff --git a/geospatial/src/ImageHeightmap.cc b/geospatial/src/ImageHeightmap.cc index 6c8630835..4dcf9bc32 100644 --- a/geospatial/src/ImageHeightmap.cc +++ b/geospatial/src/ImageHeightmap.cc @@ -15,7 +15,7 @@ * */ #include "ignition/common/Console.hh" -#include "ignition/common/ImageHeightmap.hh" +#include "ignition/common/geospatial/ImageHeightmap.hh" using namespace ignition; using namespace common; diff --git a/geospatial/src/ImageHeightmap_TEST.cc b/geospatial/src/ImageHeightmap_TEST.cc index 2b93f845a..3fc52788a 100644 --- a/geospatial/src/ImageHeightmap_TEST.cc +++ b/geospatial/src/ImageHeightmap_TEST.cc @@ -16,7 +16,7 @@ */ #include -#include "ignition/common/ImageHeightmap.hh" +#include "ignition/common/geospatial/ImageHeightmap.hh" #include "test_config.h" #define ELEVATION_TOL 1e-8 From 8c63dac5e9ecc7495e33ca65657b6ed12d7ece18 Mon Sep 17 00:00:00 2001 From: Steve Peters Date: Tue, 8 Feb 2022 13:56:19 -0800 Subject: [PATCH 3/9] Make HeightmapData::FillHeightmap a const method There's no reason for this to be non-const, and it causes some issues in ign-physics, so make it non-const while it is possible to change the API. Signed-off-by: Steve Peters --- Migration.md | 2 ++ geospatial/include/ignition/common/geospatial/Dem.hh | 2 +- .../include/ignition/common/geospatial/HeightmapData.hh | 2 +- .../include/ignition/common/geospatial/ImageHeightmap.hh | 4 ++-- geospatial/src/Dem.cc | 2 +- geospatial/src/ImageHeightmap.cc | 2 +- 6 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Migration.md b/Migration.md index 16477163e..101955193 100644 --- a/Migration.md +++ b/Migration.md @@ -20,6 +20,8 @@ release will remove the deprecated code. to the `find_package` call and update the include paths to use the geospatial subfolder (`#include `) +1. `HeightmapData::FillHeightmap` method is now `const`. + ## Ignition Common 3.X to 4.X ### Modifications diff --git a/geospatial/include/ignition/common/geospatial/Dem.hh b/geospatial/include/ignition/common/geospatial/Dem.hh index 927076b11..7169db216 100644 --- a/geospatial/include/ignition/common/geospatial/Dem.hh +++ b/geospatial/include/ignition/common/geospatial/Dem.hh @@ -113,7 +113,7 @@ namespace ignition const ignition::math::Vector3d &_size, const ignition::math::Vector3d &_scale, const bool _flipY, - std::vector &_heights); + std::vector &_heights) const; /// \brief Get the georeferenced coordinates (lat, long) of a terrain's /// pixel in WGS84. diff --git a/geospatial/include/ignition/common/geospatial/HeightmapData.hh b/geospatial/include/ignition/common/geospatial/HeightmapData.hh index 16acb544e..e161b5b62 100644 --- a/geospatial/include/ignition/common/geospatial/HeightmapData.hh +++ b/geospatial/include/ignition/common/geospatial/HeightmapData.hh @@ -45,7 +45,7 @@ namespace ignition public: virtual void FillHeightMap(int _subSampling, unsigned int _vertSize, const ignition::math::Vector3d &_size, const ignition::math::Vector3d &_scale, bool _flipY, - std::vector &_heights) = 0; + std::vector &_heights) const = 0; /// \brief Get the terrain's height. /// \return The terrain's height. diff --git a/geospatial/include/ignition/common/geospatial/ImageHeightmap.hh b/geospatial/include/ignition/common/geospatial/ImageHeightmap.hh index 98b3095ce..35cabb870 100644 --- a/geospatial/include/ignition/common/geospatial/ImageHeightmap.hh +++ b/geospatial/include/ignition/common/geospatial/ImageHeightmap.hh @@ -47,7 +47,7 @@ namespace ignition public: void FillHeightMap(int _subSampling, unsigned int _vertSize, const ignition::math::Vector3d &_size, const ignition::math::Vector3d &_scale, bool _flipY, - std::vector &_heights); + std::vector &_heights) const; // Documentation inherited. public: std::string Filename() const; @@ -79,7 +79,7 @@ namespace ignition unsigned int _pitch, int _subSampling, unsigned int _vertSize, const ignition::math::Vector3d &_size, const ignition::math::Vector3d &_scale, - bool _flipY, std::vector &_heights) + bool _flipY, std::vector &_heights) const { // bytes per pixel const unsigned int bpp = _pitch / _imgWidth; diff --git a/geospatial/src/Dem.cc b/geospatial/src/Dem.cc index d25b1c909..f3306f12b 100644 --- a/geospatial/src/Dem.cc +++ b/geospatial/src/Dem.cc @@ -307,7 +307,7 @@ double Dem::WorldHeight() const void Dem::FillHeightMap(int _subSampling, unsigned int _vertSize, const ignition::math::Vector3d &_size, const ignition::math::Vector3d &_scale, - bool _flipY, std::vector &_heights) + bool _flipY, std::vector &_heights) const { if (_subSampling <= 0) { diff --git a/geospatial/src/ImageHeightmap.cc b/geospatial/src/ImageHeightmap.cc index 4dcf9bc32..3dc30cf30 100644 --- a/geospatial/src/ImageHeightmap.cc +++ b/geospatial/src/ImageHeightmap.cc @@ -41,7 +41,7 @@ int ImageHeightmap::Load(const std::string &_filename) void ImageHeightmap::FillHeightMap(int _subSampling, unsigned int _vertSize, const ignition::math::Vector3d &_size, const ignition::math::Vector3d &_scale, bool _flipY, - std::vector &_heights) + std::vector &_heights) const { // Resize the vector to match the size of the vertices. _heights.resize(_vertSize * _vertSize); From efbb152915bed698b7f8e8ad1bb884cb75863690 Mon Sep 17 00:00:00 2001 From: Steve Peters Date: Tue, 8 Feb 2022 18:28:02 -0800 Subject: [PATCH 4/9] Make Image::Data and RGBData into const methods Signed-off-by: Steve Peters --- graphics/include/ignition/common/Image.hh | 4 ++-- graphics/src/Image.cc | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/graphics/include/ignition/common/Image.hh b/graphics/include/ignition/common/Image.hh index d17700311..fd67dbd71 100644 --- a/graphics/include/ignition/common/Image.hh +++ b/graphics/include/ignition/common/Image.hh @@ -125,13 +125,13 @@ namespace ignition /// \brief Get the image as a data array /// \param[out] _data Pointer to a NULL array of char. /// \param[out] _count The resulting data array size - public: void Data(unsigned char **_data, unsigned int &_count); + public: void Data(unsigned char **_data, unsigned int &_count) const; /// \brief Get only the RGB data from the image. This will drop the /// alpha channel if one is present. /// \param[out] _data Pointer to a NULL array of char. /// \param[out] _count The resulting data array size - public: void RGBData(unsigned char **_data, unsigned int &_count); + public: void RGBData(unsigned char **_data, unsigned int &_count) const; /// \brief Get the width /// \return The image width diff --git a/graphics/src/Image.cc b/graphics/src/Image.cc index c200fff74..9a06bdd05 100644 --- a/graphics/src/Image.cc +++ b/graphics/src/Image.cc @@ -61,7 +61,7 @@ namespace ignition /// \param[in] _height Height of the image /// \return bitmap data with red and blue pixels swapped public: FIBITMAP* SwapRedBlue(const unsigned int &_width, - const unsigned int &_height); + const unsigned int &_height) const; }; } } @@ -249,7 +249,7 @@ int Image::Pitch() const } ////////////////////////////////////////////////// -void Image::RGBData(unsigned char **_data, unsigned int &_count) +void Image::RGBData(unsigned char **_data, unsigned int &_count) const { FIBITMAP *tmp = this->dataPtr->bitmap; FIBITMAP *tmp2 = nullptr; @@ -266,7 +266,7 @@ void Image::RGBData(unsigned char **_data, unsigned int &_count) } ////////////////////////////////////////////////// -void Image::Data(unsigned char **_data, unsigned int &_count) +void Image::Data(unsigned char **_data, unsigned int &_count) const { if (this->dataPtr->ShouldSwapRedBlue()) { @@ -582,7 +582,7 @@ bool Image::Implementation::CanSwapRedBlue() const ////////////////////////////////////////////////// FIBITMAP* Image::Implementation::SwapRedBlue(const unsigned int &_width, - const unsigned int &_height) + const unsigned int &_height) const { FIBITMAP *copy = FreeImage_Copy(this->bitmap, 0, 0, _width, _height); From f79ba6af1353df17c62092f5a47fa199addb52be Mon Sep 17 00:00:00 2001 From: Steve Peters Date: Tue, 8 Feb 2022 18:29:23 -0800 Subject: [PATCH 5/9] Update Migration guide for Image Signed-off-by: Steve Peters --- Migration.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Migration.md b/Migration.md index 101955193..899fcf55f 100644 --- a/Migration.md +++ b/Migration.md @@ -22,6 +22,8 @@ release will remove the deprecated code. 1. `HeightmapData::FillHeightmap` method is now `const`. +1. `Image::Data` and `Image::RGBData` methods are now `const`. + ## Ignition Common 3.X to 4.X ### Modifications From 9c81fae9950fd9986be86db515fd0d58f2a378b4 Mon Sep 17 00:00:00 2001 From: Steve Peters Date: Wed, 9 Feb 2022 09:43:14 -0800 Subject: [PATCH 6/9] Image::AvgColor should be const Signed-off-by: Steve Peters --- Migration.md | 2 +- graphics/include/ignition/common/Image.hh | 2 +- graphics/src/Image.cc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Migration.md b/Migration.md index 899fcf55f..c887f0af3 100644 --- a/Migration.md +++ b/Migration.md @@ -22,7 +22,7 @@ release will remove the deprecated code. 1. `HeightmapData::FillHeightmap` method is now `const`. -1. `Image::Data` and `Image::RGBData` methods are now `const`. +1. `Image::AvgColor`, `Image::Data` and `Image::RGBData` methods are now `const`. ## Ignition Common 3.X to 4.X diff --git a/graphics/include/ignition/common/Image.hh b/graphics/include/ignition/common/Image.hh index fd67dbd71..91ac1ad60 100644 --- a/graphics/include/ignition/common/Image.hh +++ b/graphics/include/ignition/common/Image.hh @@ -166,7 +166,7 @@ namespace ignition /// \brief Get the average color /// \return The average color - public: math::Color AvgColor(); + public: math::Color AvgColor() const; /// \brief Get the max color /// \return The max color diff --git a/graphics/src/Image.cc b/graphics/src/Image.cc index 9a06bdd05..87547f489 100644 --- a/graphics/src/Image.cc +++ b/graphics/src/Image.cc @@ -398,7 +398,7 @@ math::Color Image::Pixel(unsigned int _x, unsigned int _y) const } ////////////////////////////////////////////////// -math::Color Image::AvgColor() +math::Color Image::AvgColor() const { unsigned int x, y; double rsum, gsum, bsum; From f5ce9fde9d48a1d97cf8fe006f24f53b4fe0edee Mon Sep 17 00:00:00 2001 From: Jenn Nguyen Date: Thu, 10 Feb 2022 18:08:21 -0800 Subject: [PATCH 7/9] relax tol for mac & win Signed-off-by: Jenn Nguyen --- geospatial/src/Dem_TEST.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/geospatial/src/Dem_TEST.cc b/geospatial/src/Dem_TEST.cc index 248ce255e..8ff644c8f 100644 --- a/geospatial/src/Dem_TEST.cc +++ b/geospatial/src/Dem_TEST.cc @@ -181,8 +181,11 @@ TEST_F(DemTest, UnfinishedDem) // nodata values EXPECT_EQ(65, static_cast(demNoData.Height())); EXPECT_EQ(65, static_cast(demNoData.Width())); - EXPECT_FLOAT_EQ(7499.8281, demNoData.WorldHeight()); - EXPECT_FLOAT_EQ(14150.225, demNoData.WorldWidth()); + + // relaxed tolerances for macOS & windows + EXPECT_NEAR(7499.8281, demNoData.WorldHeight(), 0.1); + EXPECT_NEAR(14150.225, demNoData.WorldWidth(), 0.1); + // gdal reports min elevation as -32767 but this is treated as a nodata // by our dem class and ignored when computing the min elevation EXPECT_FLOAT_EQ(682, demNoData.MinElevation()); From fa605bd0dd82828615dfdb8ef8dc9031d03a2a4a Mon Sep 17 00:00:00 2001 From: Jenn Nguyen Date: Thu, 10 Feb 2022 20:04:43 -0800 Subject: [PATCH 8/9] work around for non-earth dems Signed-off-by: Jenn Nguyen --- geospatial/src/Dem.cc | 55 +++++++++++++++++++++++++++---------- geospatial/src/Dem_TEST.cc | 22 +++++++++++++++ test/data/dem_moon.tif | Bin 0 -> 4987 bytes 3 files changed, 63 insertions(+), 14 deletions(-) create mode 100644 test/data/dem_moon.tif diff --git a/geospatial/src/Dem.cc b/geospatial/src/Dem.cc index f3306f12b..d54bdc5ab 100644 --- a/geospatial/src/Dem.cc +++ b/geospatial/src/Dem.cc @@ -55,6 +55,11 @@ class ignition::common::Dem::Implementation /// \brief Full filename used to load the dem. public: std::string filename; + + /// \brief Whether the DEM will be handled as from non-Earth. + /// If true, worldWidth & worldHeight = -1 + /// and GeoReference[Origin] can not be used (will return false) + public: bool isNonEarthDem = false; }; ////////////////////////////////////////////////// @@ -131,23 +136,28 @@ int Dem::Load(const std::string &_filename) lowLeftY = ySize; // Calculate the georeferenced coordinates of the terrain corners - if (!this->GeoReference(upLeftX, upLeftY, upLeftLat, upLeftLong) - || !this->GeoReference(upRightX, upRightY, upRightLat, upRightLong) - || !this->GeoReference(lowLeftX, lowLeftY, lowLeftLat, lowLeftLong)) + if (this->GeoReference(upLeftX, upLeftY, upLeftLat, upLeftLong) + && this->GeoReference(upRightX, upRightY, upRightLat, upRightLong) + && this->GeoReference(lowLeftX, lowLeftY, lowLeftLat, lowLeftLong)) { - ignerr << "Failed to automatically compute DEM size. " - << "Please use the element to manually set DEM size." - << std::endl; - return -1; + // If successful, set the world width and height + this->dataPtr->worldWidth = + math::SphericalCoordinates::Distance(upLeftLat, upLeftLong, + upRightLat, upRightLong); + this->dataPtr->worldHeight = + math::SphericalCoordinates::Distance(upLeftLat, upLeftLong, + lowLeftLat, lowLeftLong); } + // Assume non-Earth DEM (e.g., moon) + else + { + ignwarn << "Failed to automatically compute DEM size. " + << "Assuming non-Earth DEM. " + << std::endl; - // Set the world width and height - this->dataPtr->worldWidth = - math::SphericalCoordinates::Distance(upLeftLat, upLeftLong, - upRightLat, upRightLong); - this->dataPtr->worldHeight = - math::SphericalCoordinates::Distance(upLeftLat, upLeftLong, - lowLeftLat, lowLeftLong); + this->dataPtr->worldWidth = this->dataPtr->worldHeight = -1; + this->dataPtr->isNonEarthDem = true; + } // Set the terrain's side (the terrain will be squared after the padding) if (ignition::math::isPowerOfTwo(ySize - 1)) @@ -231,6 +241,13 @@ float Dem::MaxElevation() const bool Dem::GeoReference(double _x, double _y, ignition::math::Angle &_latitude, ignition::math::Angle &_longitude) const { + if (this->dataPtr->isNonEarthDem) + { + ignerr << "Can not retrieve WGS84 coordinates from non-Earth DEM." + << std::endl; + return false; + } + double geoTransf[6]; if (this->dataPtr->dataSet->GetGeoTransform(geoTransf) == CE_None) { @@ -294,12 +311,22 @@ unsigned int Dem::Width() const ////////////////////////////////////////////////// double Dem::WorldWidth() const { + if (this->dataPtr->isNonEarthDem) + { + ignwarn << "Unable to determine world width of non-Earth DEM." + << std::endl; + } return this->dataPtr->worldWidth; } ////////////////////////////////////////////////// double Dem::WorldHeight() const { + if (this->dataPtr->isNonEarthDem) + { + ignwarn << "Unable to determine world height of non-Earth DEM." + << std::endl; + } return this->dataPtr->worldHeight; } diff --git a/geospatial/src/Dem_TEST.cc b/geospatial/src/Dem_TEST.cc index 8ff644c8f..988e0f914 100644 --- a/geospatial/src/Dem_TEST.cc +++ b/geospatial/src/Dem_TEST.cc @@ -192,6 +192,28 @@ TEST_F(DemTest, UnfinishedDem) EXPECT_FLOAT_EQ(2932, demNoData.MaxElevation()); } +///////////////////////////////////////////////// +TEST_F(DemTest, NonEarthDem) +{ + // moon + common::Dem dem; + auto path = common::testing::TestFile("data", "dem_moon.tif"); + EXPECT_EQ(dem.Load(path), 0); + + EXPECT_EQ(33, static_cast(dem.Height())); + EXPECT_EQ(33, static_cast(dem.Width())); + EXPECT_FLOAT_EQ(-212.29616, dem.MinElevation()); + EXPECT_FLOAT_EQ(-205.44009, dem.MaxElevation()); + + // unable to determne world width/height of non earth DEM + EXPECT_FLOAT_EQ(-1, dem.WorldHeight()); + EXPECT_FLOAT_EQ(-1, dem.WorldWidth()); + + // unable to get coordinates in WGS84 + ignition::math::Angle latitude, longitude; + EXPECT_FALSE(dem.GeoReferenceOrigin(latitude, longitude)); +} + ///////////////////////////////////////////////// int main(int argc, char **argv) { diff --git a/test/data/dem_moon.tif b/test/data/dem_moon.tif new file mode 100644 index 0000000000000000000000000000000000000000..955f14da88227b70ae82a61bcf6ddbaee6607989 GIT binary patch literal 4987 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 F{TC%IGC2SM literal 0 HcmV?d00001 From 33b1748cea3e3592b7a56baf832bce1f78b759ae Mon Sep 17 00:00:00 2001 From: Jenn Nguyen Date: Fri, 11 Feb 2022 17:14:28 -0800 Subject: [PATCH 9/9] windows fix Signed-off-by: Jenn Nguyen --- geospatial/src/Dem.cc | 18 +++++++++------- geospatial/src/Dem_TEST.cc | 42 +++++++++++++++++++------------------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/geospatial/src/Dem.cc b/geospatial/src/Dem.cc index d54bdc5ab..f3e3d1e20 100644 --- a/geospatial/src/Dem.cc +++ b/geospatial/src/Dem.cc @@ -222,7 +222,9 @@ double Dem::Elevation(double _x, double _y) return std::numeric_limits::infinity(); } - return this->dataPtr->demData.at(_y * this->Width() + _x); + auto idx = static_cast(_y) * this->Width() + + static_cast(_x); + return this->dataPtr->demData.at(idx); } ////////////////////////////////////////////////// @@ -349,8 +351,8 @@ void Dem::FillHeightMap(int _subSampling, unsigned int _vertSize, for (unsigned int y = 0; y < _vertSize; ++y) { double yf = y / static_cast(_subSampling); - unsigned int y1 = floor(yf); - unsigned int y2 = ceil(yf); + unsigned int y1 = static_cast(floor(yf)); + unsigned int y2 = static_cast(ceil(yf)); if (y2 >= this->dataPtr->side) y2 = this->dataPtr->side - 1; double dy = yf - y1; @@ -358,8 +360,8 @@ void Dem::FillHeightMap(int _subSampling, unsigned int _vertSize, for (unsigned int x = 0; x < _vertSize; ++x) { double xf = x / static_cast(_subSampling); - unsigned int x1 = floor(xf); - unsigned int x2 = ceil(xf); + unsigned int x1 = static_cast(floor(xf)); + unsigned int x2 = static_cast(ceil(xf)); if (x2 >= this->dataPtr->side) x2 = this->dataPtr->side - 1; double dx = xf - x1; @@ -417,14 +419,16 @@ int Dem::LoadData() ratio = static_cast(nXSize) / static_cast(nYSize); destWidth = this->dataPtr->side; // The decimal part is discarted for interpret the result as pixels - destHeight = static_cast(destWidth) / static_cast(ratio); + float h = static_cast(destWidth) / static_cast(ratio); + destHeight = static_cast(h); } else { ratio = static_cast(nYSize) / static_cast(nXSize); destHeight = this->dataPtr->side; // The decimal part is discarted for interpret the result as pixels - destWidth = static_cast(destHeight) / static_cast(ratio); + float w = static_cast(destHeight) / static_cast(ratio); + destWidth = static_cast(w); } // Read the whole raster data and convert it to a GDT_Float32 array. diff --git a/geospatial/src/Dem_TEST.cc b/geospatial/src/Dem_TEST.cc index 988e0f914..a62fa1e90 100644 --- a/geospatial/src/Dem_TEST.cc +++ b/geospatial/src/Dem_TEST.cc @@ -87,18 +87,18 @@ TEST_F(DemTest, BasicAPI) // Check the heights and widths EXPECT_EQ(129, static_cast(dem.Height())); EXPECT_EQ(129, static_cast(dem.Width())); - EXPECT_FLOAT_EQ(3984.4849, dem.WorldHeight()); - EXPECT_FLOAT_EQ(3139.7456, dem.WorldWidth()); - EXPECT_FLOAT_EQ(65.3583, dem.MinElevation()); - EXPECT_FLOAT_EQ(318.441, dem.MaxElevation()); + EXPECT_FLOAT_EQ(3984.4849f, dem.WorldHeight()); + EXPECT_FLOAT_EQ(3139.7456f, dem.WorldWidth()); + EXPECT_FLOAT_EQ(65.3583f, dem.MinElevation()); + EXPECT_FLOAT_EQ(318.441f, dem.MaxElevation()); // Check Elevation() unsigned int width = dem.Width(); unsigned int height = dem.Height(); - EXPECT_FLOAT_EQ(215.82324, dem.Elevation(0, 0)); - EXPECT_FLOAT_EQ(216.04961, dem.Elevation(width - 1, 0)); - EXPECT_FLOAT_EQ(142.2274, dem.Elevation(0, height - 1)); - EXPECT_FLOAT_EQ(209.14784, dem.Elevation(width - 1, height - 1)); + EXPECT_FLOAT_EQ(215.82324f, dem.Elevation(0, 0)); + EXPECT_FLOAT_EQ(216.04961f, dem.Elevation(width - 1, 0)); + EXPECT_FLOAT_EQ(142.2274f, dem.Elevation(0, height - 1)); + EXPECT_FLOAT_EQ(209.14784f, dem.Elevation(width - 1, height - 1)); // Illegal coordinates double inf = std::numeric_limits::infinity(); @@ -109,8 +109,8 @@ TEST_F(DemTest, BasicAPI) // Check GeoReferenceOrigin() ignition::math::Angle latitude, longitude; EXPECT_TRUE(dem.GeoReferenceOrigin(latitude, longitude)); - EXPECT_FLOAT_EQ(38.001667, latitude.Degree()); - EXPECT_FLOAT_EQ(-122.22278, longitude.Degree()); + EXPECT_FLOAT_EQ(38.001667f, latitude.Degree()); + EXPECT_FLOAT_EQ(-122.22278f, longitude.Degree()); } ///////////////////////////////////////////////// @@ -148,9 +148,9 @@ TEST_F(DemTest, FillHeightmap) EXPECT_EQ(vertSize * vertSize, elevations.size()); // Check the elevation of some control points - EXPECT_FLOAT_EQ(184.94113, elevations.at(0)); - EXPECT_FLOAT_EQ(179.63583, elevations.at(elevations.size() - 1)); - EXPECT_FLOAT_EQ(213.42966, elevations.at(elevations.size() / 2)); + EXPECT_FLOAT_EQ(184.94113f, elevations.at(0)); + EXPECT_FLOAT_EQ(179.63583f, elevations.at(elevations.size() - 1)); + EXPECT_FLOAT_EQ(213.42966f, elevations.at(elevations.size() / 2)); } ///////////////////////////////////////////////// @@ -164,12 +164,12 @@ TEST_F(DemTest, UnfinishedDem) // and unfilled dem. EXPECT_EQ(33, static_cast(dem.Height())); EXPECT_EQ(33, static_cast(dem.Width())); - EXPECT_FLOAT_EQ(111287.59, dem.WorldHeight()); - EXPECT_FLOAT_EQ(88878.297, dem.WorldWidth()); + EXPECT_FLOAT_EQ(111287.59f, dem.WorldHeight()); + EXPECT_FLOAT_EQ(88878.297f, dem.WorldWidth()); // gdal reports min elevation as -32768 but this is treated as a nodata // by our dem class and ignored when computing the min elevation - EXPECT_FLOAT_EQ(-10, dem.MinElevation()); - EXPECT_FLOAT_EQ(1909, dem.MaxElevation()); + EXPECT_FLOAT_EQ(-10.0f, dem.MinElevation()); + EXPECT_FLOAT_EQ(1909.0f, dem.MaxElevation()); // test another dem file with multiple nodata values common::Dem demNoData; @@ -188,8 +188,8 @@ TEST_F(DemTest, UnfinishedDem) // gdal reports min elevation as -32767 but this is treated as a nodata // by our dem class and ignored when computing the min elevation - EXPECT_FLOAT_EQ(682, demNoData.MinElevation()); - EXPECT_FLOAT_EQ(2932, demNoData.MaxElevation()); + EXPECT_FLOAT_EQ(682.0f, demNoData.MinElevation()); + EXPECT_FLOAT_EQ(2932.0f, demNoData.MaxElevation()); } ///////////////////////////////////////////////// @@ -202,8 +202,8 @@ TEST_F(DemTest, NonEarthDem) EXPECT_EQ(33, static_cast(dem.Height())); EXPECT_EQ(33, static_cast(dem.Width())); - EXPECT_FLOAT_EQ(-212.29616, dem.MinElevation()); - EXPECT_FLOAT_EQ(-205.44009, dem.MaxElevation()); + EXPECT_FLOAT_EQ(-212.29616f, dem.MinElevation()); + EXPECT_FLOAT_EQ(-205.44009f, dem.MaxElevation()); // unable to determne world width/height of non earth DEM EXPECT_FLOAT_EQ(-1, dem.WorldHeight());