From be5f5a73497b8b5f604b1b9e79f1e0b6081225a0 Mon Sep 17 00:00:00 2001 From: jjspace <8007967+jjspace@users.noreply.github.com> Date: Thu, 23 Jan 2025 12:23:37 -0500 Subject: [PATCH] add support for geospatial features API --- .../gallery/iTwin Feature Service.html | 16 ++++----- packages/engine/Source/Scene/ITwinData.js | 36 ++++++++++++++++++- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/Apps/Sandcastle/gallery/iTwin Feature Service.html b/Apps/Sandcastle/gallery/iTwin Feature Service.html index d12f117ec3d..9d46cce0106 100644 --- a/Apps/Sandcastle/gallery/iTwin Feature Service.html +++ b/Apps/Sandcastle/gallery/iTwin Feature Service.html @@ -63,17 +63,17 @@ viewer.scene.camera.flyTo(birdsEyeView); // Load feature service geojson files - const points = await Cesium.ITwinData.createDataSourceForRealityDataId( + const points = await Cesium.ITwinData.loadGeospatialFeatures( iTwinId, - "57b975f6-fd92-42ba-8014-79911ed606d1", + "aef2f202-1ac8-4bb7-8a5f-9b75a8665c41", ); - const lines = await Cesium.ITwinData.createDataSourceForRealityDataId( + const lines = await Cesium.ITwinData.loadGeospatialFeatures( iTwinId, - "1099c53f-c568-48a3-a57c-0230a6f37229", + "613d2310-4d01-43b7-bc92-873a2ca4a4a0", ); - const areas = await Cesium.ITwinData.createDataSourceForRealityDataId( + const areas = await Cesium.ITwinData.loadGeospatialFeatures( iTwinId, - "21eaf0d0-ab90-400f-97cf-adc455b29a78", + "93e7ef51-5210-49f2-92a3-c7f6685e102f", ); // Add some styling to the lines and points to differentiate types @@ -86,7 +86,7 @@ Arrow_Marking: { color: Cesium.Color.YELLOW, icon: "car" }, Road_Sign: { color: Cesium.Color.ORANGE, icon: "triangle" }, }; - const type = entity.properties.Type?.getValue(); + const type = entity.properties.type?.getValue(); if (Cesium.defined(type) && Cesium.defined(styleByType[type])) { const { color, icon } = styleByType[type]; const canvas = await pinBuilder.fromMakiIconId(icon, color, 48); @@ -103,7 +103,7 @@ Turning_pocket: Cesium.Color.DEEPPINK, Yellow_Box: Cesium.Color.GOLD, }; - const type = entity.properties.Type?.getValue(); + const type = entity.properties.type?.getValue(); if (Cesium.defined(type) && Cesium.defined(lineColorsByType[type])) { entity.polyline.material = lineColorsByType[type]; } diff --git a/packages/engine/Source/Scene/ITwinData.js b/packages/engine/Source/Scene/ITwinData.js index 25fad57eb0a..c1af93f96ac 100644 --- a/packages/engine/Source/Scene/ITwinData.js +++ b/packages/engine/Source/Scene/ITwinData.js @@ -154,7 +154,7 @@ ITwinData.createTilesetForRealityDataId = async function ( * * @throws {RuntimeError} if the type of reality data is not supported by this function */ -ITwinData.createDataSourceForRealityDataId = async function loadRealityData( +ITwinData.createDataSourceForRealityDataId = async function ( iTwinId, realityDataId, type, @@ -205,4 +205,38 @@ ITwinData.createDataSourceForRealityDataId = async function loadRealityData( return KmlDataSource.load(tilesetAccessUrl); }; +ITwinData.loadGeospatialFeatures = async function ( + iTwinId, + collectionId, + limit, +) { + ////>>includeStart('debug', pragmas.debug); + Check.typeOf.string("iTwinId", iTwinId); + Check.typeOf.string("collectionId", collectionId); + if (defined(limit)) { + Check.typeOf.number("limit", limit); + Check.typeOf.number.lessThanOrEquals("limit", limit, 10000); + Check.typeOf.number.greaterThanOrEquals("limit", limit, 1); + } + //>>includeEnd('debug') + + const pageLimit = limit ?? 10000; + + const tilesetUrl = `${ITwinPlatform.apiEndpoint}/geospatial-features/itwins/${iTwinId}/ogc/collections/${collectionId}/items`; + + const resource = new Resource({ + url: tilesetUrl, + headers: { + Authorization: `Bearer ${ITwinPlatform.defaultAccessToken}`, + Accept: "application/vnd.bentley.itwin-platform.v1+json", + }, + queryParameters: { + limit: pageLimit, + client: "CesiumJS", + }, + }); + + return GeoJsonDataSource.load(resource); +}; + export default ITwinData;