22
33#include " CesiumGeospatial/Cartographic.h"
44#include " Dom/JsonObject.h"
5+ #include " VecMath.h"
56
67#include < utility>
78#include < variant>
89#include < vector>
910
11+ FCesiumGeoJsonFeature::FCesiumGeoJsonFeature ()
12+ : _pDocument(nullptr ), _pFeature(nullptr ) {}
13+
14+ FCesiumGeoJsonFeature::FCesiumGeoJsonFeature (
15+ const std::shared_ptr<CesiumVectorData::GeoJsonDocument>& document,
16+ const CesiumVectorData::GeoJsonFeature* feature)
17+ : _pDocument(document), _pFeature(feature) {}
18+
1019ECesiumGeoJsonFeatureIdType UCesiumGeoJsonFeatureBlueprintLibrary::GetIdType (
1120 const FCesiumGeoJsonFeature& InFeature) {
12- if (!InFeature._document || !InFeature._feature ||
13- std::holds_alternative<std::monostate>(InFeature._feature ->id )) {
21+ if (!InFeature._pDocument || !InFeature._pFeature ||
22+ std::holds_alternative<std::monostate>(InFeature._pFeature ->id )) {
1423 return ECesiumGeoJsonFeatureIdType::None;
1524 }
1625
17- return std::holds_alternative<int64_t >(InFeature._feature ->id )
26+ return std::holds_alternative<int64_t >(InFeature._pFeature ->id )
1827 ? ECesiumGeoJsonFeatureIdType::Integer
1928 : ECesiumGeoJsonFeatureIdType::String;
2029}
2130
2231int64 UCesiumGeoJsonFeatureBlueprintLibrary::GetIdAsInteger (
2332 const FCesiumGeoJsonFeature& InFeature) {
24- if (!InFeature._document || !InFeature._feature ) {
33+ if (!InFeature._pDocument || !InFeature._pFeature ) {
2534 return -1 ;
2635 }
27- const int64_t * pId = std::get_if<int64_t >(&InFeature._feature ->id );
36+ const int64_t * pId = std::get_if<int64_t >(&InFeature._pFeature ->id );
2837 if (!pId) {
2938 return -1 ;
3039 }
@@ -34,7 +43,7 @@ int64 UCesiumGeoJsonFeatureBlueprintLibrary::GetIdAsInteger(
3443
3544FString UCesiumGeoJsonFeatureBlueprintLibrary::GetIdAsString (
3645 const FCesiumGeoJsonFeature& InFeature) {
37- if (!InFeature._document || !InFeature._feature ) {
46+ if (!InFeature._pDocument || !InFeature._pFeature ) {
3847 return {};
3948 }
4049 struct GetIdVisitor {
@@ -45,7 +54,7 @@ FString UCesiumGeoJsonFeatureBlueprintLibrary::GetIdAsString(
4554 FString operator ()(const std::monostate& id) { return {}; }
4655 };
4756
48- return std::visit (GetIdVisitor{}, InFeature._feature ->id );
57+ return std::visit (GetIdVisitor{}, InFeature._pFeature ->id );
4958}
5059
5160namespace {
@@ -66,9 +75,27 @@ jsonValueToUnrealJsonValue(const CesiumUtility::JsonValue& value) {
6675 return MakeShared<FJsonValueNumber>(value);
6776 }
6877 TSharedPtr<FJsonValue> operator ()(const std::uint64_t & value) {
78+ // If this value will fit into a double losslessly, we return it as a JSON
79+ // number.
80+ const std::optional<double > doubleOpt =
81+ CesiumUtility::losslessNarrow<double , std::uint64_t >(value);
82+ if (doubleOpt) {
83+ return MakeShared<FJsonValueNumber>(*doubleOpt);
84+ }
85+
86+ // Otherwise, we return it as a number string.
6987 return MakeShared<FJsonValueNumberString>(FString::FromInt (value));
7088 }
7189 TSharedPtr<FJsonValue> operator ()(const std::int64_t & value) {
90+ // If this value will fit into a double losslessly, we return it as a JSON
91+ // number.
92+ const std::optional<double > doubleOpt =
93+ CesiumUtility::losslessNarrow<double , std::int64_t >(value);
94+ if (doubleOpt) {
95+ return MakeShared<FJsonValueNumber>(*doubleOpt);
96+ }
97+
98+ // Otherwise, we return it as a number string.
7299 return MakeShared<FJsonValueNumberString>(FString::FromInt (value));
73100 }
74101 TSharedPtr<FJsonValue>
@@ -96,36 +123,36 @@ jsonValueToUnrealJsonValue(const CesiumUtility::JsonValue& value) {
96123
97124FJsonObjectWrapper UCesiumGeoJsonFeatureBlueprintLibrary::GetProperties (
98125 const FCesiumGeoJsonFeature& InFeature) {
99- if (!InFeature._document || !InFeature._feature ) {
126+ if (!InFeature._pDocument || !InFeature._pFeature ) {
100127 return {};
101128 }
102129 TSharedPtr<FJsonObject> object = MakeShared<FJsonObject>();
103- if (InFeature._feature ->properties ) {
104- for (const auto & [k, v] : *InFeature._feature ->properties ) {
130+ if (InFeature._pFeature ->properties ) {
131+ for (const auto & [k, v] : *InFeature._pFeature ->properties ) {
105132 object->SetField (UTF8_TO_TCHAR (k.c_str ()), jsonValueToUnrealJsonValue (v));
106133 }
107134 }
108135
109136 FJsonObjectWrapper wrapper;
110- wrapper.JsonObject = object;
137+ wrapper.JsonObject = MoveTemp ( object) ;
111138 return wrapper;
112139}
113140
114141FCesiumGeoJsonObject UCesiumGeoJsonFeatureBlueprintLibrary::GetGeometry (
115142 const FCesiumGeoJsonFeature& InFeature) {
116- if (!InFeature._document || !InFeature._feature ||
117- !InFeature._feature ->geometry ) {
143+ if (!InFeature._pDocument || !InFeature._pFeature ||
144+ !InFeature._pFeature ->geometry ) {
118145 return {};
119146 }
120147
121148 return FCesiumGeoJsonObject (
122- InFeature._document ,
123- InFeature._feature ->geometry .get ());
149+ InFeature._pDocument ,
150+ InFeature._pFeature ->geometry .get ());
124151}
125152
126153bool UCesiumGeoJsonFeatureBlueprintLibrary::IsValid (
127154 const FCesiumGeoJsonFeature& InFeature) {
128- return InFeature._document != nullptr && InFeature._feature != nullptr ;
155+ return InFeature._pDocument != nullptr && InFeature._pFeature != nullptr ;
129156}
130157
131158bool UCesiumGeoJsonObjectBlueprintLibrary::IsValid (
@@ -181,16 +208,10 @@ FJsonObjectWrapper UCesiumGeoJsonObjectBlueprintLibrary::GetForeignMembers(
181208 }
182209
183210 FJsonObjectWrapper wrapper;
184- wrapper.JsonObject = object;
211+ wrapper.JsonObject = MoveTemp ( object) ;
185212 return wrapper;
186213}
187214
188- namespace {
189- FVector degreesToVector (const glm::dvec3& coordinates) {
190- return FVector (coordinates.x , coordinates.y , coordinates.z );
191- }
192- } // namespace
193-
194215FVector UCesiumGeoJsonObjectBlueprintLibrary::GetObjectAsPoint (
195216 const FCesiumGeoJsonObject& InObject) {
196217 if (!InObject._pDocument || !InObject._pObject ) {
@@ -204,7 +225,7 @@ FVector UCesiumGeoJsonObjectBlueprintLibrary::GetObjectAsPoint(
204225 return FVector::ZeroVector;
205226 }
206227
207- return degreesToVector (pPoint->coordinates );
228+ return VecMath::createVector (pPoint->coordinates );
208229}
209230
210231TArray<FVector> UCesiumGeoJsonObjectBlueprintLibrary::GetObjectAsMultiPoint (
@@ -225,7 +246,7 @@ TArray<FVector> UCesiumGeoJsonObjectBlueprintLibrary::GetObjectAsMultiPoint(
225246 Points.Reserve (pMultiPoint->coordinates .size ());
226247
227248 for (size_t i = 0 ; i < pMultiPoint->coordinates .size (); i++) {
228- Points.Emplace (degreesToVector (pMultiPoint->coordinates [i]));
249+ Points.Emplace (VecMath::createVector (pMultiPoint->coordinates [i]));
229250 }
230251
231252 return Points;
@@ -250,7 +271,7 @@ UCesiumGeoJsonObjectBlueprintLibrary::GetObjectAsLineString(
250271 Points.Reserve (pLineString->coordinates .size ());
251272
252273 for (size_t i = 0 ; i < pLineString->coordinates .size (); i++) {
253- Points.Emplace (degreesToVector (pLineString->coordinates [i]));
274+ Points.Emplace (VecMath::createVector (pLineString->coordinates [i]));
254275 }
255276
256277 return FCesiumGeoJsonLineString (MoveTemp (Points));
@@ -279,7 +300,8 @@ UCesiumGeoJsonObjectBlueprintLibrary::GetObjectAsMultiLineString(
279300 Points.Reserve (pMultiLineString->coordinates [i].size ());
280301
281302 for (size_t j = 0 ; j < pMultiLineString->coordinates [i].size (); j++) {
282- Points.Emplace (degreesToVector (pMultiLineString->coordinates [i][j]));
303+ Points.Emplace (
304+ VecMath::createVector (pMultiLineString->coordinates [i][j]));
283305 }
284306
285307 Lines.Emplace (MoveTemp (Points));
@@ -414,7 +436,7 @@ UCesiumGeoJsonPolygonBlueprintFunctionLibrary::GetPolygonRings(
414436 Points.Reserve ((*InPolygon._rings )[i].size ());
415437
416438 for (size_t j = 0 ; j < (*InPolygon._rings )[i].size (); j++) {
417- Points.Emplace (degreesToVector ((*InPolygon._rings )[i][j]));
439+ Points.Emplace (VecMath::createVector ((*InPolygon._rings )[i][j]));
418440 }
419441
420442 Rings.Emplace (MoveTemp (Points));
0 commit comments