// Copyright 2020-2024 CesiumGS, Inc. and Contributors #include "CesiumGeoJsonDocumentRasterOverlay.h" #include "CesiumCustomVersion.h" #include "CesiumGeometry/QuadtreeTilingScheme.h" #include "CesiumGeospatial/GlobeRectangle.h" #include "CesiumGeospatial/Projection.h" #include "CesiumRasterOverlays/GeoJsonDocumentRasterOverlay.h" #include "CesiumVectorData/VectorStyle.h" #include "CesiumRuntime.h" namespace { CesiumAsync::Future> wrapLoaderFuture( UCesiumGeoJsonDocumentRasterOverlay* pThis, CesiumAsync::Future< CesiumUtility::Result>&& future) { return std::move(future).thenInMainThread( [pThis](CesiumUtility::Result&& documentResult) -> std::shared_ptr { if (documentResult.errors) { documentResult.errors.logError( spdlog::default_logger(), "Errors loading GeoJSON document: "); return nullptr; } std::shared_ptr pGeoJsonDocument = std::make_shared( std::move(*documentResult.value)); if (pThis->OnDocumentLoaded.IsBound()) { pThis->OnDocumentLoaded.Execute(FCesiumGeoJsonDocument( std::shared_ptr( pGeoJsonDocument))); } return pGeoJsonDocument; }); } } // namespace std::unique_ptr UCesiumGeoJsonDocumentRasterOverlay::CreateOverlay( const CesiumRasterOverlays::RasterOverlayOptions& options) { if (this->Source == ECesiumGeoJsonDocumentRasterOverlaySource::FromDocument && !this->GeoJsonDocument.IsValid()) { // Don't create an overlay with an invalid document. return nullptr; } CesiumRasterOverlays::GeoJsonDocumentRasterOverlayOptions vectorOptions{ this->DefaultStyle.toNative(), options.ellipsoid, this->MipLevels}; if (this->Source == ECesiumGeoJsonDocumentRasterOverlaySource::FromCesiumIon) { if (!IsValid(this->CesiumIonServer)) { this->CesiumIonServer = UCesiumIonServer::GetServerForNewObjects(); } return std::make_unique( TCHAR_TO_UTF8(*this->MaterialLayerKey), wrapLoaderFuture( this, CesiumVectorData::GeoJsonDocument::fromCesiumIonAsset( getAsyncSystem(), getAssetAccessor(), this->IonAssetID, TCHAR_TO_UTF8(*this->CesiumIonServer->DefaultIonAccessToken), std::string(TCHAR_TO_UTF8(*this->CesiumIonServer->ApiUrl)) + "/")), vectorOptions, options); } else if ( this->Source == ECesiumGeoJsonDocumentRasterOverlaySource::FromUrl) { std::vector headers; headers.reserve(this->RequestHeaders.Num()); for (auto& [k, v] : this->RequestHeaders) { headers.push_back({TCHAR_TO_UTF8(*k), TCHAR_TO_UTF8(*v)}); } return std::make_unique( TCHAR_TO_UTF8(*this->MaterialLayerKey), wrapLoaderFuture( this, CesiumVectorData::GeoJsonDocument::fromUrl( getAsyncSystem(), getAssetAccessor(), TCHAR_TO_UTF8(*this->Url), std::move(headers))), vectorOptions, options); } if (this->OnDocumentLoaded.IsBound()) { this->OnDocumentLoaded.Execute(this->GeoJsonDocument); } return std::make_unique( getAsyncSystem(), TCHAR_TO_UTF8(*this->MaterialLayerKey), this->GeoJsonDocument.GetDocument(), vectorOptions, options); }