@itwin/map-layers-formats 5.2.4 → 5.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -1
- package/lib/cjs/ArcGisFeature/ArcGisFeatureFormat.js.map +1 -1
- package/lib/cjs/ArcGisFeature/ArcGisFeatureProvider.js.map +1 -1
- package/lib/cjs/ArcGisFeature/ArcGisFeatureQuery.js.map +1 -1
- package/lib/cjs/ArcGisFeature/ArcGisFeatureReader.js.map +1 -1
- package/lib/cjs/ArcGisFeature/ArcGisFeatureResponse.js.map +1 -1
- package/lib/cjs/ArcGisFeature/ArcGisJsonFeatureReader.js.map +1 -1
- package/lib/cjs/ArcGisFeature/ArcGisPbfFeatureReader.js.map +1 -1
- package/lib/cjs/ArcGisFeature/ArcGisSymbologyRenderer.js.map +1 -1
- package/lib/cjs/ArcGisFeature/EsriSymbology.js.map +1 -1
- package/lib/cjs/ArcGisFeature/esriPBuffer.gen.js.map +1 -1
- package/lib/cjs/Feature/DefaultMarkerIcon.js +9 -9
- package/lib/cjs/Feature/DefaultMarkerIcon.js.map +1 -1
- package/lib/cjs/Feature/FeatureCanvasRenderer.js.map +1 -1
- package/lib/cjs/Feature/FeatureInfoReader.js.map +1 -1
- package/lib/cjs/Feature/FeatureSymbology.js.map +1 -1
- package/lib/cjs/Feature/RandomMapColor.js.map +1 -1
- package/lib/cjs/GeoJSON/GeoJSONGeometry.js.map +1 -1
- package/lib/cjs/GeoJSON/GeoJSONGeometryReader.js.map +1 -1
- package/lib/cjs/GoogleMaps/GoogleMaps.js.map +1 -1
- package/lib/cjs/GoogleMaps/GoogleMapsImageryFormat.js.map +1 -1
- package/lib/cjs/GoogleMaps/GoogleMapsImageryProvider.js.map +1 -1
- package/lib/cjs/GoogleMaps/GoogleMapsSession.js.map +1 -1
- package/lib/cjs/Icons/MapInfoIcon.js.map +1 -1
- package/lib/cjs/OgcApiFeatures/OgcApiFeaturesFormat.js.map +1 -1
- package/lib/cjs/OgcApiFeatures/OgcApiFeaturesProvider.js.map +1 -1
- package/lib/cjs/OgcApiFeatures/OgcApiFeaturesReader.js.map +1 -1
- package/lib/cjs/Tools/GeometryTerrainDraper.js.map +1 -1
- package/lib/cjs/Tools/MapFeatureInfoDecorator.js.map +1 -1
- package/lib/cjs/Tools/MapFeatureInfoTool.js.map +1 -1
- package/lib/cjs/internal/GoogleMapsUtils.js.map +1 -1
- package/lib/cjs/internal/NativeGoogleMapsSession.js.map +1 -1
- package/lib/cjs/map-layers-formats.js.map +1 -1
- package/lib/cjs/mapLayersFormats.js.map +1 -1
- package/lib/esm/ArcGisFeature/ArcGisFeatureFormat.js.map +1 -1
- package/lib/esm/ArcGisFeature/ArcGisFeatureProvider.js.map +1 -1
- package/lib/esm/ArcGisFeature/ArcGisFeatureQuery.js.map +1 -1
- package/lib/esm/ArcGisFeature/ArcGisFeatureReader.js.map +1 -1
- package/lib/esm/ArcGisFeature/ArcGisFeatureResponse.js.map +1 -1
- package/lib/esm/ArcGisFeature/ArcGisJsonFeatureReader.js.map +1 -1
- package/lib/esm/ArcGisFeature/ArcGisPbfFeatureReader.js.map +1 -1
- package/lib/esm/ArcGisFeature/ArcGisSymbologyRenderer.js.map +1 -1
- package/lib/esm/ArcGisFeature/EsriSymbology.js.map +1 -1
- package/lib/esm/ArcGisFeature/esriPBuffer.gen.js.map +1 -1
- package/lib/esm/Feature/DefaultMarkerIcon.js +9 -9
- package/lib/esm/Feature/DefaultMarkerIcon.js.map +1 -1
- package/lib/esm/Feature/FeatureCanvasRenderer.js.map +1 -1
- package/lib/esm/Feature/FeatureInfoReader.js.map +1 -1
- package/lib/esm/Feature/FeatureSymbology.js.map +1 -1
- package/lib/esm/Feature/RandomMapColor.js.map +1 -1
- package/lib/esm/GeoJSON/GeoJSONGeometry.js.map +1 -1
- package/lib/esm/GeoJSON/GeoJSONGeometryReader.js.map +1 -1
- package/lib/esm/GoogleMaps/GoogleMaps.js.map +1 -1
- package/lib/esm/GoogleMaps/GoogleMapsImageryFormat.js.map +1 -1
- package/lib/esm/GoogleMaps/GoogleMapsImageryProvider.js.map +1 -1
- package/lib/esm/GoogleMaps/GoogleMapsSession.js.map +1 -1
- package/lib/esm/Icons/MapInfoIcon.js.map +1 -1
- package/lib/esm/OgcApiFeatures/OgcApiFeaturesFormat.js.map +1 -1
- package/lib/esm/OgcApiFeatures/OgcApiFeaturesProvider.js.map +1 -1
- package/lib/esm/OgcApiFeatures/OgcApiFeaturesReader.js.map +1 -1
- package/lib/esm/Tools/GeometryTerrainDraper.js.map +1 -1
- package/lib/esm/Tools/MapFeatureInfoDecorator.js.map +1 -1
- package/lib/esm/Tools/MapFeatureInfoTool.js.map +1 -1
- package/lib/esm/internal/GoogleMapsUtils.js.map +1 -1
- package/lib/esm/internal/NativeGoogleMapsSession.js.map +1 -1
- package/lib/esm/map-layers-formats.js.map +1 -1
- package/lib/esm/mapLayersFormats.js.map +1 -1
- package/lib/public/images/GoogleMaps_Logo_Gray.svg +50 -50
- package/lib/public/images/GoogleMaps_Logo_WithDarkOutline.svg +78 -78
- package/lib/public/images/GoogleMaps_Logo_WithLightOutline.svg +78 -78
- package/lib/public/locales/en/mapLayersFormats.json +18 -18
- package/package.json +12 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OgcApiFeaturesProvider.js","sourceRoot":"","sources":["../../../src/OgcApiFeatures/OgcApiFeaturesProvider.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { base64StringToUint8Array, IModelStatus, Logger } from \"@itwin/core-bentley\";\r\nimport { Cartographic, ColorDef, ImageMapLayerSettings, ImageSource, ImageSourceFormat, ServerError, SubLayerId } from \"@itwin/core-common\";\r\nimport { FeatureGraphicsRenderer, HitDetail, ImageryMapTileTree, MapCartoRectangle, MapFeatureInfoOptions, MapLayerFeatureInfo, MapLayerImageryProvider, QuadId, WGS84Extent } from \"@itwin/core-frontend\";\r\nimport { Matrix4d, Point3d, Range2d } from \"@itwin/core-geometry\";\r\nimport Geojson from \"geojson\";\r\nimport { ArcGisSymbologyCanvasRenderer } from \"../ArcGisFeature/ArcGisSymbologyRenderer.js\";\r\nimport { EsriPMS, EsriPMSProps, EsriRenderer, EsriSFS, EsriSFSProps, EsriSLS, EsriSLSProps, EsriSymbol } from \"../ArcGisFeature/EsriSymbology.js\";\r\nimport { DefaultMarkerIcon } from \"../Feature/DefaultMarkerIcon.js\";\r\nimport { FeatureCanvasRenderer } from \"../Feature/FeatureCanvasRenderer.js\";\r\nimport { FeatureDefaultSymbology } from \"../Feature/FeatureSymbology.js\";\r\nimport { RandomMapColor } from \"../Feature/RandomMapColor.js\";\r\nimport { OgcApiFeaturesReader } from \"./OgcApiFeaturesReader.js\";\r\n\r\nconst loggerCategory = \"MapLayersFormats.OgcApiFeatures\";\r\nconst dataUrlHeaderToken = \"base64,\";\r\n\r\n/** Provide tiles from a ESRI ArcGIS Feature service\r\n* @internal\r\n*/\r\nexport class DefaultOgcSymbology implements FeatureDefaultSymbology {\r\n\r\n private static readonly _defaultPMSProps: Omit<EsriPMSProps, \"imageData\" | \"contentType\"> = {\r\n type: \"esriPMS\",\r\n url: \"\",\r\n width: 16,\r\n height: 24,\r\n // We want the anchor point to be the bottom of the push pin, so apply offset on the y-axis (anchor point is already in the center of the icon)\r\n xoffset: 0,\r\n yoffset: -12,\r\n };\r\n private _defaultPMS: EsriPMS;\r\n\r\n private static readonly _defaultSLSProps: EsriSLSProps = {\r\n type: \"esriSLS\",\r\n color: [0, 0, 255, 255],\r\n width: 1,\r\n style: \"esriSLSSolid\",\r\n };\r\n private _defaultSLS: EsriSLS;\r\n\r\n private static readonly _defaultSFSProps: EsriSFSProps = {\r\n type: \"esriSFS\",\r\n color: [0, 0, 255, 255], // blue fill\r\n style: \"esriSFSSolid\",\r\n outline: DefaultOgcSymbology._defaultSLSProps,\r\n };\r\n private _defaultSFS = EsriSFS.fromJSON(DefaultOgcSymbology._defaultSFSProps);\r\n\r\n public constructor(randomColor?: RandomMapColor) {\r\n const color = randomColor ? randomColor.getColorDef() : ColorDef.blue;\r\n this._defaultPMS = EsriPMS.fromJSON( {\r\n ...DefaultMarkerIcon.getContent(color),\r\n type: \"esriPMS\",\r\n url: \"\",\r\n width: 16,\r\n height: 24,\r\n xoffset: 0,\r\n yoffset: -12,\r\n });\r\n\r\n const randomColors = color.colors;\r\n const newSLSProps = {\r\n ...DefaultOgcSymbology._defaultSLSProps,\r\n color: [randomColors.r, randomColors.g, randomColors.b, 255],\r\n };\r\n this._defaultSLS = EsriSLS.fromJSON(newSLSProps);\r\n this._defaultSFS = EsriSFS.fromJSON({\r\n ...DefaultOgcSymbology._defaultSFSProps,\r\n color: [randomColors.r, randomColors.g, randomColors.b, 255],\r\n outline: {\r\n ...DefaultOgcSymbology._defaultSLSProps,\r\n color: [0, 0, 0, 255],\r\n },\r\n });\r\n }\r\n\r\n public async initialize() {\r\n // Marker image need to be loaded upfront;\r\n await this._defaultPMS.loadImage();\r\n }\r\n\r\n public getSymbology(geometryType: string): EsriSymbol {\r\n if (geometryType === \"LineString\"|| geometryType === \"MultiLineString\" )\r\n return this._defaultSLS;\r\n else if (geometryType === \"Polygon\"|| geometryType === \"MultiPolygon\" )\r\n return this._defaultSFS;\r\n else if (geometryType === \"Point\"|| geometryType === \"MultiPoint\" )\r\n return this._defaultPMS;\r\n\r\n throw new Error(`Could not get default symbology for geometry type ${geometryType}`);\r\n }\r\n}\r\n/** @internal */\r\nexport class OgcApiFeaturesProvider extends MapLayerImageryProvider {\r\n\r\n // Debug flags, should always be committed to FALSE !\r\n private readonly _drawDebugInfo = false;\r\n /// ////////////////////////////\r\n\r\n private readonly _limitParamMaxValue = 10000; // This is documented in OGC Features specification; a single items request never returns more than 10 000 items\r\n private readonly _tiledModeMinLod = 14;\r\n private readonly _staticModeFetchTimeout = 10000;\r\n private readonly _tileModeFetchTimeout = 10000;\r\n private readonly _forceTileMode = false;\r\n private _spatialIdx: any;\r\n private _defaultSymbol = new DefaultOgcSymbology(new RandomMapColor());\r\n private _renderer: EsriRenderer|undefined;\r\n private _collectionUrl = \"\";\r\n private _itemsUrl = \"\";\r\n private readonly _itemsCrs = \"http://www.opengis.net/def/crs/OGC/1.3/CRS84\"; // Fixed fow now\r\n private _queryables: any;\r\n\r\n public serviceJson: any;\r\n private _staticData: Geojson.FeatureCollection|undefined;\r\n\r\n constructor(settings: ImageMapLayerSettings) {\r\n super(settings, true);\r\n }\r\n\r\n public override get supportsMapFeatureInfo() { return true;}\r\n public override get minimumZoomLevel(): number { return this.staticMode ? super.minimumZoomLevel : this._tiledModeMinLod; }\r\n public get staticMode(): boolean { return !!(this._spatialIdx && this._staticData && !this._forceTileMode); }\r\n\r\n public override async initialize(): Promise<void> {\r\n\r\n this._collectionUrl = this._settings.url;\r\n let layerId: SubLayerId|undefined;\r\n\r\n // OGC Feature service request can only serve data for a single feature\r\n // so if multiple sub-layer ids are specified, we pick the first one.\r\n if (this._settings.subLayers && this._settings.subLayers.length > 0) {\r\n layerId = this._settings.subLayers[0].id;\r\n }\r\n\r\n const readCollectionsPage = (data: any) => {\r\n const collection = data.collections.find((col: any)=> col.id === layerId);\r\n const collectionLinks = collection?.links;\r\n if (!collectionLinks) {\r\n const msg = `Missing layer id or matching collection could not be found`;\r\n Logger.logError(loggerCategory, msg);\r\n throw new Error(msg);\r\n }\r\n const collectionLink = collectionLinks.find((link: any)=> link.rel.includes(\"collection\") && link.type === \"application/json\",\r\n );\r\n this._collectionUrl = collectionLink.href;\r\n };\r\n\r\n const layerIdMismatch = () => {\r\n const msg = `Collection metadata and sub-layers id mismatch`;\r\n Logger.logError(loggerCategory, msg);\r\n throw new Error(msg);\r\n };\r\n let collectionMetadata: any;\r\n let json = await this.fetchMetadata(this._settings.url);\r\n if (json?.type === \"FeatureCollection\") {\r\n // We landed on the items page, we need to look for the collection metadata url\r\n if (Array.isArray(json.links)) {\r\n const collectionLink = json.links.find((link: any)=> link.rel.includes(\"collection\") && link.type === \"application/json\");\r\n this._collectionUrl = collectionLink.href;\r\n }\r\n } else if (json.itemType === \"feature\") {\r\n // We landed on a specific collection page.\r\n collectionMetadata = json;\r\n\r\n // Check if the collection id matches at least one sub-layer\r\n if (this._settings.subLayers && this._settings.subLayers.length > 0) {\r\n const subLayer = this._settings.subLayers.find((s)=>s.id === collectionMetadata.id);\r\n if (subLayer)\r\n layerId = subLayer.id;\r\n } else {\r\n // No sub-layers were specified, defaults to collection id.\r\n layerId = collectionMetadata.id;\r\n }\r\n\r\n } else if (Array.isArray(json.collections)) {\r\n // We landed in the \"Collections\" page\r\n // Find to find the specified layer id among the available collections\r\n readCollectionsPage(json);\r\n } else if (Array.isArray(json.links)) {\r\n // This might be the main landing page\r\n // We need to find the the \"Collections\" page\r\n const collectionsLink = json.links.find((link: any)=> link.rel.includes(\"data\") && link.type === \"application/json\");\r\n if (!collectionsLink) {\r\n Logger.logError(loggerCategory, \"Could not find collections link\");\r\n throw new ServerError(IModelStatus.ValidationFailed, \"\");\r\n }\r\n\r\n json = await this.fetchMetadata(collectionsLink.href);\r\n if (Array.isArray(json.collections)) {\r\n readCollectionsPage(json);\r\n }\r\n }\r\n\r\n // Read collection metadata\r\n if (!collectionMetadata)\r\n collectionMetadata = await this.fetchMetadata(this._collectionUrl);\r\n\r\n if (layerId !== undefined && layerId !== collectionMetadata.id) {\r\n layerIdMismatch();\r\n }\r\n\r\n // Read cartographic range\r\n if (Array.isArray(collectionMetadata?.extent?.spatial?.bbox)\r\n && collectionMetadata.extent.spatial.bbox.length > 0\r\n && collectionMetadata.extent.spatial.crs === this._itemsCrs\r\n ) {\r\n const firstBbox = collectionMetadata.extent.spatial?.bbox[0];\r\n this.cartoRange = MapCartoRectangle.fromDegrees(firstBbox[0], firstBbox[1], firstBbox[2], firstBbox[3]);\r\n }\r\n\r\n // Read important links\r\n let queryablesHref: string|undefined;\r\n let itemsHref: string|undefined;\r\n if (Array.isArray(collectionMetadata?.links)) {\r\n // Items links (Mandatory)\r\n const itemsLink = collectionMetadata.links.find((link: any)=> link.rel.includes(\"items\") && link.type === \"application/geo+json\");\r\n itemsHref = itemsLink.href;\r\n\r\n // Queryables link (Optional)\r\n const queryablesLink = collectionMetadata.links.find((link: any)=> link.rel.includes(\"queryables\") && link.type === \"application/schema+json\");\r\n queryablesHref = queryablesLink.href;\r\n\r\n }\r\n\r\n if (itemsHref)\r\n this._itemsUrl = itemsHref;\r\n else {\r\n const msg = \"Unable to find items link on collection\";\r\n Logger.logError(loggerCategory, msg);\r\n throw new Error(msg);\r\n }\r\n if (queryablesHref)\r\n this._queryables = await this.fetchMetadata(queryablesHref);\r\n\r\n if (!this._forceTileMode) {\r\n const status = await this.fetchAllItems();\r\n if (status) {\r\n await this.indexStaticData();\r\n }\r\n }\r\n\r\n await this._defaultSymbol.initialize(); // images must be loaded upfront\r\n }\r\n\r\n private async fetchMetadata(url: string): Promise<any> {\r\n const tmpUrl = this.appendCustomParams(url);\r\n const response = await this.makeRequest(tmpUrl);\r\n return response.json();\r\n }\r\n\r\n private async fetchAllItems() {\r\n const urlObj = new URL(this._itemsUrl);\r\n urlObj.searchParams.append(\"limit\", `${this._limitParamMaxValue}`);\r\n const url = this.appendCustomParams(urlObj.toString());\r\n this._staticData = await this.fetchItems(url, this._staticModeFetchTimeout);\r\n return this._staticData ? true : false;\r\n }\r\n\r\n private async fetchItems(url: string, timeout: number) {\r\n let data: any;\r\n let success = true;\r\n try {\r\n const fetchBegin = Date.now();\r\n let tmpUrl = this.appendCustomParams(url);\r\n let response = await this.makeTileRequest(tmpUrl, timeout);\r\n let json = await response.json();\r\n data = json;\r\n // Follow \"next\" link if any\r\n let nextLink = json.links?.find((link: any)=>link.rel === \"next\");\r\n while (nextLink && (Date.now() - fetchBegin) < timeout && success) {\r\n tmpUrl = this.appendCustomParams(nextLink.href);\r\n response = await this.makeTileRequest(tmpUrl, this._staticModeFetchTimeout);\r\n json = await response.json();\r\n if (json?.features)\r\n data!.features = this._staticData?.features ? [...this._staticData.features, ...json.features] : json.features;\r\n else\r\n success = false;\r\n nextLink = json.links?.find((link: any)=>link.rel === \"next\");\r\n }\r\n if (Date.now() - fetchBegin >= this._staticModeFetchTimeout) {\r\n // We ran out of time, let switch to tile mode\r\n success = false;\r\n }\r\n } catch (e) {\r\n success = false;\r\n if (e instanceof DOMException && e.name === \"AbortError\") {\r\n Logger.logInfo(loggerCategory, \"Request to fetch all features time out, switching to tile mode.\");\r\n } else {\r\n Logger.logError(loggerCategory, \"Unknown error occurred when fetching OgcApiFeatures data.\");\r\n }\r\n }\r\n return success ? data : undefined;\r\n }\r\n\r\n // Read features range and build in-memory spatial index\r\n private async indexStaticData() {\r\n // UGLY IMPORT:\r\n // flatbush only provides ECM modules, and since mocha is not very good with ECM modules,\r\n // we need to have this special import, until we replace mocha with something else.\r\n const flatbush = (await import(\"flatbush\")).default;\r\n let success = true;\r\n try {\r\n const datasetRange = new Range2d();\r\n const buildPositionRange = (coords: Geojson.Position, range: Range2d) => range.extendXY(coords[0], coords[1]);\r\n const buildPositionArrayRange = (coords: Geojson.Position[], range: Range2d) => coords.forEach((position) => buildPositionRange(position, range) );\r\n const buildDoublePositionRange = (coords: Geojson.Position[][], range: Range2d) => coords.forEach((position) => buildPositionArrayRange(position, range) );\r\n const buildTriplePositionRange = (coords: Geojson.Position[][][], range: Range2d) => coords.forEach((position) => buildDoublePositionRange(position, range) );\r\n\r\n const readGeomRange = (geom: Geojson.Geometry, range: Range2d) => {\r\n if (geom.type === \"Point\")\r\n buildPositionRange(geom.coordinates, range);\r\n else if (geom.type === \"LineString\" || geom.type === \"MultiPoint\")\r\n buildPositionArrayRange(geom.coordinates, range);\r\n else if (geom.type === \"Polygon\" || geom.type === \"MultiLineString\")\r\n buildDoublePositionRange(geom.coordinates, range);\r\n else if (geom.type === \"MultiPolygon\" )\r\n buildTriplePositionRange(geom.coordinates, range);\r\n };\r\n\r\n if (this._staticData && Array.isArray(this._staticData.features)) {\r\n this._spatialIdx = new flatbush(this._staticData.features.length);\r\n this._staticData.features.forEach((feature: Geojson.Feature) => {\r\n try {\r\n if (feature.geometry.type === \"LineString\"\r\n || feature.geometry.type === \"MultiLineString\"\r\n || feature.geometry.type === \"Point\"\r\n || feature.geometry.type === \"MultiPoint\"\r\n || feature.geometry.type === \"Polygon\"\r\n || feature.geometry.type === \"MultiPolygon\"\r\n ) {\r\n readGeomRange(feature.geometry, datasetRange);\r\n this._spatialIdx?.add(datasetRange.xLow, datasetRange.yLow, datasetRange.xHigh,datasetRange. yHigh);\r\n datasetRange.setNull();\r\n } else if (feature.geometry.type === \"GeometryCollection\") {\r\n feature.geometry.geometries.forEach((geom) => {\r\n readGeomRange(geom, datasetRange);\r\n this._spatialIdx?.add(datasetRange.xLow, datasetRange.yLow, datasetRange.xHigh,datasetRange. yHigh);\r\n });\r\n datasetRange.setNull();\r\n }\r\n } catch (e: any) {\r\n Logger.logInfo(loggerCategory, `Unknown error occurred indexing feature: ${e.message}`);\r\n success = false;\r\n }\r\n });\r\n\r\n if (success) {\r\n this._spatialIdx.finish();\r\n }\r\n }\r\n\r\n } catch {\r\n Logger.logError(loggerCategory, \"Unknown error occurred when index static data\");\r\n success = false;\r\n }\r\n return success;\r\n }\r\n\r\n public override get tileSize(): number { return 512; }\r\n\r\n // We don't use this method inside this provider (see constructFeatureUrl), but since this is an abstract method, we need to define something\r\n public async constructUrl(_row: number, _column: number, _zoomLevel: number): Promise<string> {\r\n return \"\";\r\n }\r\n\r\n public drawTileDebugInfo(row: number, column: number, zoomLevel: number, context: CanvasRenderingContext2D) {\r\n context.fillStyle = \"cyan\";\r\n context.strokeRect(0, 0, this.tileSize, this.tileSize);\r\n context.font = \"30px Arial\";\r\n context.lineWidth = 5;\r\n context.fillText(`${zoomLevel}-${row}-${column}`, 10, 50);\r\n }\r\n\r\n // Compute transform that provides coordinates in the canvas coordinate system (pixels, origin = top-left)\r\n // from coordinate in world\r\n public computeTileWorld2CanvasTransform(row: number, column: number, zoomLevel: number) {\r\n\r\n const tileExtentWorld4326 = this.getEPSG4326Extent(row, column, zoomLevel);\r\n const worldTileWidth = tileExtentWorld4326.longitudeRight - tileExtentWorld4326.longitudeLeft;\r\n const worldTileHeight = tileExtentWorld4326.latitudeTop - tileExtentWorld4326.latitudeBottom;\r\n const canvasTileWidth = this.tileSize;\r\n const canvasTileHeight = this.tileSize;\r\n const world2CanvasRatioX = canvasTileWidth / worldTileWidth;\r\n const world2CanvasRatioY = canvasTileHeight / worldTileHeight;\r\n const worldTileOrigin = Point3d.create(tileExtentWorld4326.longitudeLeft, tileExtentWorld4326.latitudeBottom);\r\n const worldTileExtent = Point3d.create(tileExtentWorld4326.longitudeRight, tileExtentWorld4326.latitudeTop);\r\n const canvasTileOriginOffset = worldTileOrigin.clone();\r\n const canvasTileExtentOffset = worldTileExtent.clone();\r\n canvasTileOriginOffset.x *= world2CanvasRatioX;\r\n canvasTileOriginOffset.y *= world2CanvasRatioY;\r\n canvasTileExtentOffset.x *= world2CanvasRatioX;\r\n canvasTileExtentOffset.y *= world2CanvasRatioY;\r\n const xTranslate = -1 * canvasTileOriginOffset.x;\r\n\r\n // Canvas origin is upper left corner, so we need to flip the y axis\r\n const yTranslate = canvasTileExtentOffset.y; // y-axis flip\r\n const yWorld2CanvasRatio = -1 * world2CanvasRatioY; // y-axis flip\r\n\r\n const matrix = Matrix4d.createTranslationAndScaleXYZ(xTranslate, yTranslate, 0, world2CanvasRatioX, yWorld2CanvasRatio, 1);\r\n return matrix.asTransform;\r\n }\r\n\r\n public override async loadTile(row: number, column: number, zoomLevel: number): Promise<ImageSource | undefined> {\r\n\r\n const extent4326 = this.getEPSG4326Extent(row, column, zoomLevel);\r\n\r\n let data: any;\r\n if (this.staticMode) {\r\n // Static data mode\r\n const filteredData: Geojson.FeatureCollection = {type: \"FeatureCollection\", features: []};\r\n\r\n this._spatialIdx?.search(extent4326.longitudeLeft, extent4326.latitudeBottom, extent4326.longitudeRight, extent4326.latitudeTop,\r\n (index: number) => {\r\n filteredData.features.push(this._staticData!.features[index]);\r\n return true;\r\n });\r\n\r\n data = filteredData;\r\n } else {\r\n // Tiled data mode\r\n const extent4326Str = this.getEPSG4326TileExtentString(row, column, zoomLevel, false);\r\n const urlObj = new URL(this._itemsUrl);\r\n urlObj.searchParams.append(\"bbox\", `${extent4326Str}`);\r\n urlObj.searchParams.append(\"bbox-crs\", this._itemsCrs);\r\n urlObj.searchParams.append(\"limit\", `${this._limitParamMaxValue}`);\r\n const url = this.appendCustomParams(urlObj.toString());\r\n\r\n try {\r\n data = await this.fetchItems(url, this._tileModeFetchTimeout);\r\n } catch {\r\n }\r\n if (!data) {\r\n Logger.logError(loggerCategory, \"Could not fetch OgcApiFeatures data.\");\r\n }\r\n }\r\n\r\n if (!data || !Array.isArray(data.features) || data.features.length === 0) {\r\n Logger.logInfo(loggerCategory, `No data to render for tile (${zoomLevel}/${row}/${column}).`);\r\n }\r\n\r\n // Rendering starts here\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = this.tileSize;\r\n canvas.height = this.tileSize;\r\n const ctx = canvas.getContext(\"2d\");\r\n if (ctx == null) {\r\n Logger.logError(loggerCategory, \"No canvas context available for loading tile.\");\r\n return undefined;\r\n }\r\n\r\n try {\r\n // Compute transform if CoordinatesQuantization is not supported by service\r\n const transfo = this.computeTileWorld2CanvasTransform(row, column, zoomLevel);\r\n if (!transfo) {\r\n Logger.logError(loggerCategory, `Could not compute data transformation for tile (${zoomLevel}/${row}/${column})`);\r\n }\r\n\r\n // Create the renderer\r\n\r\n // Instead of passing a Transform oject to the render, it should be possible\r\n // instead to set the Transform directly on the Canvas, when I tried the display was incorrect, floating point issue?\r\n // const transfoRow = transfo!.toRows();\r\n // ctx.setTransform(transfoRow[0][0], transfoRow[1][0], transfoRow[0][1], transfoRow[1][1], transfoRow[0][3], transfoRow[1][3]);\r\n const symbRenderer = ArcGisSymbologyCanvasRenderer.create(this._renderer, this._defaultSymbol);\r\n const renderer = new FeatureCanvasRenderer(ctx, symbRenderer, transfo);\r\n\r\n const featureReader = new OgcApiFeaturesReader();\r\n\r\n await featureReader.readAndRender(data, renderer);\r\n if (this._drawDebugInfo)\r\n this.drawTileDebugInfo(row, column, zoomLevel, ctx);\r\n } catch (e) {\r\n Logger.logError(loggerCategory, `Exception occurred while loading tile (${zoomLevel}/${row}/${column}) : ${e}`);\r\n }\r\n\r\n try {\r\n return this.createImageSourceFromDataURL(canvas.toDataURL(\"image/png\"), ImageSourceFormat.Png);\r\n } catch (e) {\r\n Logger.logError(loggerCategory, `Exception occurred while rendering tile (${zoomLevel}/${row}/${column}) : ${e}.`);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private createImageSourceFromDataURL(dataUrl: string, format: ImageSourceFormat) {\r\n if (!dataUrl)\r\n return undefined;\r\n\r\n const dataStartPos = dataUrl.indexOf(dataUrlHeaderToken) + dataUrlHeaderToken.length;\r\n\r\n if (dataStartPos < 0)\r\n return undefined;\r\n\r\n const base64Png = dataUrl.substring(dataStartPos);\r\n return new ImageSource(base64StringToUint8Array(base64Png), format);\r\n }\r\n\r\n public override async getFeatureInfo(featureInfos: MapLayerFeatureInfo[], quadId: QuadId, carto: Cartographic, _tree: ImageryMapTileTree, hit: HitDetail, options?: MapFeatureInfoOptions): Promise<void> {\r\n const tileExtent = this.getEPSG4326Extent(quadId.row, quadId.column, quadId.level);\r\n const tilePixelSizeX = (tileExtent.longitudeRight - tileExtent.longitudeLeft) / this.tileSize;\r\n const tilePixelSizeY = (tileExtent.latitudeTop - tileExtent.latitudeBottom) / this.tileSize;\r\n const tolerancePixel = options?.tolerance ?? 7;\r\n const toleranceWorldX = tilePixelSizeX * tolerancePixel;\r\n const toleranceWorldY = tilePixelSizeY * tolerancePixel;\r\n\r\n // Note: We used to pass a single point as the query 'geometry' and leverage the 'distance' parameter, turns\r\n // out that approach was a lot slower on some server compared to using a single envelope.\r\n const bbox: WGS84Extent = {\r\n longitudeLeft: carto.longitudeDegrees - toleranceWorldX, latitudeBottom: carto.latitudeDegrees - toleranceWorldY,\r\n longitudeRight: carto.longitudeDegrees + toleranceWorldX, latitudeTop: carto.latitudeDegrees + toleranceWorldY,\r\n };\r\n\r\n const bboxStr = this.getEPSG4326ExtentString(bbox, false);\r\n const urlObj = new URL(this._itemsUrl);\r\n urlObj.searchParams.append(\"bbox\", `${bboxStr}`);\r\n urlObj.searchParams.append(\"bbox-crs\", this._itemsCrs);\r\n urlObj.searchParams.append(\"limit\", `${this._limitParamMaxValue}`);\r\n const url = this.appendCustomParams(urlObj.toString());\r\n\r\n let data: any;\r\n try {\r\n data = await this.fetchItems(url, this._tileModeFetchTimeout);\r\n } catch {\r\n }\r\n if (!data) {\r\n Logger.logError(loggerCategory, \"Could not fetch OgcApiFeatures data.\");\r\n }\r\n\r\n const featureReader = new OgcApiFeaturesReader();\r\n await featureReader.readFeatureInfo({\r\n collection:data,\r\n layerSettings: this._settings,\r\n queryables: this._queryables,\r\n geomRenderer: new FeatureGraphicsRenderer({viewport: hit.viewport, crs: \"wgs84\"})},\r\n featureInfos );\r\n }\r\n}\r\n\r\n"]}
|
|
1
|
+
{"version":3,"file":"OgcApiFeaturesProvider.js","sourceRoot":"","sources":["../../../src/OgcApiFeatures/OgcApiFeaturesProvider.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { base64StringToUint8Array, IModelStatus, Logger } from \"@itwin/core-bentley\";\nimport { Cartographic, ColorDef, ImageMapLayerSettings, ImageSource, ImageSourceFormat, ServerError, SubLayerId } from \"@itwin/core-common\";\nimport { FeatureGraphicsRenderer, HitDetail, ImageryMapTileTree, MapCartoRectangle, MapFeatureInfoOptions, MapLayerFeatureInfo, MapLayerImageryProvider, QuadId, WGS84Extent } from \"@itwin/core-frontend\";\nimport { Matrix4d, Point3d, Range2d } from \"@itwin/core-geometry\";\nimport Geojson from \"geojson\";\nimport { ArcGisSymbologyCanvasRenderer } from \"../ArcGisFeature/ArcGisSymbologyRenderer.js\";\nimport { EsriPMS, EsriPMSProps, EsriRenderer, EsriSFS, EsriSFSProps, EsriSLS, EsriSLSProps, EsriSymbol } from \"../ArcGisFeature/EsriSymbology.js\";\nimport { DefaultMarkerIcon } from \"../Feature/DefaultMarkerIcon.js\";\nimport { FeatureCanvasRenderer } from \"../Feature/FeatureCanvasRenderer.js\";\nimport { FeatureDefaultSymbology } from \"../Feature/FeatureSymbology.js\";\nimport { RandomMapColor } from \"../Feature/RandomMapColor.js\";\nimport { OgcApiFeaturesReader } from \"./OgcApiFeaturesReader.js\";\n\nconst loggerCategory = \"MapLayersFormats.OgcApiFeatures\";\nconst dataUrlHeaderToken = \"base64,\";\n\n/** Provide tiles from a ESRI ArcGIS Feature service\n* @internal\n*/\nexport class DefaultOgcSymbology implements FeatureDefaultSymbology {\n\n private static readonly _defaultPMSProps: Omit<EsriPMSProps, \"imageData\" | \"contentType\"> = {\n type: \"esriPMS\",\n url: \"\",\n width: 16,\n height: 24,\n // We want the anchor point to be the bottom of the push pin, so apply offset on the y-axis (anchor point is already in the center of the icon)\n xoffset: 0,\n yoffset: -12,\n };\n private _defaultPMS: EsriPMS;\n\n private static readonly _defaultSLSProps: EsriSLSProps = {\n type: \"esriSLS\",\n color: [0, 0, 255, 255],\n width: 1,\n style: \"esriSLSSolid\",\n };\n private _defaultSLS: EsriSLS;\n\n private static readonly _defaultSFSProps: EsriSFSProps = {\n type: \"esriSFS\",\n color: [0, 0, 255, 255], // blue fill\n style: \"esriSFSSolid\",\n outline: DefaultOgcSymbology._defaultSLSProps,\n };\n private _defaultSFS = EsriSFS.fromJSON(DefaultOgcSymbology._defaultSFSProps);\n\n public constructor(randomColor?: RandomMapColor) {\n const color = randomColor ? randomColor.getColorDef() : ColorDef.blue;\n this._defaultPMS = EsriPMS.fromJSON( {\n ...DefaultMarkerIcon.getContent(color),\n type: \"esriPMS\",\n url: \"\",\n width: 16,\n height: 24,\n xoffset: 0,\n yoffset: -12,\n });\n\n const randomColors = color.colors;\n const newSLSProps = {\n ...DefaultOgcSymbology._defaultSLSProps,\n color: [randomColors.r, randomColors.g, randomColors.b, 255],\n };\n this._defaultSLS = EsriSLS.fromJSON(newSLSProps);\n this._defaultSFS = EsriSFS.fromJSON({\n ...DefaultOgcSymbology._defaultSFSProps,\n color: [randomColors.r, randomColors.g, randomColors.b, 255],\n outline: {\n ...DefaultOgcSymbology._defaultSLSProps,\n color: [0, 0, 0, 255],\n },\n });\n }\n\n public async initialize() {\n // Marker image need to be loaded upfront;\n await this._defaultPMS.loadImage();\n }\n\n public getSymbology(geometryType: string): EsriSymbol {\n if (geometryType === \"LineString\"|| geometryType === \"MultiLineString\" )\n return this._defaultSLS;\n else if (geometryType === \"Polygon\"|| geometryType === \"MultiPolygon\" )\n return this._defaultSFS;\n else if (geometryType === \"Point\"|| geometryType === \"MultiPoint\" )\n return this._defaultPMS;\n\n throw new Error(`Could not get default symbology for geometry type ${geometryType}`);\n }\n}\n/** @internal */\nexport class OgcApiFeaturesProvider extends MapLayerImageryProvider {\n\n // Debug flags, should always be committed to FALSE !\n private readonly _drawDebugInfo = false;\n /// ////////////////////////////\n\n private readonly _limitParamMaxValue = 10000; // This is documented in OGC Features specification; a single items request never returns more than 10 000 items\n private readonly _tiledModeMinLod = 14;\n private readonly _staticModeFetchTimeout = 10000;\n private readonly _tileModeFetchTimeout = 10000;\n private readonly _forceTileMode = false;\n private _spatialIdx: any;\n private _defaultSymbol = new DefaultOgcSymbology(new RandomMapColor());\n private _renderer: EsriRenderer|undefined;\n private _collectionUrl = \"\";\n private _itemsUrl = \"\";\n private readonly _itemsCrs = \"http://www.opengis.net/def/crs/OGC/1.3/CRS84\"; // Fixed fow now\n private _queryables: any;\n\n public serviceJson: any;\n private _staticData: Geojson.FeatureCollection|undefined;\n\n constructor(settings: ImageMapLayerSettings) {\n super(settings, true);\n }\n\n public override get supportsMapFeatureInfo() { return true;}\n public override get minimumZoomLevel(): number { return this.staticMode ? super.minimumZoomLevel : this._tiledModeMinLod; }\n public get staticMode(): boolean { return !!(this._spatialIdx && this._staticData && !this._forceTileMode); }\n\n public override async initialize(): Promise<void> {\n\n this._collectionUrl = this._settings.url;\n let layerId: SubLayerId|undefined;\n\n // OGC Feature service request can only serve data for a single feature\n // so if multiple sub-layer ids are specified, we pick the first one.\n if (this._settings.subLayers && this._settings.subLayers.length > 0) {\n layerId = this._settings.subLayers[0].id;\n }\n\n const readCollectionsPage = (data: any) => {\n const collection = data.collections.find((col: any)=> col.id === layerId);\n const collectionLinks = collection?.links;\n if (!collectionLinks) {\n const msg = `Missing layer id or matching collection could not be found`;\n Logger.logError(loggerCategory, msg);\n throw new Error(msg);\n }\n const collectionLink = collectionLinks.find((link: any)=> link.rel.includes(\"collection\") && link.type === \"application/json\",\n );\n this._collectionUrl = collectionLink.href;\n };\n\n const layerIdMismatch = () => {\n const msg = `Collection metadata and sub-layers id mismatch`;\n Logger.logError(loggerCategory, msg);\n throw new Error(msg);\n };\n let collectionMetadata: any;\n let json = await this.fetchMetadata(this._settings.url);\n if (json?.type === \"FeatureCollection\") {\n // We landed on the items page, we need to look for the collection metadata url\n if (Array.isArray(json.links)) {\n const collectionLink = json.links.find((link: any)=> link.rel.includes(\"collection\") && link.type === \"application/json\");\n this._collectionUrl = collectionLink.href;\n }\n } else if (json.itemType === \"feature\") {\n // We landed on a specific collection page.\n collectionMetadata = json;\n\n // Check if the collection id matches at least one sub-layer\n if (this._settings.subLayers && this._settings.subLayers.length > 0) {\n const subLayer = this._settings.subLayers.find((s)=>s.id === collectionMetadata.id);\n if (subLayer)\n layerId = subLayer.id;\n } else {\n // No sub-layers were specified, defaults to collection id.\n layerId = collectionMetadata.id;\n }\n\n } else if (Array.isArray(json.collections)) {\n // We landed in the \"Collections\" page\n // Find to find the specified layer id among the available collections\n readCollectionsPage(json);\n } else if (Array.isArray(json.links)) {\n // This might be the main landing page\n // We need to find the the \"Collections\" page\n const collectionsLink = json.links.find((link: any)=> link.rel.includes(\"data\") && link.type === \"application/json\");\n if (!collectionsLink) {\n Logger.logError(loggerCategory, \"Could not find collections link\");\n throw new ServerError(IModelStatus.ValidationFailed, \"\");\n }\n\n json = await this.fetchMetadata(collectionsLink.href);\n if (Array.isArray(json.collections)) {\n readCollectionsPage(json);\n }\n }\n\n // Read collection metadata\n if (!collectionMetadata)\n collectionMetadata = await this.fetchMetadata(this._collectionUrl);\n\n if (layerId !== undefined && layerId !== collectionMetadata.id) {\n layerIdMismatch();\n }\n\n // Read cartographic range\n if (Array.isArray(collectionMetadata?.extent?.spatial?.bbox)\n && collectionMetadata.extent.spatial.bbox.length > 0\n && collectionMetadata.extent.spatial.crs === this._itemsCrs\n ) {\n const firstBbox = collectionMetadata.extent.spatial?.bbox[0];\n this.cartoRange = MapCartoRectangle.fromDegrees(firstBbox[0], firstBbox[1], firstBbox[2], firstBbox[3]);\n }\n\n // Read important links\n let queryablesHref: string|undefined;\n let itemsHref: string|undefined;\n if (Array.isArray(collectionMetadata?.links)) {\n // Items links (Mandatory)\n const itemsLink = collectionMetadata.links.find((link: any)=> link.rel.includes(\"items\") && link.type === \"application/geo+json\");\n itemsHref = itemsLink.href;\n\n // Queryables link (Optional)\n const queryablesLink = collectionMetadata.links.find((link: any)=> link.rel.includes(\"queryables\") && link.type === \"application/schema+json\");\n queryablesHref = queryablesLink.href;\n\n }\n\n if (itemsHref)\n this._itemsUrl = itemsHref;\n else {\n const msg = \"Unable to find items link on collection\";\n Logger.logError(loggerCategory, msg);\n throw new Error(msg);\n }\n if (queryablesHref)\n this._queryables = await this.fetchMetadata(queryablesHref);\n\n if (!this._forceTileMode) {\n const status = await this.fetchAllItems();\n if (status) {\n await this.indexStaticData();\n }\n }\n\n await this._defaultSymbol.initialize(); // images must be loaded upfront\n }\n\n private async fetchMetadata(url: string): Promise<any> {\n const tmpUrl = this.appendCustomParams(url);\n const response = await this.makeRequest(tmpUrl);\n return response.json();\n }\n\n private async fetchAllItems() {\n const urlObj = new URL(this._itemsUrl);\n urlObj.searchParams.append(\"limit\", `${this._limitParamMaxValue}`);\n const url = this.appendCustomParams(urlObj.toString());\n this._staticData = await this.fetchItems(url, this._staticModeFetchTimeout);\n return this._staticData ? true : false;\n }\n\n private async fetchItems(url: string, timeout: number) {\n let data: any;\n let success = true;\n try {\n const fetchBegin = Date.now();\n let tmpUrl = this.appendCustomParams(url);\n let response = await this.makeTileRequest(tmpUrl, timeout);\n let json = await response.json();\n data = json;\n // Follow \"next\" link if any\n let nextLink = json.links?.find((link: any)=>link.rel === \"next\");\n while (nextLink && (Date.now() - fetchBegin) < timeout && success) {\n tmpUrl = this.appendCustomParams(nextLink.href);\n response = await this.makeTileRequest(tmpUrl, this._staticModeFetchTimeout);\n json = await response.json();\n if (json?.features)\n data!.features = this._staticData?.features ? [...this._staticData.features, ...json.features] : json.features;\n else\n success = false;\n nextLink = json.links?.find((link: any)=>link.rel === \"next\");\n }\n if (Date.now() - fetchBegin >= this._staticModeFetchTimeout) {\n // We ran out of time, let switch to tile mode\n success = false;\n }\n } catch (e) {\n success = false;\n if (e instanceof DOMException && e.name === \"AbortError\") {\n Logger.logInfo(loggerCategory, \"Request to fetch all features time out, switching to tile mode.\");\n } else {\n Logger.logError(loggerCategory, \"Unknown error occurred when fetching OgcApiFeatures data.\");\n }\n }\n return success ? data : undefined;\n }\n\n // Read features range and build in-memory spatial index\n private async indexStaticData() {\n // UGLY IMPORT:\n // flatbush only provides ECM modules, and since mocha is not very good with ECM modules,\n // we need to have this special import, until we replace mocha with something else.\n const flatbush = (await import(\"flatbush\")).default;\n let success = true;\n try {\n const datasetRange = new Range2d();\n const buildPositionRange = (coords: Geojson.Position, range: Range2d) => range.extendXY(coords[0], coords[1]);\n const buildPositionArrayRange = (coords: Geojson.Position[], range: Range2d) => coords.forEach((position) => buildPositionRange(position, range) );\n const buildDoublePositionRange = (coords: Geojson.Position[][], range: Range2d) => coords.forEach((position) => buildPositionArrayRange(position, range) );\n const buildTriplePositionRange = (coords: Geojson.Position[][][], range: Range2d) => coords.forEach((position) => buildDoublePositionRange(position, range) );\n\n const readGeomRange = (geom: Geojson.Geometry, range: Range2d) => {\n if (geom.type === \"Point\")\n buildPositionRange(geom.coordinates, range);\n else if (geom.type === \"LineString\" || geom.type === \"MultiPoint\")\n buildPositionArrayRange(geom.coordinates, range);\n else if (geom.type === \"Polygon\" || geom.type === \"MultiLineString\")\n buildDoublePositionRange(geom.coordinates, range);\n else if (geom.type === \"MultiPolygon\" )\n buildTriplePositionRange(geom.coordinates, range);\n };\n\n if (this._staticData && Array.isArray(this._staticData.features)) {\n this._spatialIdx = new flatbush(this._staticData.features.length);\n this._staticData.features.forEach((feature: Geojson.Feature) => {\n try {\n if (feature.geometry.type === \"LineString\"\n || feature.geometry.type === \"MultiLineString\"\n || feature.geometry.type === \"Point\"\n || feature.geometry.type === \"MultiPoint\"\n || feature.geometry.type === \"Polygon\"\n || feature.geometry.type === \"MultiPolygon\"\n ) {\n readGeomRange(feature.geometry, datasetRange);\n this._spatialIdx?.add(datasetRange.xLow, datasetRange.yLow, datasetRange.xHigh,datasetRange. yHigh);\n datasetRange.setNull();\n } else if (feature.geometry.type === \"GeometryCollection\") {\n feature.geometry.geometries.forEach((geom) => {\n readGeomRange(geom, datasetRange);\n this._spatialIdx?.add(datasetRange.xLow, datasetRange.yLow, datasetRange.xHigh,datasetRange. yHigh);\n });\n datasetRange.setNull();\n }\n } catch (e: any) {\n Logger.logInfo(loggerCategory, `Unknown error occurred indexing feature: ${e.message}`);\n success = false;\n }\n });\n\n if (success) {\n this._spatialIdx.finish();\n }\n }\n\n } catch {\n Logger.logError(loggerCategory, \"Unknown error occurred when index static data\");\n success = false;\n }\n return success;\n }\n\n public override get tileSize(): number { return 512; }\n\n // We don't use this method inside this provider (see constructFeatureUrl), but since this is an abstract method, we need to define something\n public async constructUrl(_row: number, _column: number, _zoomLevel: number): Promise<string> {\n return \"\";\n }\n\n public drawTileDebugInfo(row: number, column: number, zoomLevel: number, context: CanvasRenderingContext2D) {\n context.fillStyle = \"cyan\";\n context.strokeRect(0, 0, this.tileSize, this.tileSize);\n context.font = \"30px Arial\";\n context.lineWidth = 5;\n context.fillText(`${zoomLevel}-${row}-${column}`, 10, 50);\n }\n\n // Compute transform that provides coordinates in the canvas coordinate system (pixels, origin = top-left)\n // from coordinate in world\n public computeTileWorld2CanvasTransform(row: number, column: number, zoomLevel: number) {\n\n const tileExtentWorld4326 = this.getEPSG4326Extent(row, column, zoomLevel);\n const worldTileWidth = tileExtentWorld4326.longitudeRight - tileExtentWorld4326.longitudeLeft;\n const worldTileHeight = tileExtentWorld4326.latitudeTop - tileExtentWorld4326.latitudeBottom;\n const canvasTileWidth = this.tileSize;\n const canvasTileHeight = this.tileSize;\n const world2CanvasRatioX = canvasTileWidth / worldTileWidth;\n const world2CanvasRatioY = canvasTileHeight / worldTileHeight;\n const worldTileOrigin = Point3d.create(tileExtentWorld4326.longitudeLeft, tileExtentWorld4326.latitudeBottom);\n const worldTileExtent = Point3d.create(tileExtentWorld4326.longitudeRight, tileExtentWorld4326.latitudeTop);\n const canvasTileOriginOffset = worldTileOrigin.clone();\n const canvasTileExtentOffset = worldTileExtent.clone();\n canvasTileOriginOffset.x *= world2CanvasRatioX;\n canvasTileOriginOffset.y *= world2CanvasRatioY;\n canvasTileExtentOffset.x *= world2CanvasRatioX;\n canvasTileExtentOffset.y *= world2CanvasRatioY;\n const xTranslate = -1 * canvasTileOriginOffset.x;\n\n // Canvas origin is upper left corner, so we need to flip the y axis\n const yTranslate = canvasTileExtentOffset.y; // y-axis flip\n const yWorld2CanvasRatio = -1 * world2CanvasRatioY; // y-axis flip\n\n const matrix = Matrix4d.createTranslationAndScaleXYZ(xTranslate, yTranslate, 0, world2CanvasRatioX, yWorld2CanvasRatio, 1);\n return matrix.asTransform;\n }\n\n public override async loadTile(row: number, column: number, zoomLevel: number): Promise<ImageSource | undefined> {\n\n const extent4326 = this.getEPSG4326Extent(row, column, zoomLevel);\n\n let data: any;\n if (this.staticMode) {\n // Static data mode\n const filteredData: Geojson.FeatureCollection = {type: \"FeatureCollection\", features: []};\n\n this._spatialIdx?.search(extent4326.longitudeLeft, extent4326.latitudeBottom, extent4326.longitudeRight, extent4326.latitudeTop,\n (index: number) => {\n filteredData.features.push(this._staticData!.features[index]);\n return true;\n });\n\n data = filteredData;\n } else {\n // Tiled data mode\n const extent4326Str = this.getEPSG4326TileExtentString(row, column, zoomLevel, false);\n const urlObj = new URL(this._itemsUrl);\n urlObj.searchParams.append(\"bbox\", `${extent4326Str}`);\n urlObj.searchParams.append(\"bbox-crs\", this._itemsCrs);\n urlObj.searchParams.append(\"limit\", `${this._limitParamMaxValue}`);\n const url = this.appendCustomParams(urlObj.toString());\n\n try {\n data = await this.fetchItems(url, this._tileModeFetchTimeout);\n } catch {\n }\n if (!data) {\n Logger.logError(loggerCategory, \"Could not fetch OgcApiFeatures data.\");\n }\n }\n\n if (!data || !Array.isArray(data.features) || data.features.length === 0) {\n Logger.logInfo(loggerCategory, `No data to render for tile (${zoomLevel}/${row}/${column}).`);\n }\n\n // Rendering starts here\n const canvas = document.createElement(\"canvas\");\n canvas.width = this.tileSize;\n canvas.height = this.tileSize;\n const ctx = canvas.getContext(\"2d\");\n if (ctx == null) {\n Logger.logError(loggerCategory, \"No canvas context available for loading tile.\");\n return undefined;\n }\n\n try {\n // Compute transform if CoordinatesQuantization is not supported by service\n const transfo = this.computeTileWorld2CanvasTransform(row, column, zoomLevel);\n if (!transfo) {\n Logger.logError(loggerCategory, `Could not compute data transformation for tile (${zoomLevel}/${row}/${column})`);\n }\n\n // Create the renderer\n\n // Instead of passing a Transform oject to the render, it should be possible\n // instead to set the Transform directly on the Canvas, when I tried the display was incorrect, floating point issue?\n // const transfoRow = transfo!.toRows();\n // ctx.setTransform(transfoRow[0][0], transfoRow[1][0], transfoRow[0][1], transfoRow[1][1], transfoRow[0][3], transfoRow[1][3]);\n const symbRenderer = ArcGisSymbologyCanvasRenderer.create(this._renderer, this._defaultSymbol);\n const renderer = new FeatureCanvasRenderer(ctx, symbRenderer, transfo);\n\n const featureReader = new OgcApiFeaturesReader();\n\n await featureReader.readAndRender(data, renderer);\n if (this._drawDebugInfo)\n this.drawTileDebugInfo(row, column, zoomLevel, ctx);\n } catch (e) {\n Logger.logError(loggerCategory, `Exception occurred while loading tile (${zoomLevel}/${row}/${column}) : ${e}`);\n }\n\n try {\n return this.createImageSourceFromDataURL(canvas.toDataURL(\"image/png\"), ImageSourceFormat.Png);\n } catch (e) {\n Logger.logError(loggerCategory, `Exception occurred while rendering tile (${zoomLevel}/${row}/${column}) : ${e}.`);\n }\n\n return undefined;\n }\n\n private createImageSourceFromDataURL(dataUrl: string, format: ImageSourceFormat) {\n if (!dataUrl)\n return undefined;\n\n const dataStartPos = dataUrl.indexOf(dataUrlHeaderToken) + dataUrlHeaderToken.length;\n\n if (dataStartPos < 0)\n return undefined;\n\n const base64Png = dataUrl.substring(dataStartPos);\n return new ImageSource(base64StringToUint8Array(base64Png), format);\n }\n\n public override async getFeatureInfo(featureInfos: MapLayerFeatureInfo[], quadId: QuadId, carto: Cartographic, _tree: ImageryMapTileTree, hit: HitDetail, options?: MapFeatureInfoOptions): Promise<void> {\n const tileExtent = this.getEPSG4326Extent(quadId.row, quadId.column, quadId.level);\n const tilePixelSizeX = (tileExtent.longitudeRight - tileExtent.longitudeLeft) / this.tileSize;\n const tilePixelSizeY = (tileExtent.latitudeTop - tileExtent.latitudeBottom) / this.tileSize;\n const tolerancePixel = options?.tolerance ?? 7;\n const toleranceWorldX = tilePixelSizeX * tolerancePixel;\n const toleranceWorldY = tilePixelSizeY * tolerancePixel;\n\n // Note: We used to pass a single point as the query 'geometry' and leverage the 'distance' parameter, turns\n // out that approach was a lot slower on some server compared to using a single envelope.\n const bbox: WGS84Extent = {\n longitudeLeft: carto.longitudeDegrees - toleranceWorldX, latitudeBottom: carto.latitudeDegrees - toleranceWorldY,\n longitudeRight: carto.longitudeDegrees + toleranceWorldX, latitudeTop: carto.latitudeDegrees + toleranceWorldY,\n };\n\n const bboxStr = this.getEPSG4326ExtentString(bbox, false);\n const urlObj = new URL(this._itemsUrl);\n urlObj.searchParams.append(\"bbox\", `${bboxStr}`);\n urlObj.searchParams.append(\"bbox-crs\", this._itemsCrs);\n urlObj.searchParams.append(\"limit\", `${this._limitParamMaxValue}`);\n const url = this.appendCustomParams(urlObj.toString());\n\n let data: any;\n try {\n data = await this.fetchItems(url, this._tileModeFetchTimeout);\n } catch {\n }\n if (!data) {\n Logger.logError(loggerCategory, \"Could not fetch OgcApiFeatures data.\");\n }\n\n const featureReader = new OgcApiFeaturesReader();\n await featureReader.readFeatureInfo({\n collection:data,\n layerSettings: this._settings,\n queryables: this._queryables,\n geomRenderer: new FeatureGraphicsRenderer({viewport: hit.viewport, crs: \"wgs84\"})},\n featureInfos );\n }\n}\n\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OgcApiFeaturesReader.js","sourceRoot":"","sources":["../../../src/OgcApiFeatures/OgcApiFeaturesReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { PrimitiveValue, PropertyValueFormat, StandardTypeNames } from \"@itwin/appui-abstract\";\r\nimport { ImageMapLayerSettings } from \"@itwin/core-common\";\r\nimport { FeatureAttributeDrivenSymbology, FeatureGeometryRenderer, GraphicPrimitive, GraphicsGeometryRenderer, MapLayerFeature, MapLayerFeatureAttribute, MapLayerFeatureInfo, MapSubLayerFeatureInfo } from \"@itwin/core-frontend\";\r\nimport { Transform } from \"@itwin/core-geometry\";\r\nimport Geojson from \"geojson\";\r\nimport { FeatureInfoReader } from \"../Feature/FeatureInfoReader.js\";\r\nimport { GeoJSONGeometryReader } from \"../GeoJSON/GeoJSONGeometryReader.js\";\r\n\r\n/** @internal */\r\nexport type OgcFeaturePropertyType = \"string\" | \"number\" | \"integer\" | \"datetime\" | \"geometry\" | \"boolean\";\r\n\r\n/** @internal */\r\nexport interface ReadOgcApiFeaturesInfoOptions {\r\n collection: Geojson.FeatureCollection;\r\n layerSettings: ImageMapLayerSettings;\r\n queryables?: any;\r\n geomRenderer?: GraphicsGeometryRenderer;\r\n}\r\n\r\n/** @internal */\r\nexport class OgcApiFeaturesReader extends FeatureInfoReader {\r\n public transform: Transform | undefined;\r\n\r\n public constructor() {\r\n super();\r\n }\r\n\r\n private applySymbologyAttributes(attrSymbology: FeatureAttributeDrivenSymbology, feature: any) {\r\n if (attrSymbology && feature) {\r\n const symbolFields = attrSymbology.rendererFields;\r\n if (symbolFields && symbolFields.length > 0 && feature.properties) {\r\n const featureAttr: {[key: string]: any} = {};\r\n for (const [attrKey, attrValue] of Object.entries(feature.properties))\r\n if (symbolFields.includes(attrKey)) {\r\n featureAttr[attrKey] = attrValue;\r\n }\r\n attrSymbology.setActiveFeatureAttributes(featureAttr);\r\n }\r\n }\r\n }\r\n\r\n public async readAndRender(data: Geojson.FeatureCollection, renderer: FeatureGeometryRenderer) {\r\n const responseObj = data;\r\n if (responseObj.type === \"FeatureCollection\") {\r\n\r\n const geomReader = new GeoJSONGeometryReader(renderer);\r\n\r\n for (const feature of responseObj.features) {\r\n // Each feature has potentially a different geometry type, so we need to inform the geometry renderer\r\n if (renderer.hasSymbologyRenderer()) {\r\n renderer.symbolRenderer.activeGeometryType = feature.geometry.type;\r\n // Read attributes if needed (attribute driven symbology)\r\n if (renderer.symbolRenderer.isAttributeDriven()) {\r\n this.applySymbologyAttributes(renderer.symbolRenderer, feature);\r\n }\r\n }\r\n\r\n await geomReader.readGeometry(feature.geometry);\r\n }\r\n }\r\n }\r\n\r\n public async readFeatureInfo(opts: ReadOgcApiFeaturesInfoOptions, featureInfos: MapLayerFeatureInfo[]) {\r\n if (!Array.isArray(opts.collection.features))\r\n return;\r\n\r\n const layerInfo: MapLayerFeatureInfo = { layerName: opts.layerSettings.name };\r\n\r\n // Create a signature index for every field name / type.\r\n let fieldsType: { [key: string]: OgcFeaturePropertyType } | undefined;\r\n if (Array.isArray(opts.queryables?.properties)) {\r\n fieldsType = {};\r\n for (const fieldInfo of opts.queryables) {\r\n fieldsType[fieldInfo.name] = fieldInfo.type;\r\n }\r\n }\r\n\r\n const getStandardTypeName = (fieldType: OgcFeaturePropertyType) => {\r\n switch (fieldType) {\r\n case \"number\":\r\n return StandardTypeNames.Double;\r\n case \"integer\":\r\n return StandardTypeNames.Integer;\r\n case \"boolean\":\r\n return StandardTypeNames.Boolean;\r\n case \"datetime\":\r\n return StandardTypeNames.DateTime;\r\n default:\r\n return StandardTypeNames.String;\r\n }\r\n };\r\n\r\n const getRecordInfo = (fieldName: string, value: any): MapLayerFeatureAttribute => {\r\n let typename = StandardTypeNames.String;\r\n const propertyValue: PrimitiveValue = {valueFormat: PropertyValueFormat.Primitive};\r\n\r\n if (value === null) {\r\n value = undefined;\r\n }\r\n\r\n const strValue = `${value}`;\r\n if (fieldsType) {\r\n const fieldType = fieldsType[fieldName];\r\n switch (fieldType) {\r\n case \"integer\":\r\n propertyValue.value = value as number;\r\n break;\r\n case \"number\":\r\n propertyValue.value = this.toFixedWithoutPadding(value);\r\n break;\r\n case \"datetime\":\r\n propertyValue.value = new Date(value);\r\n break;\r\n default:\r\n if (value !== undefined)\r\n propertyValue.value = strValue;\r\n break;\r\n }\r\n typename = getStandardTypeName(fieldType);\r\n propertyValue.displayValue = this.getDisplayValue(typename, propertyValue.value);\r\n } else {\r\n // Queryables are optional with OGC Features, in this case everything is string.\r\n propertyValue.value = strValue;\r\n propertyValue.displayValue = strValue;\r\n }\r\n\r\n return {value: propertyValue, property: { name: fieldName, displayLabel: fieldName, typename }};\r\n };\r\n\r\n let geomReader: GeoJSONGeometryReader|undefined;\r\n if (opts.geomRenderer) {\r\n geomReader = new GeoJSONGeometryReader(opts.geomRenderer);\r\n }\r\n\r\n // Each feature response represent a single sub-layer, no need to check for existing entry.\r\n const subLayerInfo: MapSubLayerFeatureInfo = {\r\n subLayerName: opts.layerSettings.name,\r\n displayFieldName: opts.layerSettings.name,\r\n features: [],\r\n };\r\n\r\n // Read all features attributes / geometries\r\n for (const responseFeature of opts.collection.features) {\r\n const feature: MapLayerFeature = {attributes: []};\r\n\r\n if (responseFeature.properties) {\r\n for (const [key, value] of Object.entries(responseFeature.properties))\r\n feature.attributes?.push(getRecordInfo(key, value));\r\n }\r\n\r\n if (geomReader && opts.geomRenderer) {\r\n await geomReader.readGeometry(responseFeature.geometry as any);\r\n const graphics = opts.geomRenderer.moveGraphics();\r\n feature.geometries = graphics.map((graphic: GraphicPrimitive) => {\r\n return {graphic};\r\n });\r\n }\r\n subLayerInfo.features.push(feature);\r\n }\r\n\r\n if (layerInfo.subLayerInfos === undefined)\r\n layerInfo.subLayerInfos = [];\r\n layerInfo.subLayerInfos.push(subLayerInfo);\r\n\r\n featureInfos.push(layerInfo);\r\n }\r\n\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"OgcApiFeaturesReader.js","sourceRoot":"","sources":["../../../src/OgcApiFeatures/OgcApiFeaturesReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { PrimitiveValue, PropertyValueFormat, StandardTypeNames } from \"@itwin/appui-abstract\";\nimport { ImageMapLayerSettings } from \"@itwin/core-common\";\nimport { FeatureAttributeDrivenSymbology, FeatureGeometryRenderer, GraphicPrimitive, GraphicsGeometryRenderer, MapLayerFeature, MapLayerFeatureAttribute, MapLayerFeatureInfo, MapSubLayerFeatureInfo } from \"@itwin/core-frontend\";\nimport { Transform } from \"@itwin/core-geometry\";\nimport Geojson from \"geojson\";\nimport { FeatureInfoReader } from \"../Feature/FeatureInfoReader.js\";\nimport { GeoJSONGeometryReader } from \"../GeoJSON/GeoJSONGeometryReader.js\";\n\n/** @internal */\nexport type OgcFeaturePropertyType = \"string\" | \"number\" | \"integer\" | \"datetime\" | \"geometry\" | \"boolean\";\n\n/** @internal */\nexport interface ReadOgcApiFeaturesInfoOptions {\n collection: Geojson.FeatureCollection;\n layerSettings: ImageMapLayerSettings;\n queryables?: any;\n geomRenderer?: GraphicsGeometryRenderer;\n}\n\n/** @internal */\nexport class OgcApiFeaturesReader extends FeatureInfoReader {\n public transform: Transform | undefined;\n\n public constructor() {\n super();\n }\n\n private applySymbologyAttributes(attrSymbology: FeatureAttributeDrivenSymbology, feature: any) {\n if (attrSymbology && feature) {\n const symbolFields = attrSymbology.rendererFields;\n if (symbolFields && symbolFields.length > 0 && feature.properties) {\n const featureAttr: {[key: string]: any} = {};\n for (const [attrKey, attrValue] of Object.entries(feature.properties))\n if (symbolFields.includes(attrKey)) {\n featureAttr[attrKey] = attrValue;\n }\n attrSymbology.setActiveFeatureAttributes(featureAttr);\n }\n }\n }\n\n public async readAndRender(data: Geojson.FeatureCollection, renderer: FeatureGeometryRenderer) {\n const responseObj = data;\n if (responseObj.type === \"FeatureCollection\") {\n\n const geomReader = new GeoJSONGeometryReader(renderer);\n\n for (const feature of responseObj.features) {\n // Each feature has potentially a different geometry type, so we need to inform the geometry renderer\n if (renderer.hasSymbologyRenderer()) {\n renderer.symbolRenderer.activeGeometryType = feature.geometry.type;\n // Read attributes if needed (attribute driven symbology)\n if (renderer.symbolRenderer.isAttributeDriven()) {\n this.applySymbologyAttributes(renderer.symbolRenderer, feature);\n }\n }\n\n await geomReader.readGeometry(feature.geometry);\n }\n }\n }\n\n public async readFeatureInfo(opts: ReadOgcApiFeaturesInfoOptions, featureInfos: MapLayerFeatureInfo[]) {\n if (!Array.isArray(opts.collection.features))\n return;\n\n const layerInfo: MapLayerFeatureInfo = { layerName: opts.layerSettings.name };\n\n // Create a signature index for every field name / type.\n let fieldsType: { [key: string]: OgcFeaturePropertyType } | undefined;\n if (Array.isArray(opts.queryables?.properties)) {\n fieldsType = {};\n for (const fieldInfo of opts.queryables) {\n fieldsType[fieldInfo.name] = fieldInfo.type;\n }\n }\n\n const getStandardTypeName = (fieldType: OgcFeaturePropertyType) => {\n switch (fieldType) {\n case \"number\":\n return StandardTypeNames.Double;\n case \"integer\":\n return StandardTypeNames.Integer;\n case \"boolean\":\n return StandardTypeNames.Boolean;\n case \"datetime\":\n return StandardTypeNames.DateTime;\n default:\n return StandardTypeNames.String;\n }\n };\n\n const getRecordInfo = (fieldName: string, value: any): MapLayerFeatureAttribute => {\n let typename = StandardTypeNames.String;\n const propertyValue: PrimitiveValue = {valueFormat: PropertyValueFormat.Primitive};\n\n if (value === null) {\n value = undefined;\n }\n\n const strValue = `${value}`;\n if (fieldsType) {\n const fieldType = fieldsType[fieldName];\n switch (fieldType) {\n case \"integer\":\n propertyValue.value = value as number;\n break;\n case \"number\":\n propertyValue.value = this.toFixedWithoutPadding(value);\n break;\n case \"datetime\":\n propertyValue.value = new Date(value);\n break;\n default:\n if (value !== undefined)\n propertyValue.value = strValue;\n break;\n }\n typename = getStandardTypeName(fieldType);\n propertyValue.displayValue = this.getDisplayValue(typename, propertyValue.value);\n } else {\n // Queryables are optional with OGC Features, in this case everything is string.\n propertyValue.value = strValue;\n propertyValue.displayValue = strValue;\n }\n\n return {value: propertyValue, property: { name: fieldName, displayLabel: fieldName, typename }};\n };\n\n let geomReader: GeoJSONGeometryReader|undefined;\n if (opts.geomRenderer) {\n geomReader = new GeoJSONGeometryReader(opts.geomRenderer);\n }\n\n // Each feature response represent a single sub-layer, no need to check for existing entry.\n const subLayerInfo: MapSubLayerFeatureInfo = {\n subLayerName: opts.layerSettings.name,\n displayFieldName: opts.layerSettings.name,\n features: [],\n };\n\n // Read all features attributes / geometries\n for (const responseFeature of opts.collection.features) {\n const feature: MapLayerFeature = {attributes: []};\n\n if (responseFeature.properties) {\n for (const [key, value] of Object.entries(responseFeature.properties))\n feature.attributes?.push(getRecordInfo(key, value));\n }\n\n if (geomReader && opts.geomRenderer) {\n await geomReader.readGeometry(responseFeature.geometry as any);\n const graphics = opts.geomRenderer.moveGraphics();\n feature.geometries = graphics.map((graphic: GraphicPrimitive) => {\n return {graphic};\n });\n }\n subLayerInfo.features.push(feature);\n }\n\n if (layerInfo.subLayerInfos === undefined)\n layerInfo.subLayerInfos = [];\n layerInfo.subLayerInfos.push(subLayerInfo);\n\n featureInfos.push(layerInfo);\n }\n\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeometryTerrainDraper.js","sourceRoot":"","sources":["../../../src/Tools/GeometryTerrainDraper.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Logger } from \"@itwin/core-bentley\";\r\nimport {\r\n CollectTileStatus, DisclosedTileTreeSet,\r\n GeometryTileTreeReference, IModelApp,\r\n Tile, TileGeometryCollector, TileUser, Viewport\r\n} from \"@itwin/core-frontend\";\r\nimport { Angle, ConvexClipPlaneSet, CurvePrimitive, GrowableXYZArray, IndexedPolyface, IndexedPolyfaceSubsetVisitor, Loop, Point3d, Polyface, PolyfaceClip, PolyfaceQuery, PolygonOps, Range3d, Ray3d, SweepLineStringToFacetsOptions, Transform, Vector3d } from \"@itwin/core-geometry\";\r\n\r\nconst loggerCategory = \"MapLayersFormats.GeometryTerrainDraper\";\r\n\r\n/** A TileGeometryCollector that restricts collection to tiles that overlap a line string.\r\n/* @internal\r\n*/\r\nclass LineSegmentCollector extends TileGeometryCollector {\r\n private _points: GrowableXYZArray;\r\n\r\n constructor(user: TileUser, chordTolerance: number, range: Range3d, transform: Transform, points: GrowableXYZArray) {\r\n super({ user, chordTolerance, range, transform });\r\n this._points = points;\r\n }\r\n\r\n public override addMissingTile(tile: Tile): void {\r\n Logger.logTrace(loggerCategory, `CollectorAdd missing tile: ${tile.contentId}`);\r\n super.addMissingTile(tile);\r\n }\r\n\r\n public override collectTile(tile: Tile): CollectTileStatus {\r\n let status = super.collectTile(tile);\r\n\r\n if (\"reject\" !== status && !this.rangeOverlapsLineString(tile.range)) {\r\n status = \"reject\";\r\n }\r\n\r\n Logger.logTrace(loggerCategory, `collectTile - tile: ${tile.contentId} status: ${status} isReady: ${tile.isReady} status:${tile.loadStatus}`);\r\n return status;\r\n }\r\n\r\n private rangeOverlapsLineString(range: Range3d) {\r\n let inside = false;\r\n const clipper = ConvexClipPlaneSet.createRange3dPlanes(range, true, true, true, true, false, false);\r\n if (this._options.transform)\r\n clipper.transformInPlace(this._options.transform);\r\n\r\n for (let i = 0; i < this._points.length - 1 && !inside; i++)\r\n inside = clipper.announceClippedSegmentIntervals(0, 1, this._points.getPoint3dAtUncheckedPointIndex(i), this._points.getPoint3dAtUncheckedPointIndex(i + 1));\r\n\r\n return inside;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class GeometryTerrainDraper implements TileUser {\r\n // The side angle measures how close the sweep vector is from being parallel to a side face.\r\n // The larger the angle, the more nearly vertical facets are ignored.\r\n // This is an \"empirical\" value that was determined by looking at \"problematic\" polyfaces\r\n public readonly sideAngle = Angle.createDegrees(0.06);\r\n\r\n public readonly maxDistanceZ = 1.0E5; // Expand the Z Range, but not so much that we get opposite side of globe.\r\n public readonly tileUserId: number;\r\n\r\n public constructor(public readonly viewport: Viewport, public readonly treeRef: GeometryTileTreeReference) {\r\n this.tileUserId = TileUser.generateId();\r\n IModelApp.tileAdmin.registerUser(this);\r\n }\r\n\r\n public [Symbol.dispose](): void {\r\n IModelApp.tileAdmin.forgetUser(this);\r\n }\r\n\r\n public get iModel() { return this.viewport.iModel; }\r\n\r\n public onRequestStateChanged() {\r\n this.viewport.invalidateDecorations();\r\n }\r\n\r\n public discloseTileTrees(trees: DisclosedTileTreeSet) {\r\n trees.disclose(this.treeRef);\r\n }\r\n\r\n // Filter out non-top facets:\r\n // For unknown reasons, there are \"perpendicular\" facets appearing in the terrain meshes.\r\n public getMeshTopFacets(mesh: IndexedPolyface) {\r\n // constant inputs\r\n const sweepVector = Vector3d.unitZ();\r\n // i.e., region is horizontal\r\n // create subset visitor from the top facets\r\n const topFacets: number[] = [];\r\n const facetNormal = Vector3d.createZero();\r\n\r\n for (const visitor = mesh.createVisitor(0); visitor.moveToNextFacet();) {\r\n if (PolygonOps.unitNormal(visitor.point, facetNormal)) {\r\n const theta = facetNormal.angleFromPerpendicular(sweepVector);\r\n if (!theta.isMagnitudeLessThanOrEqual(this.sideAngle)) { // skip side facet\r\n if (facetNormal.dotProduct(sweepVector) > 0) // this is a top facet\r\n topFacets.push(visitor.currentReadIndex());\r\n }\r\n }\r\n }\r\n\r\n return IndexedPolyfaceSubsetVisitor.createSubsetVisitor(mesh, topFacets, 0);\r\n }\r\n\r\n public drapeLineString(outStrings: CurvePrimitive[], inPoints: GrowableXYZArray, tolerance: number, range: Range3d): \"loading\" | \"complete\" {\r\n const tree = this.treeRef.treeOwner.load();\r\n if (!tree)\r\n return \"loading\";\r\n\r\n const expandedRange = Range3d.createFrom(range);\r\n expandedRange.extendZOnly(-this.maxDistanceZ);\r\n expandedRange.extendZOnly(this.maxDistanceZ);\r\n\r\n const collector = new LineSegmentCollector(this, tolerance, expandedRange, tree.iModelTransform, inPoints);\r\n this.treeRef.collectTileGeometry(collector);\r\n collector.requestMissingTiles();\r\n\r\n if (collector.isAllGeometryLoaded && collector.polyfaces.length > 0) {\r\n\r\n for (const polyface of collector.polyfaces) {\r\n // Use this to serialize (problematic) polyface\r\n // console.log (`const polyface = ${JSON.stringify(IModelJson.Writer.toIModelJson(polyface))}`);\r\n outStrings.push(...PolyfaceQuery.sweepLineStringToFacets(\r\n inPoints,\r\n polyface,\r\n SweepLineStringToFacetsOptions.create(Vector3d.unitZ(), this.sideAngle, true, true, false, false)));\r\n }\r\n\r\n return \"complete\";\r\n }\r\n\r\n return \"loading\";\r\n }\r\n\r\n public drapeLoop(outMeshes: Polyface[], loop: Loop, tolerance: number, range: Range3d): \"loading\" | \"complete\" {\r\n const tree = this.treeRef.treeOwner.load();\r\n if (!tree)\r\n return \"loading\";\r\n\r\n const expandedRange = Range3d.createFrom(range);\r\n expandedRange.extendZOnly(-this.maxDistanceZ);\r\n expandedRange.extendZOnly(this.maxDistanceZ);\r\n\r\n const strokes = loop.getPackedStrokes();\r\n if (!strokes)\r\n return \"complete\";\r\n\r\n const collector = new LineSegmentCollector(this, tolerance, expandedRange, tree.iModelTransform, strokes);\r\n this.treeRef.collectTileGeometry(collector);\r\n collector.requestMissingTiles();\r\n\r\n if (collector.isAllGeometryLoaded && collector.polyfaces.length > 0) {\r\n for (const polyface of collector.polyfaces) {\r\n const topFacets = this.getMeshTopFacets(polyface);\r\n const mesh = PolyfaceClip.drapeRegion(topFacets, loop);\r\n if (mesh)\r\n outMeshes.push(mesh);\r\n }\r\n return \"complete\";\r\n }\r\n return \"loading\";\r\n }\r\n public drapePoint(outPoint: Point3d, point: Point3d, chordTolerance: number, range: Range3d): \"loading\" | \"complete\" {\r\n const tree = this.treeRef.treeOwner.load();\r\n if (!tree)\r\n return \"loading\";\r\n\r\n const expandedRange = Range3d.createFrom(range);\r\n expandedRange.extendZOnly(-this.maxDistanceZ);\r\n expandedRange.extendZOnly(this.maxDistanceZ);\r\n\r\n const collector = new TileGeometryCollector({ chordTolerance, range: expandedRange, user: this });\r\n this.treeRef.collectTileGeometry(collector);\r\n collector.requestMissingTiles();\r\n\r\n if (collector.isAllGeometryLoaded && collector.polyfaces.length > 0) {\r\n for (const polyface of collector.polyfaces) {\r\n // Im assuming a single polyface here since we are draping a single point\r\n const facetLocation = PolyfaceQuery.intersectRay3d(polyface, Ray3d.create(point, Vector3d.unitZ()));\r\n if (!facetLocation)\r\n continue;\r\n outPoint.setFromPoint3d(facetLocation.point);\r\n }\r\n return \"complete\";\r\n }\r\n return \"loading\";\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"GeometryTerrainDraper.js","sourceRoot":"","sources":["../../../src/Tools/GeometryTerrainDraper.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { Logger } from \"@itwin/core-bentley\";\nimport {\n CollectTileStatus, DisclosedTileTreeSet,\n GeometryTileTreeReference, IModelApp,\n Tile, TileGeometryCollector, TileUser, Viewport\n} from \"@itwin/core-frontend\";\nimport { Angle, ConvexClipPlaneSet, CurvePrimitive, GrowableXYZArray, IndexedPolyface, IndexedPolyfaceSubsetVisitor, Loop, Point3d, Polyface, PolyfaceClip, PolyfaceQuery, PolygonOps, Range3d, Ray3d, SweepLineStringToFacetsOptions, Transform, Vector3d } from \"@itwin/core-geometry\";\n\nconst loggerCategory = \"MapLayersFormats.GeometryTerrainDraper\";\n\n/** A TileGeometryCollector that restricts collection to tiles that overlap a line string.\n/* @internal\n*/\nclass LineSegmentCollector extends TileGeometryCollector {\n private _points: GrowableXYZArray;\n\n constructor(user: TileUser, chordTolerance: number, range: Range3d, transform: Transform, points: GrowableXYZArray) {\n super({ user, chordTolerance, range, transform });\n this._points = points;\n }\n\n public override addMissingTile(tile: Tile): void {\n Logger.logTrace(loggerCategory, `CollectorAdd missing tile: ${tile.contentId}`);\n super.addMissingTile(tile);\n }\n\n public override collectTile(tile: Tile): CollectTileStatus {\n let status = super.collectTile(tile);\n\n if (\"reject\" !== status && !this.rangeOverlapsLineString(tile.range)) {\n status = \"reject\";\n }\n\n Logger.logTrace(loggerCategory, `collectTile - tile: ${tile.contentId} status: ${status} isReady: ${tile.isReady} status:${tile.loadStatus}`);\n return status;\n }\n\n private rangeOverlapsLineString(range: Range3d) {\n let inside = false;\n const clipper = ConvexClipPlaneSet.createRange3dPlanes(range, true, true, true, true, false, false);\n if (this._options.transform)\n clipper.transformInPlace(this._options.transform);\n\n for (let i = 0; i < this._points.length - 1 && !inside; i++)\n inside = clipper.announceClippedSegmentIntervals(0, 1, this._points.getPoint3dAtUncheckedPointIndex(i), this._points.getPoint3dAtUncheckedPointIndex(i + 1));\n\n return inside;\n }\n}\n\n/** @internal */\nexport class GeometryTerrainDraper implements TileUser {\n // The side angle measures how close the sweep vector is from being parallel to a side face.\n // The larger the angle, the more nearly vertical facets are ignored.\n // This is an \"empirical\" value that was determined by looking at \"problematic\" polyfaces\n public readonly sideAngle = Angle.createDegrees(0.06);\n\n public readonly maxDistanceZ = 1.0E5; // Expand the Z Range, but not so much that we get opposite side of globe.\n public readonly tileUserId: number;\n\n public constructor(public readonly viewport: Viewport, public readonly treeRef: GeometryTileTreeReference) {\n this.tileUserId = TileUser.generateId();\n IModelApp.tileAdmin.registerUser(this);\n }\n\n public [Symbol.dispose](): void {\n IModelApp.tileAdmin.forgetUser(this);\n }\n\n public get iModel() { return this.viewport.iModel; }\n\n public onRequestStateChanged() {\n this.viewport.invalidateDecorations();\n }\n\n public discloseTileTrees(trees: DisclosedTileTreeSet) {\n trees.disclose(this.treeRef);\n }\n\n // Filter out non-top facets:\n // For unknown reasons, there are \"perpendicular\" facets appearing in the terrain meshes.\n public getMeshTopFacets(mesh: IndexedPolyface) {\n // constant inputs\n const sweepVector = Vector3d.unitZ();\n // i.e., region is horizontal\n // create subset visitor from the top facets\n const topFacets: number[] = [];\n const facetNormal = Vector3d.createZero();\n\n for (const visitor = mesh.createVisitor(0); visitor.moveToNextFacet();) {\n if (PolygonOps.unitNormal(visitor.point, facetNormal)) {\n const theta = facetNormal.angleFromPerpendicular(sweepVector);\n if (!theta.isMagnitudeLessThanOrEqual(this.sideAngle)) { // skip side facet\n if (facetNormal.dotProduct(sweepVector) > 0) // this is a top facet\n topFacets.push(visitor.currentReadIndex());\n }\n }\n }\n\n return IndexedPolyfaceSubsetVisitor.createSubsetVisitor(mesh, topFacets, 0);\n }\n\n public drapeLineString(outStrings: CurvePrimitive[], inPoints: GrowableXYZArray, tolerance: number, range: Range3d): \"loading\" | \"complete\" {\n const tree = this.treeRef.treeOwner.load();\n if (!tree)\n return \"loading\";\n\n const expandedRange = Range3d.createFrom(range);\n expandedRange.extendZOnly(-this.maxDistanceZ);\n expandedRange.extendZOnly(this.maxDistanceZ);\n\n const collector = new LineSegmentCollector(this, tolerance, expandedRange, tree.iModelTransform, inPoints);\n this.treeRef.collectTileGeometry(collector);\n collector.requestMissingTiles();\n\n if (collector.isAllGeometryLoaded && collector.polyfaces.length > 0) {\n\n for (const polyface of collector.polyfaces) {\n // Use this to serialize (problematic) polyface\n // console.log (`const polyface = ${JSON.stringify(IModelJson.Writer.toIModelJson(polyface))}`);\n outStrings.push(...PolyfaceQuery.sweepLineStringToFacets(\n inPoints,\n polyface,\n SweepLineStringToFacetsOptions.create(Vector3d.unitZ(), this.sideAngle, true, true, false, false)));\n }\n\n return \"complete\";\n }\n\n return \"loading\";\n }\n\n public drapeLoop(outMeshes: Polyface[], loop: Loop, tolerance: number, range: Range3d): \"loading\" | \"complete\" {\n const tree = this.treeRef.treeOwner.load();\n if (!tree)\n return \"loading\";\n\n const expandedRange = Range3d.createFrom(range);\n expandedRange.extendZOnly(-this.maxDistanceZ);\n expandedRange.extendZOnly(this.maxDistanceZ);\n\n const strokes = loop.getPackedStrokes();\n if (!strokes)\n return \"complete\";\n\n const collector = new LineSegmentCollector(this, tolerance, expandedRange, tree.iModelTransform, strokes);\n this.treeRef.collectTileGeometry(collector);\n collector.requestMissingTiles();\n\n if (collector.isAllGeometryLoaded && collector.polyfaces.length > 0) {\n for (const polyface of collector.polyfaces) {\n const topFacets = this.getMeshTopFacets(polyface);\n const mesh = PolyfaceClip.drapeRegion(topFacets, loop);\n if (mesh)\n outMeshes.push(mesh);\n }\n return \"complete\";\n }\n return \"loading\";\n }\n public drapePoint(outPoint: Point3d, point: Point3d, chordTolerance: number, range: Range3d): \"loading\" | \"complete\" {\n const tree = this.treeRef.treeOwner.load();\n if (!tree)\n return \"loading\";\n\n const expandedRange = Range3d.createFrom(range);\n expandedRange.extendZOnly(-this.maxDistanceZ);\n expandedRange.extendZOnly(this.maxDistanceZ);\n\n const collector = new TileGeometryCollector({ chordTolerance, range: expandedRange, user: this });\n this.treeRef.collectTileGeometry(collector);\n collector.requestMissingTiles();\n\n if (collector.isAllGeometryLoaded && collector.polyfaces.length > 0) {\n for (const polyface of collector.polyfaces) {\n // Im assuming a single polyface here since we are draping a single point\n const facetLocation = PolyfaceQuery.intersectRay3d(polyface, Ray3d.create(point, Vector3d.unitZ()));\n if (!facetLocation)\n continue;\n outPoint.setFromPoint3d(facetLocation.point);\n }\n return \"complete\";\n }\n return \"loading\";\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MapFeatureInfoDecorator.js","sourceRoot":"","sources":["../../../src/Tools/MapFeatureInfoDecorator.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Logger } from \"@itwin/core-bentley\";\r\nimport { Base64EncodedString, ColorDef } from \"@itwin/core-common\";\r\nimport {\r\n BeButtonEvent, Cluster, DecorateContext, Decorator,\r\n GeometryTileTreeReference, GraphicBuilder, GraphicPrimitive, GraphicType, IModelApp, MapTileTreeReference, Marker, MarkerImage, MarkerSet,\r\n ScreenViewport,\r\n Viewport\r\n} from \"@itwin/core-frontend\";\r\nimport { GrowableXYZArray, LineString3d, Point2d, Point3d, Polyface, Range3d, Transform, XAndY, XYAndZ } from \"@itwin/core-geometry\";\r\nimport { GeometryTerrainDraper } from \"./GeometryTerrainDraper.js\";\r\nimport { MapFeatureInfoToolData } from \"./MapFeatureInfoTool.js\";\r\n\r\nconst loggerCategory = \"MapLayersFormats.MapFeatureInfoDecorator\";\r\n\r\n/** @internal */\r\nclass PinMarker extends Marker {\r\n public constructor(worldLocation: XYAndZ, size: XAndY, image: MarkerImage) {\r\n super(worldLocation, size);\r\n this.image = image;\r\n this.imageOffset = new Point3d(0, Math.floor(size.y * .5));\r\n }\r\n}\r\n\r\n/** @internal */\r\nclass PinMarkerCluster extends Marker {\r\n /** Create a new cluster marker */\r\n constructor(location: XYAndZ, size: XAndY, cluster: Cluster<PinMarker>, image: MarkerImage | Promise<MarkerImage> | undefined) {\r\n super(location, size);\r\n\r\n this.title = IModelApp.localization.getLocalizedString(\"mapLayersFormats:Messages.MapFeatureInfoDecorator.clusterZoomIn\", { nbInstances: cluster.markers.length});\r\n\r\n this.imageOffset = new Point3d(0, size.y * 0.5);\r\n this.label = cluster.markers.length.toLocaleString();\r\n this.labelColor = \"black\";\r\n this.labelFont = \"bold 14px sans-serif\";\r\n\r\n if (image)\r\n this.setImage(image);\r\n }\r\n\r\n /** Show the cluster as a white circle with an outline */\r\n public override drawFunc(ctx: CanvasRenderingContext2D): void {\r\n ctx.beginPath();\r\n ctx.strokeStyle = \"#372528\";\r\n ctx.fillStyle = \"white\";\r\n ctx.lineWidth = 5;\r\n ctx.arc(0, 0, this.size.x * 0.5, 0, Math.PI * 2);\r\n ctx.fill();\r\n ctx.stroke();\r\n }\r\n\r\n public override onMouseButton(_ev: BeButtonEvent): boolean { return true; } // Don't allow clicks to be sent to active tool...\r\n}\r\n\r\n/** @internal */\r\nclass PinMarkerSet extends MarkerSet<PinMarker> {\r\n protected getClusterMarker(cluster: Cluster<PinMarker>): Marker {\r\n // No image passed to the cluster, we prefer to have the circle only\r\n return new PinMarkerCluster(cluster.getClusterLocation(), cluster.markers[0].size, cluster, undefined);\r\n }\r\n}\r\n\r\ninterface DrapeGraphicState {\r\n graphic: GraphicPrimitive;\r\n collectorState: string;\r\n chordTolerance: number;\r\n range: Range3d;\r\n}\r\n\r\nclass DrapedPrimitives {\r\n private _strings?: LineString3d[];\r\n private _meshes?: Polyface[];\r\n private _points = new GrowableXYZArray();\r\n\r\n public get strings() {\r\n return this._strings;\r\n }\r\n\r\n public get meshes() {\r\n return this._meshes;\r\n }\r\n\r\n public get points() {\r\n return this._points;\r\n }\r\n\r\n public clear() {\r\n this._strings = undefined;\r\n this._meshes = undefined;\r\n this._points.clear();\r\n }\r\n\r\n public addStrings(drapedStrings: LineString3d[]) {\r\n if (!this._strings) {\r\n this._strings = [];\r\n }\r\n for (const ds of drapedStrings)\r\n this._strings.push(ds);\r\n }\r\n\r\n public addMeshes(drapedMeshes: Polyface[]) {\r\n if (!this._meshes)\r\n this._meshes = [];\r\n drapedMeshes.forEach((ds) => this._meshes!.push(ds));\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class MapFeatureInfoDecorator implements Decorator {\r\n public hidden = false;\r\n public readonly useCachedDecorations = true;\r\n public readonly disableTerrainDraper = false;\r\n public markerSize = new Point2d(32, 32);\r\n public lineWidth = 3;\r\n\r\n // This is the maximum allowed size of a geometry, in pixels, to be draped.\r\n // If the value is too large, we will end up downloading tons of terrain tiles, and possibly hang for too long.\r\n public maxDrapeSizePixels = 50000;\r\n\r\n // This value controls the chord tolerance used to collect terrain tiles\r\n // at the \"right\" resolution. Higher values, will give coarser terrain tiles.\r\n public chordTolerancePixels = 20;\r\n\r\n private _highlightColor = ColorDef.from(0, 255, 255, 127);\r\n public get highlightColor() { return this._highlightColor;}\r\n public set highlightColor(color: ColorDef) {\r\n this.updateMarkerImage();\r\n this._highlightColor = color;\r\n }\r\n\r\n public get defaultMarkerIconSvgXml() { return `<svg class=\"indicator\" viewBox=\"0 0 22 22\" width=\"22\" height=\"22\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m11 0a7.44506 7.44506 0 0 0 -7.5 7.2875c0 1.65 1.132 4.2625 3.25477 8.1125 1.55652 2.75 4.24523 6.6 4.24523 6.6s2.68865-3.9875 4.24528-6.7375c2.12272-3.85 3.25472-6.4625 3.25472-8.1125a7.4215 7.4215 0 0 0 -7.5-7.15z\" fill=\"black\"/><path d=\"m11 1.01715a6.46476 6.46476 0 0 0 -6.48285 6.27033c0 1.72619 1.67181 4.97973 3.12836 7.62139.97564 1.7237 2.42828 3.92176 3.34118 5.27161.91413-1.39148 2.385-3.673 3.37336-5.41907 1.451-2.63171 3.1228-5.88525 3.1228-7.61139a6.39982 6.39982 0 0 0 -6.48285-6.13287zm.00183 8.98285a3 3 0 1 1 3-3 3 3 0 0 1 -3 3z\" fill=\"${this.highlightColor.toRgbString()}\"/></svg>`; }\r\n\r\n private _scratchPoints = new GrowableXYZArray();\r\n\r\n private _drapeGraphicsStates: DrapeGraphicState[] = [];\r\n private _drapedPrimitives = new DrapedPrimitives();\r\n private _allGeomDraped = false;\r\n private _draper?: GeometryTerrainDraper;\r\n private _markerImage: HTMLImageElement;\r\n private _markerSet = new PinMarkerSet();\r\n\r\n // Extra markers can be added outside the normal state\r\n public extraMarkers: Point3d[]|undefined;\r\n\r\n private _data: MapFeatureInfoToolData | undefined;\r\n\r\n private readonly _graphicType = GraphicType.WorldOverlay;\r\n\r\n public constructor() {\r\n this._markerImage = new Image();\r\n this.updateMarkerImage();\r\n }\r\n\r\n private updateMarkerImage() {\r\n const base64 = Base64EncodedString.encode(this.defaultMarkerIconSvgXml);\r\n this._markerImage.src = `data:image/svg+xml;base64,${base64}`;\r\n }\r\n\r\n private computePixelSize(viewport: Viewport, applyAspectRatioSkew: boolean, pointWorld: Point3d) {\r\n let pixelSize = 1;\r\n // Compute the horizontal distance in meters between two adjacent pixels at the center of the geometry.\r\n pixelSize = viewport.getPixelSizeAtPoint(pointWorld);\r\n pixelSize = viewport.target.adjustPixelSizeForLOD(pixelSize);\r\n\r\n // Aspect ratio skew > 1.0 stretches the view in Y. In that case use the smaller vertical pixel distance for our stroke tolerance.\r\n const skew = applyAspectRatioSkew ? viewport.view.getAspectRatioSkew() : 0;\r\n if (skew > 1)\r\n pixelSize /= skew;\r\n return pixelSize * 0.25;\r\n }\r\n\r\n private computeChordTolerance(viewport: Viewport, drapeRange: Range3d) {\r\n const drapeSizeWorld = Math.max(drapeRange.xLength(), drapeRange.yLength());\r\n const pixelSize = this.computePixelSize(viewport, true, drapeRange.center);\r\n const maxDrapeRangeSizeRatio = this.maxDrapeSizePixels / (drapeSizeWorld / pixelSize);\r\n if (maxDrapeRangeSizeRatio < 1) {\r\n Logger.logWarning(loggerCategory, \"Element too large; chord tolerance was adjusted\");\r\n return (pixelSize / maxDrapeRangeSizeRatio)*this.chordTolerancePixels;\r\n }\r\n return pixelSize*this.chordTolerancePixels;\r\n };\r\n\r\n public clearData = () => {\r\n this._data = undefined;\r\n };\r\n\r\n public setData = (data: MapFeatureInfoToolData) => {\r\n\r\n this._drapedPrimitives.clear();\r\n this._allGeomDraped = false;\r\n this.hidden = false;\r\n\r\n this._data = data;\r\n IModelApp.viewManager.invalidateCachedDecorationsAllViews(this);\r\n\r\n this._drapeGraphicsStates = [];\r\n\r\n if (!this.disableTerrainDraper && this._data.mapInfo?.layerInfos && data.hit.viewport.displayStyle.displayTerrain) {\r\n\r\n if (data.hit?.modelId) {\r\n const drapeTreeRef = this.getGeometryTreeRef(data.hit.viewport);\r\n if (drapeTreeRef) {\r\n this._draper = new GeometryTerrainDraper(data.hit.viewport, drapeTreeRef);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (this._draper) {\r\n // Dispose draper every time?\r\n this._draper[Symbol.dispose]();\r\n this._draper = undefined;\r\n }\r\n };\r\n\r\n private getGeometryTreeRef(vp: Viewport): GeometryTileTreeReference | undefined {\r\n if (vp.backgroundMapSettings.applyTerrain) {\r\n for (const ref of vp.mapTileTreeRefs) {\r\n if (ref instanceof MapTileTreeReference) {\r\n return ref.createGeometryTreeReference();\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n protected renderGraphics(context: DecorateContext) {\r\n this._markerSet.markers.clear();\r\n\r\n if (this._data?.mapInfo?.layerInfos === undefined || this.hidden) {\r\n return undefined;\r\n }\r\n\r\n let transform: Transform|undefined;\r\n const groundBias = context.viewport.displayStyle.backgroundMapSettings.groundBias;\r\n if (groundBias !== 0) {\r\n transform = Transform.createTranslationXYZ(0, 0 , groundBias);\r\n }\r\n const builder = context.createGraphicBuilder(this._graphicType, transform);\r\n\r\n if (this._draper) {\r\n this.initializeDrapeState(context.viewport);\r\n\r\n // We need to call drapeGeometries() until it returns true (i.e. fully complete)\r\n if (!this._allGeomDraped) {\r\n if (!this.drapeGeometries(context.viewport))\r\n return undefined;\r\n }\r\n\r\n this.appendDrapedGeometries(builder);\r\n } else {\r\n // Append geometries straight from the state to the builder\r\n this.appendGeometries(builder);\r\n }\r\n\r\n // Add extra markers if any specified\r\n if ( this.extraMarkers !== undefined) {\r\n this.extraMarkers.forEach((markerPoint)=> {\r\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\r\n this._markerSet.markers.add(new PinMarker(markerPoint, this.markerSize, this._markerImage));\r\n });\r\n }\r\n\r\n return builder.finish();\r\n }\r\n\r\n // Iterates the mapfeatureinfo data and create a draping state for each entry\r\n private initializeDrapeState(viewport: ScreenViewport) {\r\n if (this._drapeGraphicsStates.length === 0) {\r\n const getGraphicRange = (graphic: GraphicPrimitive) => {\r\n if (graphic.type === \"linestring\")\r\n return Range3d.createArray(graphic.points);\r\n else if (graphic.type === \"loop\")\r\n return graphic.loop.range();\r\n else if (graphic.type === \"pointstring\")\r\n return Range3d.createArray(graphic.points);\r\n else\r\n return Range3d.createNull();\r\n };\r\n\r\n for (const layerInfo of this._data?.mapInfo?.layerInfos??[]) {\r\n for (const subLayerInfo of layerInfo?.subLayerInfos??[]) {\r\n for (const feature of subLayerInfo.features) {\r\n\r\n feature.geometries?.forEach(((geom)=> {\r\n const range = getGraphicRange(geom.graphic);\r\n this._drapeGraphicsStates.push({\r\n graphic: geom.graphic,\r\n collectorState: \"loading\",\r\n chordTolerance: this.computeChordTolerance(viewport, range),\r\n range,\r\n });\r\n } ));\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // returns true when all geometries are fully draped; otherwise false\r\n private drapeGeometries(_viewport: ScreenViewport): boolean {\r\n if (!this._draper)\r\n return false;\r\n\r\n let hasMissingDrapeGeoms = false;\r\n for (const state of this._drapeGraphicsStates) {\r\n if (state.collectorState === \"loading\") {\r\n this._scratchPoints.clear();\r\n\r\n if (state.graphic.type === \"linestring\") {\r\n this._scratchPoints.pushAll(state.graphic.points);\r\n const drapedStrings: LineString3d[] = [];\r\n if (\"loading\" === this._draper.drapeLineString(drapedStrings, this._scratchPoints, state.chordTolerance, state.range)) {\r\n hasMissingDrapeGeoms = true;\r\n break;\r\n } else {\r\n this._drapedPrimitives.addStrings(drapedStrings);\r\n state.collectorState = \"complete\";\r\n }\r\n } else if (state.graphic.type === \"loop\") {\r\n const loop = state.graphic.loop;\r\n const outMeshes: Polyface[] = [];\r\n if (\"loading\" === this._draper.drapeLoop(outMeshes, loop, state.chordTolerance, state.range)) {\r\n hasMissingDrapeGeoms = true;\r\n break; // We drape each graphic sequentially, otherwise collector get messed up.\r\n } else {\r\n this._drapedPrimitives.addMeshes(outMeshes);\r\n state.collectorState = \"complete\";\r\n }\r\n } else if (state.graphic.type === \"pointstring\") {\r\n const outPoint = Point3d.createZero();\r\n for (const point of state.graphic.points) {\r\n if (\"loading\" === this._draper.drapePoint(outPoint, point, state.chordTolerance, state.range)) {\r\n this._allGeomDraped = false;\r\n return false;\r\n } else if (!outPoint.isZero) {\r\n this._drapedPrimitives.points.push(outPoint);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._allGeomDraped = !hasMissingDrapeGeoms;\r\n return this._allGeomDraped;\r\n }\r\n\r\n private appendDrapedGeometries(builder: GraphicBuilder) {\r\n if (this._drapedPrimitives.strings) {\r\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\r\n this._drapedPrimitives.strings.forEach((line) => builder.addLineString(line.points));\r\n }\r\n\r\n if (this._drapedPrimitives.meshes) {\r\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\r\n this._drapedPrimitives.meshes.forEach((polyface) => builder.addPolyface(polyface, true));\r\n }\r\n\r\n if (this._drapedPrimitives.points.length > 0) {\r\n for (let i = 0; i < this._drapedPrimitives.points.length; i++) {\r\n this._markerSet.markers.add(new PinMarker(this._drapedPrimitives.points.getPoint3dAtUncheckedPointIndex(i), this.markerSize, this._markerImage));\r\n }\r\n }\r\n }\r\n\r\n private appendGeometries(builder: GraphicBuilder) {\r\n if (!this._data?.mapInfo?.layerInfos)\r\n return;\r\n\r\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\r\n for (const layerInfo of this._data.mapInfo.layerInfos) {\r\n if (layerInfo.subLayerInfos && !(layerInfo.subLayerInfos instanceof HTMLElement)) {\r\n for (const subLayerInfo of layerInfo.subLayerInfos) {\r\n for (const feature of subLayerInfo.features) {\r\n if (feature.geometries) {\r\n for (const geom of feature.geometries) {\r\n if (geom.graphic.type === \"pointstring\") {\r\n for (const point of geom.graphic.points)\r\n this._markerSet.markers.add(new PinMarker(point, this.markerSize, this._markerImage));\r\n } else {\r\n builder.addPrimitive(geom.graphic);\r\n }\r\n\r\n }\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n }\r\n }\r\n\r\n public decorate(context: DecorateContext): void {\r\n const graphics = this.renderGraphics(context);\r\n if (graphics) {\r\n context.addDecoration(this._graphicType, graphics);\r\n IModelApp.toolAdmin.setCursor(undefined);\r\n }\r\n\r\n this._markerSet.addDecoration(context);\r\n return;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"MapFeatureInfoDecorator.js","sourceRoot":"","sources":["../../../src/Tools/MapFeatureInfoDecorator.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAEwD,WAAW,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,EAAe,SAAS,EAG1I,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAgB,OAAO,EAAE,OAAO,EAAY,OAAO,EAAE,SAAS,EAAiB,MAAM,sBAAsB,CAAC;AACrI,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,MAAM,cAAc,GAAG,0CAA0C,CAAC;AAElE,gBAAgB;AAChB,MAAM,SAAU,SAAQ,MAAM;IAC5B,YAAmB,aAAqB,EAAE,IAAW,EAAE,KAAkB;QACvE,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;CACF;AAED,gBAAgB;AAChB,MAAM,gBAAiB,SAAQ,MAAM;IACnC,kCAAkC;IAClC,YAAY,QAAgB,EAAE,IAAW,EAAE,OAA2B,EAAE,KAAqD;QAC3H,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEtB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,YAAY,CAAC,kBAAkB,CAAC,iEAAiE,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAC,CAAC,CAAC;QAElK,IAAI,CAAC,WAAW,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QACrD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,sBAAsB,CAAC;QAExC,IAAI,KAAK;YACP,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,yDAAyD;IACzC,QAAQ,CAAC,GAA6B;QACpD,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC;QAC5B,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC;QACxB,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC;QAClB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACjD,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,GAAG,CAAC,MAAM,EAAE,CAAC;IACf,CAAC;IAEe,aAAa,CAAC,GAAkB,IAAa,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,kDAAkD;CAC/H;AAED,gBAAgB;AAChB,MAAM,YAAa,SAAQ,SAAoB;IACnC,gBAAgB,CAAC,OAA2B;QACpD,oEAAoE;QACpE,OAAO,IAAI,gBAAgB,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACzG,CAAC;CACF;AASD,MAAM,gBAAgB;IACZ,QAAQ,CAAkB;IAC1B,OAAO,CAAc;IACrB,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAEzC,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAEM,UAAU,CAAC,aAA6B;QAC7C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACrB,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,aAAa;YAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAEM,SAAS,CAAC,YAAwB;QACvC,IAAI,CAAC,IAAI,CAAC,OAAO;YACf,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QACpB,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC;CACF;AAED,gBAAgB;AAChB,MAAM,OAAO,uBAAuB;IAC3B,MAAM,GAAG,KAAK,CAAC;IACN,oBAAoB,GAAG,IAAI,CAAC;IAC5B,oBAAoB,GAAG,KAAK,CAAC;IACtC,UAAU,GAAG,IAAI,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACjC,SAAS,GAAI,CAAC,CAAC;IAEtB,2EAA2E;IAC3E,+GAA+G;IACxG,kBAAkB,GAAG,KAAK,CAAC;IAElC,wEAAwE;IACxE,8EAA8E;IACvE,oBAAoB,GAAG,EAAE,CAAC;IAEzB,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC1D,IAAW,cAAc,KAAK,OAAO,IAAI,CAAC,eAAe,CAAC,CAAA,CAAC;IAC3D,IAAW,cAAc,CAAC,KAAe;QACvC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,IAAW,uBAAuB,KAAK,OAAO,6pBAA6pB,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;IAElvB,cAAc,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAExC,oBAAoB,GAAwB,EAAE,CAAC;IAC/C,iBAAiB,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAC3C,cAAc,GAAG,KAAK,CAAC;IACvB,OAAO,CAAyB;IAChC,YAAY,CAAmB;IAC/B,UAAU,GAAG,IAAI,YAAY,EAAE,CAAC;IAExC,sDAAsD;IAC/C,YAAY,CAAsB;IAEjC,KAAK,CAAqC;IAEjC,YAAY,GAAG,WAAW,CAAC,YAAY,CAAC;IAEzD;QACE,IAAI,CAAC,YAAY,GAAG,IAAI,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAEO,iBAAiB;QACvB,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACxE,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,6BAA6B,MAAM,EAAE,CAAC;IAChE,CAAC;IAEO,gBAAgB,CAAC,QAAkB,EAAE,oBAA6B,EAAE,UAAmB;QAC7F,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,uGAAuG;QACvG,SAAS,GAAG,QAAQ,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;QACrD,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAE7D,kIAAkI;QAClI,MAAM,IAAI,GAAG,oBAAoB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,IAAI,IAAI,GAAG,CAAC;YACV,SAAS,IAAI,IAAI,CAAC;QACpB,OAAO,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC;IAEO,qBAAqB,CAAC,QAAkB,EAAE,UAAmB;QACnE,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,EAAG,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7E,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAC3E,MAAM,sBAAsB,GAAG,IAAI,CAAC,kBAAkB,GAAI,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;QACvF,IAAI,sBAAsB,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,iDAAiD,CAAC,CAAC;YACrF,OAAO,CAAC,SAAS,GAAG,sBAAsB,CAAC,GAAC,IAAI,CAAC,oBAAoB,CAAC;QACxE,CAAC;QACD,OAAO,SAAS,GAAC,IAAI,CAAC,oBAAoB,CAAC;IAC7C,CAAC;IAAA,CAAC;IAEK,SAAS,GAAG,GAAG,EAAE;QACtB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;IACzB,CAAC,CAAC;IAEK,OAAO,GAAG,CAAC,IAA4B,EAAE,EAAE;QAEhD,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAEpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,SAAS,CAAC,WAAW,CAAC,mCAAmC,CAAC,IAAI,CAAC,CAAC;QAEhE,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;QAE/B,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;YAElH,IAAI,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;gBACtB,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAChE,IAAI,YAAY,EAAE,CAAC;oBACjB,IAAI,CAAC,OAAO,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;oBAC1E,OAAO;gBACT,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,6BAA6B;YAC7B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC;IAEM,kBAAkB,CAAC,EAAY;QACrC,IAAI,EAAE,CAAC,qBAAqB,CAAC,YAAY,EAAE,CAAC;YAC1C,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,eAAe,EAAE,CAAC;gBACrC,IAAI,GAAG,YAAY,oBAAoB,EAAE,CAAC;oBACxC,OAAO,GAAG,CAAC,2BAA2B,EAAE,CAAC;gBAC3C,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAES,cAAc,CAAC,OAAwB;QAC/C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAEhC,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACjE,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,SAA8B,CAAC;QACnC,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,qBAAqB,CAAC,UAAU,CAAC;QAClF,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACrB,SAAS,GAAG,SAAS,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAG,UAAU,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAE3E,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAE5C,gFAAgF;YAChF,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACzC,OAAO,SAAS,CAAC;YACrB,CAAC;YAED,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,2DAA2D;YAC3D,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QAED,qCAAqC;QACrC,IAAK,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAC,EAAE;gBACvC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC/E,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YAC9F,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED,6EAA6E;IACrE,oBAAoB,CAAC,QAAwB;QACnD,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3C,MAAM,eAAe,GAAG,CAAC,OAAyB,EAAE,EAAE;gBACpD,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY;oBAC/B,OAAO,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;qBACxC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;oBAC9B,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;qBACzB,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa;oBACrC,OAAO,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;;oBAE3C,OAAO,OAAO,CAAC,UAAU,EAAE,CAAC;YAChC,CAAC,CAAC;YAEF,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,IAAE,EAAE,EAAE,CAAC;gBAC5D,KAAK,MAAM,YAAY,IAAI,SAAS,EAAE,aAAa,IAAE,EAAE,EAAE,CAAC;oBACxD,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;wBAE5C,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAC,EAAE;4BACnC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;4BAC5C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;gCAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;gCACrB,cAAc,EAAE,SAAS;gCACzB,cAAc,EAAE,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,KAAK,CAAC;gCAC3D,KAAK;6BACN,CAAC,CAAC;wBACL,CAAC,CAAE,CAAC,CAAC;oBACP,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,qEAAqE;IAC7D,eAAe,CAAC,SAAyB;QAC/C,IAAI,CAAC,IAAI,CAAC,OAAO;YACf,OAAO,KAAK,CAAC;QAEf,IAAI,oBAAoB,GAAG,KAAK,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9C,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;gBACvC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;gBAE5B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBACxC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBAClD,MAAM,aAAa,GAAmB,EAAE,CAAC;oBACzC,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;wBACtH,oBAAoB,GAAG,IAAI,CAAC;wBAC5B,MAAM;oBACR,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;wBACjD,KAAK,CAAC,cAAc,GAAG,UAAU,CAAC;oBACpC,CAAC;gBACH,CAAC;qBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACzC,MAAM,IAAI,GAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;oBACjC,MAAM,SAAS,GAAe,EAAE,CAAC;oBACjC,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC7F,oBAAoB,GAAG,IAAI,CAAC;wBAC5B,MAAM,CAAC,0EAA0E;oBACnF,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;wBAC5C,KAAK,CAAC,cAAc,GAAG,UAAU,CAAC;oBACpC,CAAC;gBACH,CAAC;qBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;oBAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;oBACtC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;wBACzC,IAAI,SAAS,KAAK,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;4BAC9F,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;4BAC5B,OAAO,KAAK,CAAC;wBACf,CAAC;6BAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;4BAC5B,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAC/C,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,CAAC,oBAAoB,CAAC;QAC5C,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAEO,sBAAsB,CAAC,OAAuB;QACpD,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;YACnC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/E,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACvF,CAAC;QAED,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;YAClC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/E,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QAC3F,CAAC;QAED,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9D,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YACnJ,CAAC;QACH,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,OAAuB;QAC9C,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU;YAClC,OAAO;QAET,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/E,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YACtD,IAAI,SAAS,CAAC,aAAa,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,YAAY,WAAW,CAAC,EAAE,CAAC;gBACjF,KAAK,MAAM,YAAY,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;oBACnD,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;wBAC5C,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;4BACvB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gCACtC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;oCACxC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM;wCACrC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;gCAC1F,CAAC;qCAAM,CAAC;oCACN,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gCACrC,CAAC;4BAEH,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YAEH,CAAC;QAEH,CAAC;IACH,CAAC;IAEM,QAAQ,CAAC,OAAwB;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;YACnD,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { Logger } from \"@itwin/core-bentley\";\nimport { Base64EncodedString, ColorDef } from \"@itwin/core-common\";\nimport {\n BeButtonEvent, Cluster, DecorateContext, Decorator,\n GeometryTileTreeReference, GraphicBuilder, GraphicPrimitive, GraphicType, IModelApp, MapTileTreeReference, Marker, MarkerImage, MarkerSet,\n ScreenViewport,\n Viewport\n} from \"@itwin/core-frontend\";\nimport { GrowableXYZArray, LineString3d, Point2d, Point3d, Polyface, Range3d, Transform, XAndY, XYAndZ } from \"@itwin/core-geometry\";\nimport { GeometryTerrainDraper } from \"./GeometryTerrainDraper.js\";\nimport { MapFeatureInfoToolData } from \"./MapFeatureInfoTool.js\";\n\nconst loggerCategory = \"MapLayersFormats.MapFeatureInfoDecorator\";\n\n/** @internal */\nclass PinMarker extends Marker {\n public constructor(worldLocation: XYAndZ, size: XAndY, image: MarkerImage) {\n super(worldLocation, size);\n this.image = image;\n this.imageOffset = new Point3d(0, Math.floor(size.y * .5));\n }\n}\n\n/** @internal */\nclass PinMarkerCluster extends Marker {\n /** Create a new cluster marker */\n constructor(location: XYAndZ, size: XAndY, cluster: Cluster<PinMarker>, image: MarkerImage | Promise<MarkerImage> | undefined) {\n super(location, size);\n\n this.title = IModelApp.localization.getLocalizedString(\"mapLayersFormats:Messages.MapFeatureInfoDecorator.clusterZoomIn\", { nbInstances: cluster.markers.length});\n\n this.imageOffset = new Point3d(0, size.y * 0.5);\n this.label = cluster.markers.length.toLocaleString();\n this.labelColor = \"black\";\n this.labelFont = \"bold 14px sans-serif\";\n\n if (image)\n this.setImage(image);\n }\n\n /** Show the cluster as a white circle with an outline */\n public override drawFunc(ctx: CanvasRenderingContext2D): void {\n ctx.beginPath();\n ctx.strokeStyle = \"#372528\";\n ctx.fillStyle = \"white\";\n ctx.lineWidth = 5;\n ctx.arc(0, 0, this.size.x * 0.5, 0, Math.PI * 2);\n ctx.fill();\n ctx.stroke();\n }\n\n public override onMouseButton(_ev: BeButtonEvent): boolean { return true; } // Don't allow clicks to be sent to active tool...\n}\n\n/** @internal */\nclass PinMarkerSet extends MarkerSet<PinMarker> {\n protected getClusterMarker(cluster: Cluster<PinMarker>): Marker {\n // No image passed to the cluster, we prefer to have the circle only\n return new PinMarkerCluster(cluster.getClusterLocation(), cluster.markers[0].size, cluster, undefined);\n }\n}\n\ninterface DrapeGraphicState {\n graphic: GraphicPrimitive;\n collectorState: string;\n chordTolerance: number;\n range: Range3d;\n}\n\nclass DrapedPrimitives {\n private _strings?: LineString3d[];\n private _meshes?: Polyface[];\n private _points = new GrowableXYZArray();\n\n public get strings() {\n return this._strings;\n }\n\n public get meshes() {\n return this._meshes;\n }\n\n public get points() {\n return this._points;\n }\n\n public clear() {\n this._strings = undefined;\n this._meshes = undefined;\n this._points.clear();\n }\n\n public addStrings(drapedStrings: LineString3d[]) {\n if (!this._strings) {\n this._strings = [];\n }\n for (const ds of drapedStrings)\n this._strings.push(ds);\n }\n\n public addMeshes(drapedMeshes: Polyface[]) {\n if (!this._meshes)\n this._meshes = [];\n drapedMeshes.forEach((ds) => this._meshes!.push(ds));\n }\n}\n\n/** @internal */\nexport class MapFeatureInfoDecorator implements Decorator {\n public hidden = false;\n public readonly useCachedDecorations = true;\n public readonly disableTerrainDraper = false;\n public markerSize = new Point2d(32, 32);\n public lineWidth = 3;\n\n // This is the maximum allowed size of a geometry, in pixels, to be draped.\n // If the value is too large, we will end up downloading tons of terrain tiles, and possibly hang for too long.\n public maxDrapeSizePixels = 50000;\n\n // This value controls the chord tolerance used to collect terrain tiles\n // at the \"right\" resolution. Higher values, will give coarser terrain tiles.\n public chordTolerancePixels = 20;\n\n private _highlightColor = ColorDef.from(0, 255, 255, 127);\n public get highlightColor() { return this._highlightColor;}\n public set highlightColor(color: ColorDef) {\n this.updateMarkerImage();\n this._highlightColor = color;\n }\n\n public get defaultMarkerIconSvgXml() { return `<svg class=\"indicator\" viewBox=\"0 0 22 22\" width=\"22\" height=\"22\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m11 0a7.44506 7.44506 0 0 0 -7.5 7.2875c0 1.65 1.132 4.2625 3.25477 8.1125 1.55652 2.75 4.24523 6.6 4.24523 6.6s2.68865-3.9875 4.24528-6.7375c2.12272-3.85 3.25472-6.4625 3.25472-8.1125a7.4215 7.4215 0 0 0 -7.5-7.15z\" fill=\"black\"/><path d=\"m11 1.01715a6.46476 6.46476 0 0 0 -6.48285 6.27033c0 1.72619 1.67181 4.97973 3.12836 7.62139.97564 1.7237 2.42828 3.92176 3.34118 5.27161.91413-1.39148 2.385-3.673 3.37336-5.41907 1.451-2.63171 3.1228-5.88525 3.1228-7.61139a6.39982 6.39982 0 0 0 -6.48285-6.13287zm.00183 8.98285a3 3 0 1 1 3-3 3 3 0 0 1 -3 3z\" fill=\"${this.highlightColor.toRgbString()}\"/></svg>`; }\n\n private _scratchPoints = new GrowableXYZArray();\n\n private _drapeGraphicsStates: DrapeGraphicState[] = [];\n private _drapedPrimitives = new DrapedPrimitives();\n private _allGeomDraped = false;\n private _draper?: GeometryTerrainDraper;\n private _markerImage: HTMLImageElement;\n private _markerSet = new PinMarkerSet();\n\n // Extra markers can be added outside the normal state\n public extraMarkers: Point3d[]|undefined;\n\n private _data: MapFeatureInfoToolData | undefined;\n\n private readonly _graphicType = GraphicType.WorldOverlay;\n\n public constructor() {\n this._markerImage = new Image();\n this.updateMarkerImage();\n }\n\n private updateMarkerImage() {\n const base64 = Base64EncodedString.encode(this.defaultMarkerIconSvgXml);\n this._markerImage.src = `data:image/svg+xml;base64,${base64}`;\n }\n\n private computePixelSize(viewport: Viewport, applyAspectRatioSkew: boolean, pointWorld: Point3d) {\n let pixelSize = 1;\n // Compute the horizontal distance in meters between two adjacent pixels at the center of the geometry.\n pixelSize = viewport.getPixelSizeAtPoint(pointWorld);\n pixelSize = viewport.target.adjustPixelSizeForLOD(pixelSize);\n\n // Aspect ratio skew > 1.0 stretches the view in Y. In that case use the smaller vertical pixel distance for our stroke tolerance.\n const skew = applyAspectRatioSkew ? viewport.view.getAspectRatioSkew() : 0;\n if (skew > 1)\n pixelSize /= skew;\n return pixelSize * 0.25;\n }\n\n private computeChordTolerance(viewport: Viewport, drapeRange: Range3d) {\n const drapeSizeWorld = Math.max(drapeRange.xLength(), drapeRange.yLength());\n const pixelSize = this.computePixelSize(viewport, true, drapeRange.center);\n const maxDrapeRangeSizeRatio = this.maxDrapeSizePixels / (drapeSizeWorld / pixelSize);\n if (maxDrapeRangeSizeRatio < 1) {\n Logger.logWarning(loggerCategory, \"Element too large; chord tolerance was adjusted\");\n return (pixelSize / maxDrapeRangeSizeRatio)*this.chordTolerancePixels;\n }\n return pixelSize*this.chordTolerancePixels;\n };\n\n public clearData = () => {\n this._data = undefined;\n };\n\n public setData = (data: MapFeatureInfoToolData) => {\n\n this._drapedPrimitives.clear();\n this._allGeomDraped = false;\n this.hidden = false;\n\n this._data = data;\n IModelApp.viewManager.invalidateCachedDecorationsAllViews(this);\n\n this._drapeGraphicsStates = [];\n\n if (!this.disableTerrainDraper && this._data.mapInfo?.layerInfos && data.hit.viewport.displayStyle.displayTerrain) {\n\n if (data.hit?.modelId) {\n const drapeTreeRef = this.getGeometryTreeRef(data.hit.viewport);\n if (drapeTreeRef) {\n this._draper = new GeometryTerrainDraper(data.hit.viewport, drapeTreeRef);\n return;\n }\n }\n }\n\n if (this._draper) {\n // Dispose draper every time?\n this._draper[Symbol.dispose]();\n this._draper = undefined;\n }\n };\n\n private getGeometryTreeRef(vp: Viewport): GeometryTileTreeReference | undefined {\n if (vp.backgroundMapSettings.applyTerrain) {\n for (const ref of vp.mapTileTreeRefs) {\n if (ref instanceof MapTileTreeReference) {\n return ref.createGeometryTreeReference();\n }\n }\n }\n\n return undefined;\n }\n\n protected renderGraphics(context: DecorateContext) {\n this._markerSet.markers.clear();\n\n if (this._data?.mapInfo?.layerInfos === undefined || this.hidden) {\n return undefined;\n }\n\n let transform: Transform|undefined;\n const groundBias = context.viewport.displayStyle.backgroundMapSettings.groundBias;\n if (groundBias !== 0) {\n transform = Transform.createTranslationXYZ(0, 0 , groundBias);\n }\n const builder = context.createGraphicBuilder(this._graphicType, transform);\n\n if (this._draper) {\n this.initializeDrapeState(context.viewport);\n\n // We need to call drapeGeometries() until it returns true (i.e. fully complete)\n if (!this._allGeomDraped) {\n if (!this.drapeGeometries(context.viewport))\n return undefined;\n }\n\n this.appendDrapedGeometries(builder);\n } else {\n // Append geometries straight from the state to the builder\n this.appendGeometries(builder);\n }\n\n // Add extra markers if any specified\n if ( this.extraMarkers !== undefined) {\n this.extraMarkers.forEach((markerPoint)=> {\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\n this._markerSet.markers.add(new PinMarker(markerPoint, this.markerSize, this._markerImage));\n });\n }\n\n return builder.finish();\n }\n\n // Iterates the mapfeatureinfo data and create a draping state for each entry\n private initializeDrapeState(viewport: ScreenViewport) {\n if (this._drapeGraphicsStates.length === 0) {\n const getGraphicRange = (graphic: GraphicPrimitive) => {\n if (graphic.type === \"linestring\")\n return Range3d.createArray(graphic.points);\n else if (graphic.type === \"loop\")\n return graphic.loop.range();\n else if (graphic.type === \"pointstring\")\n return Range3d.createArray(graphic.points);\n else\n return Range3d.createNull();\n };\n\n for (const layerInfo of this._data?.mapInfo?.layerInfos??[]) {\n for (const subLayerInfo of layerInfo?.subLayerInfos??[]) {\n for (const feature of subLayerInfo.features) {\n\n feature.geometries?.forEach(((geom)=> {\n const range = getGraphicRange(geom.graphic);\n this._drapeGraphicsStates.push({\n graphic: geom.graphic,\n collectorState: \"loading\",\n chordTolerance: this.computeChordTolerance(viewport, range),\n range,\n });\n } ));\n }\n }\n }\n }\n }\n\n // returns true when all geometries are fully draped; otherwise false\n private drapeGeometries(_viewport: ScreenViewport): boolean {\n if (!this._draper)\n return false;\n\n let hasMissingDrapeGeoms = false;\n for (const state of this._drapeGraphicsStates) {\n if (state.collectorState === \"loading\") {\n this._scratchPoints.clear();\n\n if (state.graphic.type === \"linestring\") {\n this._scratchPoints.pushAll(state.graphic.points);\n const drapedStrings: LineString3d[] = [];\n if (\"loading\" === this._draper.drapeLineString(drapedStrings, this._scratchPoints, state.chordTolerance, state.range)) {\n hasMissingDrapeGeoms = true;\n break;\n } else {\n this._drapedPrimitives.addStrings(drapedStrings);\n state.collectorState = \"complete\";\n }\n } else if (state.graphic.type === \"loop\") {\n const loop = state.graphic.loop;\n const outMeshes: Polyface[] = [];\n if (\"loading\" === this._draper.drapeLoop(outMeshes, loop, state.chordTolerance, state.range)) {\n hasMissingDrapeGeoms = true;\n break; // We drape each graphic sequentially, otherwise collector get messed up.\n } else {\n this._drapedPrimitives.addMeshes(outMeshes);\n state.collectorState = \"complete\";\n }\n } else if (state.graphic.type === \"pointstring\") {\n const outPoint = Point3d.createZero();\n for (const point of state.graphic.points) {\n if (\"loading\" === this._draper.drapePoint(outPoint, point, state.chordTolerance, state.range)) {\n this._allGeomDraped = false;\n return false;\n } else if (!outPoint.isZero) {\n this._drapedPrimitives.points.push(outPoint);\n }\n }\n }\n }\n }\n\n this._allGeomDraped = !hasMissingDrapeGeoms;\n return this._allGeomDraped;\n }\n\n private appendDrapedGeometries(builder: GraphicBuilder) {\n if (this._drapedPrimitives.strings) {\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\n this._drapedPrimitives.strings.forEach((line) => builder.addLineString(line.points));\n }\n\n if (this._drapedPrimitives.meshes) {\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\n this._drapedPrimitives.meshes.forEach((polyface) => builder.addPolyface(polyface, true));\n }\n\n if (this._drapedPrimitives.points.length > 0) {\n for (let i = 0; i < this._drapedPrimitives.points.length; i++) {\n this._markerSet.markers.add(new PinMarker(this._drapedPrimitives.points.getPoint3dAtUncheckedPointIndex(i), this.markerSize, this._markerImage));\n }\n }\n }\n\n private appendGeometries(builder: GraphicBuilder) {\n if (!this._data?.mapInfo?.layerInfos)\n return;\n\n builder.setSymbology(this.highlightColor, this.highlightColor, this.lineWidth);\n for (const layerInfo of this._data.mapInfo.layerInfos) {\n if (layerInfo.subLayerInfos && !(layerInfo.subLayerInfos instanceof HTMLElement)) {\n for (const subLayerInfo of layerInfo.subLayerInfos) {\n for (const feature of subLayerInfo.features) {\n if (feature.geometries) {\n for (const geom of feature.geometries) {\n if (geom.graphic.type === \"pointstring\") {\n for (const point of geom.graphic.points)\n this._markerSet.markers.add(new PinMarker(point, this.markerSize, this._markerImage));\n } else {\n builder.addPrimitive(geom.graphic);\n }\n\n }\n }\n }\n }\n\n }\n\n }\n }\n\n public decorate(context: DecorateContext): void {\n const graphics = this.renderGraphics(context);\n if (graphics) {\n context.addDecoration(this._graphicType, graphics);\n IModelApp.toolAdmin.setCursor(undefined);\n }\n\n this._markerSet.addDecoration(context);\n return;\n }\n}\n"]}
|