cesium-native/CesiumRasterOverlays/test/TestGeoJsonDocumentRasterOv...

117 lines
3.9 KiB
C++
Raw Permalink Normal View History

2025-06-21 05:13:53 +08:00
#include <CesiumAsync/AsyncSystem.h>
#include <CesiumGeospatial/BoundingRegionBuilder.h>
#include <CesiumGeospatial/GeographicProjection.h>
#include <CesiumGeospatial/GlobeRectangle.h>
#include <CesiumNativeTests/SimpleAssetAccessor.h>
#include <CesiumNativeTests/SimpleAssetRequest.h>
#include <CesiumNativeTests/SimpleTaskProcessor.h>
#include <CesiumNativeTests/readFile.h>
#include <CesiumRasterOverlays/GeoJsonDocumentRasterOverlay.h>
#include <CesiumRasterOverlays/RasterOverlayTile.h>
#include <CesiumUtility/Math.h>
#include <CesiumUtility/Result.h>
#include <doctest/doctest.h>
#include <spdlog/spdlog.h>
#include <filesystem>
#include <memory>
#include <random>
using namespace CesiumAsync;
using namespace CesiumGeospatial;
using namespace CesiumUtility;
using namespace CesiumRasterOverlays;
using namespace CesiumVectorData;
const size_t BENCHMARK_ITERATIONS = 100000;
TEST_CASE(
"GeoJsonDocumentRasterOverlay vienna-streets benchmark" * doctest::skip()) {
AsyncSystem asyncSystem(
std::make_shared<CesiumNativeTests::SimpleTaskProcessor>());
const std::filesystem::path testDataPath =
std::filesystem::path(CesiumRasterOverlays_TEST_DATA_DIR) /
"vienna-streets.geojson";
Result<GeoJsonDocument> docResult =
GeoJsonDocument::fromGeoJson(readFile(testDataPath));
CHECK(!docResult.errors.hasErrors());
CHECK(docResult.errors.warnings.empty());
REQUIRE(docResult.value);
BoundingRegionBuilder builder;
for (const std::vector<glm::dvec3>& line :
docResult.value->rootObject.lines()) {
for (const glm::dvec3& point : line) {
builder.expandToIncludePosition(
Cartographic::fromDegrees(point.x, point.y, point.z));
}
}
GeoJsonDocumentRasterOverlayOptions options{
VectorStyle{
LineStyle{
ColorStyle{Color{255, 0, 0, 255}, ColorMode::Normal},
2.0,
LineWidthMode::Pixels},
PolygonStyle{std::nullopt, std::nullopt}},
Ellipsoid::WGS84,
0};
IntrusivePointer<GeoJsonDocumentRasterOverlay> pOverlay;
pOverlay.emplace(
asyncSystem,
"overlay0",
std::make_shared<GeoJsonDocument>(std::move(*docResult.value)),
options);
std::shared_ptr<CesiumAsync::IAssetAccessor> pAssetAccessor =
std::make_shared<CesiumNativeTests::SimpleAssetAccessor>(
std::map<
std::string,
std::shared_ptr<CesiumNativeTests::SimpleAssetRequest>>());
nonstd::expected_lite::expected<
IntrusivePointer<RasterOverlayTileProvider>,
CesiumRasterOverlays::RasterOverlayLoadFailureDetails>
result = pOverlay
->createTileProvider(
asyncSystem,
pAssetAccessor,
std::make_shared<CreditSystem>(),
nullptr,
spdlog::default_logger(),
pOverlay)
.waitInMainThread();
REQUIRE(result);
const IntrusivePointer<RasterOverlayTileProvider>& pProvider = *result;
const CesiumGeometry::Rectangle fullRectangle =
builder.toGlobeRectangle().toSimpleRectangle();
RasterOverlayTile tile{*pProvider, glm::dvec2(256, 256), fullRectangle};
// Generate random tiles but use a constant seed so the results are the same
// every run.
std::default_random_engine rand(0xabcdabcd);
std::uniform_real_distribution<double> dist(0, 1);
for (size_t i = 0; i < BENCHMARK_ITERATIONS; i++) {
const double x1 = dist(rand);
const double x2 = dist(rand);
const double y1 = dist(rand);
const double y2 = dist(rand);
const CesiumGeometry::Rectangle thisRect{
std::min(x1, x2),
std::max(x1, x2),
std::min(y1, y2),
std::max(y1, y2)};
IntrusivePointer<RasterOverlayTile> pTile;
pTile.emplace(*pProvider, glm::dvec2(256, 256), thisRect);
pProvider->loadTile(*pTile).waitInMainThread();
}
}