Skip to content

Commit db89632

Browse files
committed
Update overlay for GeoJSON changes
1 parent e3dad3a commit db89632

File tree

7 files changed

+176
-103
lines changed

7 files changed

+176
-103
lines changed

Source/CesiumRuntime/Private/CesiumGeoJsonDocument.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,15 @@ FCesiumGeoJsonDocument::FCesiumGeoJsonDocument(
1313
std::shared_ptr<CesiumVectorData::GeoJsonDocument>&& document)
1414
: _pDocument(std::move(document)) {}
1515

16+
bool FCesiumGeoJsonDocument::IsValid() const {
17+
return this->_pDocument != nullptr;
18+
}
19+
20+
const std::shared_ptr<CesiumVectorData::GeoJsonDocument>&
21+
FCesiumGeoJsonDocument::GetDocument() const {
22+
return this->_pDocument;
23+
}
24+
1625
bool UCesiumGeoJsonDocumentBlueprintLibrary::LoadGeoJsonFromString(
1726
const FString& InString,
1827
FCesiumGeoJsonDocument& OutVectorDocument) {
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
// Copyright 2020-2024 CesiumGS, Inc. and Contributors
2+
3+
#include "CesiumGeoJsonDocumentRasterOverlay.h"
4+
5+
#include "CesiumCustomVersion.h"
6+
#include "CesiumGeometry/QuadtreeTilingScheme.h"
7+
#include "CesiumGeospatial/GlobeRectangle.h"
8+
#include "CesiumGeospatial/Projection.h"
9+
#include "CesiumRasterOverlays/GeoJsonDocumentRasterOverlay.h"
10+
#include "CesiumVectorData/VectorStyle.h"
11+
12+
#include "CesiumRuntime.h"
13+
14+
std::unique_ptr<CesiumRasterOverlays::RasterOverlay>
15+
UCesiumGeoJsonDocumentRasterOverlay::CreateOverlay(
16+
const CesiumRasterOverlays::RasterOverlayOptions& options) {
17+
if (this->Source == ECesiumGeoJsonDocumentRasterOverlaySource::FromDocument &&
18+
!this->GeoJsonDocument.IsValid()) {
19+
// Don't create an overlay with an invalid document.
20+
return nullptr;
21+
}
22+
23+
CesiumGeospatial::Projection projection;
24+
if (this->Projection ==
25+
ECesiumGeoJsonDocumentRasterOverlayProjection::Geographic) {
26+
projection = CesiumGeospatial::GeographicProjection(options.ellipsoid);
27+
} else {
28+
projection = CesiumGeospatial::WebMercatorProjection(options.ellipsoid);
29+
}
30+
31+
std::optional<CesiumRasterOverlays::GeoJsonDocumentRasterOverlayStyleCallback>
32+
callbackOpt = std::nullopt;
33+
34+
if (this->StyleCallback.IsBound()) {
35+
callbackOpt =
36+
[Callback = this->StyleCallback](
37+
const std::shared_ptr<CesiumVectorData::GeoJsonDocument>& doc,
38+
const CesiumVectorData::GeoJsonObject* pNode)
39+
-> std::optional<CesiumVectorData::VectorStyle> {
40+
FCesiumVectorStyle style;
41+
if (Callback.Execute(FCesiumGeoJsonObject(doc, pNode), style)) {
42+
return style.toNative();
43+
}
44+
45+
return std::nullopt;
46+
};
47+
}
48+
49+
CesiumRasterOverlays::GeoJsonDocumentRasterOverlayOptions vectorOptions{
50+
this->DefaultStyle.toNative(),
51+
callbackOpt,
52+
std::move(projection),
53+
options.ellipsoid,
54+
this->MipLevels};
55+
56+
if (this->Source ==
57+
ECesiumGeoJsonDocumentRasterOverlaySource::FromCesiumIon) {
58+
if (!IsValid(this->CesiumIonServer)) {
59+
this->CesiumIonServer = UCesiumIonServer::GetServerForNewObjects();
60+
}
61+
62+
return std::make_unique<CesiumRasterOverlays::GeoJsonDocumentRasterOverlay>(
63+
TCHAR_TO_UTF8(*this->MaterialLayerKey),
64+
CesiumRasterOverlays::IonGeoJsonDocumentRasterOverlaySource{
65+
this->IonAssetID,
66+
TCHAR_TO_UTF8(*this->CesiumIonServer->DefaultIonAccessToken),
67+
TCHAR_TO_UTF8(*this->CesiumIonServer->ApiUrl)},
68+
vectorOptions,
69+
options);
70+
} else if (
71+
this->Source == ECesiumGeoJsonDocumentRasterOverlaySource::FromUrl) {
72+
std::vector<CesiumAsync::IAssetAccessor::THeader> headers;
73+
headers.reserve(this->RequestHeaders.Num());
74+
75+
for (auto& [k, v] : this->RequestHeaders) {
76+
headers.push_back({TCHAR_TO_UTF8(*k), TCHAR_TO_UTF8(*v)});
77+
}
78+
79+
return std::make_unique<CesiumRasterOverlays::GeoJsonDocumentRasterOverlay>(
80+
TCHAR_TO_UTF8(*this->MaterialLayerKey),
81+
CesiumRasterOverlays::UrlGeoJsonDocumentRasterOverlaySource{
82+
TCHAR_TO_UTF8(*this->Url),
83+
std::move(headers)},
84+
vectorOptions,
85+
options);
86+
}
87+
88+
return std::make_unique<CesiumRasterOverlays::GeoJsonDocumentRasterOverlay>(
89+
TCHAR_TO_UTF8(*this->MaterialLayerKey),
90+
this->GeoJsonDocument.GetDocument(),
91+
vectorOptions,
92+
options);
93+
}

Source/CesiumRuntime/Private/CesiumVectorDocumentRasterOverlay.cpp

Lines changed: 0 additions & 76 deletions
This file was deleted.

Source/CesiumRuntime/Private/CesiumVectorStyle.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
#include "CesiumVectorStyle.h"
22

3+
#include "CesiumUtility/Color.h"
4+
35
CesiumVectorData::VectorStyle FCesiumVectorStyle::toNative() const {
46
return CesiumVectorData::VectorStyle{
57
CesiumVectorData::LineStyle{
6-
CesiumVectorData::Color{
8+
CesiumUtility::Color{
79
this->LineStyle.Color.R,
810
this->LineStyle.Color.G,
911
this->LineStyle.Color.B,
@@ -12,7 +14,7 @@ CesiumVectorData::VectorStyle FCesiumVectorStyle::toNative() const {
1214
this->LineStyle.Width,
1315
(CesiumVectorData::LineWidthMode)this->LineStyle.WidthMode},
1416
CesiumVectorData::PolygonStyle{
15-
CesiumVectorData::Color{
17+
CesiumUtility::Color{
1618
this->PolygonStyle.Color.R,
1719
this->PolygonStyle.Color.G,
1820
this->PolygonStyle.Color.B,

Source/CesiumRuntime/Public/CesiumGeoJsonDocument.h

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,15 @@ struct FCesiumGeoJsonDocument {
3535
std::shared_ptr<CesiumVectorData::GeoJsonDocument>&& document);
3636

3737
/**
38-
* @brief Checks if this FCesiumVectorDocument is valid (document is not
38+
* @brief Checks if this FCesiumGeoJsonDocument is valid (document is not
3939
* nullptr).
4040
*/
41-
bool IsValid() const { return this->_document != nullptr; }
41+
bool IsValid() const;
4242

4343
/**
44-
* @brief Returns the `CesiumVectorData::VectorDocument` this wraps.
44+
* @brief Returns the `CesiumVectorData::GeoJsonDocument` this wraps.
4545
*/
46-
const CesiumUtility::IntrusivePointer<CesiumVectorData::GeoJsonDocument>&
47-
GetDocument() const {
48-
return this->_document;
49-
}
46+
const std::shared_ptr<CesiumVectorData::GeoJsonDocument>& GetDocument() const;
5047

5148
private:
5249
std::shared_ptr<CesiumVectorData::GeoJsonDocument> _pDocument;

Source/CesiumRuntime/Public/CesiumVectorDocumentRasterOverlay.h renamed to Source/CesiumRuntime/Public/CesiumGeoJsonDocumentRasterOverlay.h

Lines changed: 65 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@
99
#include "Components/ActorComponent.h"
1010
#include "CoreMinimal.h"
1111
#include "Delegates/Delegate.h"
12-
#include "CesiumVectorDocumentRasterOverlay.generated.h"
12+
#include "CesiumGeoJsonDocumentRasterOverlay.generated.h"
1313

1414
/**
1515
* The projection used by a CesiumVectorDocumentRasterOverlay.
1616
*/
1717
UENUM(BlueprintType)
18-
enum class ECesiumVectorDocumentRasterOverlayProjection : uint8 {
18+
enum class ECesiumGeoJsonDocumentRasterOverlayProjection : uint8 {
1919
/**
2020
* The raster overlay is projected using Web Mercator.
2121
*/
@@ -32,20 +32,24 @@ enum class ECesiumVectorDocumentRasterOverlayProjection : uint8 {
3232
* data from.
3333
*/
3434
UENUM(BlueprintType)
35-
enum class ECesiumVectorDocumentRasterOverlaySource : uint8 {
35+
enum class ECesiumGeoJsonDocumentRasterOverlaySource : uint8 {
3636
/**
37-
* The raster overlay will display the provided VectorDocument.
37+
* The raster overlay will display the provided GeoJsonDocument.
3838
*/
3939
FromDocument = 0,
4040
/**
41-
* The raster overlay will load the VectorDocument from Cesium ion.
41+
* The raster overlay will load a GeoJsonDocument from Cesium ion.
4242
*/
43-
FromCesiumIon = 1
43+
FromCesiumIon = 1,
44+
/**
45+
* The raster overlay will load a GeoJsonDocument from a URL.
46+
*/
47+
FromUrl = 2
4448
};
4549

4650
DECLARE_DYNAMIC_DELEGATE_RetVal_TwoParams(
4751
bool,
48-
FCesiumVectorDocumentRasterOverlayStyleCallback,
52+
FCesiumGeoJsonDocumentRasterOverlayStyleCallback,
4953
FCesiumGeoJsonObject,
5054
InObject,
5155
FCesiumVectorStyle&,
@@ -56,7 +60,7 @@ UCLASS(
5660
BlueprintType,
5761
Blueprintable,
5862
meta = (BlueprintSpawnableComponent))
59-
class CESIUMRUNTIME_API UCesiumVectorDocumentRasterOverlay
63+
class CESIUMRUNTIME_API UCesiumGeoJsonDocumentRasterOverlay
6064
: public UCesiumRasterOverlay {
6165
GENERATED_BODY()
6266

@@ -67,12 +71,12 @@ class CESIUMRUNTIME_API UCesiumVectorDocumentRasterOverlay
6771
* Mercator.
6872
*/
6973
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cesium")
70-
ECesiumVectorDocumentRasterOverlayProjection Projection =
71-
ECesiumVectorDocumentRasterOverlayProjection::WebMercator;
74+
ECesiumGeoJsonDocumentRasterOverlayProjection Projection =
75+
ECesiumGeoJsonDocumentRasterOverlayProjection::WebMercator;
7276

7377
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cesium")
74-
ECesiumVectorDocumentRasterOverlaySource Source =
75-
ECesiumVectorDocumentRasterOverlaySource::FromCesiumIon;
78+
ECesiumGeoJsonDocumentRasterOverlaySource Source =
79+
ECesiumGeoJsonDocumentRasterOverlaySource::FromCesiumIon;
7680

7781
/**
7882
* The ID of the Cesium ion asset to use.
@@ -83,7 +87,7 @@ class CESIUMRUNTIME_API UCesiumVectorDocumentRasterOverlay
8387
Category = "Cesium",
8488
meta =
8589
(EditCondition =
86-
"Source == ECesiumVectorDocumentRasterOverlaySource::FromCesiumIon"))
90+
"Source == ECesiumGeoJsonDocumentRasterOverlaySource::FromCesiumIon"))
8791
int64 IonAssetID;
8892

8993
/**
@@ -96,30 +100,74 @@ class CESIUMRUNTIME_API UCesiumVectorDocumentRasterOverlay
96100
AdvancedDisplay,
97101
meta =
98102
(EditCondition =
99-
"Source == ECesiumVectorDocumentRasterOverlaySource::FromCesiumIon"))
103+
"Source == ECesiumGeoJsonDocumentRasterOverlaySource::FromCesiumIon"))
100104
UCesiumIonServer* CesiumIonServer;
101105

106+
/**
107+
* A FCesiumGeoJsonDocument to display.
108+
*/
109+
UPROPERTY(
110+
EditAnywhere,
111+
BlueprintReadWrite,
112+
Category = "Cesium",
113+
meta =
114+
(EditCondition =
115+
"Source == ECesiumGeoJsonDocumentRasterOverlaySource::FromDocument"))
116+
FCesiumGeoJsonDocument GeoJsonDocument;
117+
118+
/**
119+
* A URL to load a GeoJSON document from.
120+
*/
121+
UPROPERTY(
122+
EditAnywhere,
123+
BlueprintReadWrite,
124+
Category = "Cesium",
125+
meta =
126+
(EditCondition =
127+
"Source == ECesiumGeoJsonDocumentRasterOverlaySource::FromUrl"))
128+
FString Url;
129+
130+
/**
131+
* Headers to use while making a request to `Url` to load a GeoJSON document.
132+
*/
102133
UPROPERTY(
103134
EditAnywhere,
104135
BlueprintReadWrite,
105136
Category = "Cesium",
106137
meta =
107138
(EditCondition =
108-
"Source == ECesiumVectorDocumentRasterOverlaySource::FromDocument"))
109-
FCesiumGeoJsonDocument VectorDocument;
139+
"Source == ECesiumGeoJsonDocumentRasterOverlaySource::FromUrl"))
140+
TMap<FString, FString> RequestHeaders;
110141

142+
/**
143+
* The number of mip levels to generate for each tile of this raster overlay.
144+
*
145+
* Additional mip levels can improve the visual quality of tiles farther from
146+
* the camera at the cost of additional rasterization time to create each mip
147+
* level.
148+
*/
111149
UPROPERTY(
112150
EditAnywhere,
113151
BlueprintReadWrite,
114152
Category = "Cesium",
115153
meta = (ClampMin = "0", ClampMax = "8"))
116154
int32 MipLevels = 0;
117155

156+
/**
157+
* The default style to use for this raster overlay.
158+
*
159+
* If no style is set on a GeoJSON object or any of its parents, this style
160+
* will be used instead.
161+
*/
118162
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cesium")
119163
FCesiumVectorStyle DefaultStyle;
120164

165+
/**
166+
* A callback that will be called to set the styles of each object in the
167+
* loaded document.
168+
*/
121169
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cesium")
122-
FCesiumVectorDocumentRasterOverlayStyleCallback StyleCallback;
170+
FCesiumGeoJsonDocumentRasterOverlayStyleCallback StyleCallback;
123171

124172
protected:
125173
virtual std::unique_ptr<CesiumRasterOverlays::RasterOverlay> CreateOverlay(

0 commit comments

Comments
 (0)