@itwin/core-common 3.0.0-dev.84 → 3.0.0-dev.85
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 +1248 -1248
- package/README.md +11 -11
- package/lib/cjs/AuthorizationClient.js.map +1 -1
- package/lib/cjs/BackgroundMapProvider.js.map +1 -1
- package/lib/cjs/Base64EncodedString.js.map +1 -1
- package/lib/cjs/BlobReader.js.map +1 -1
- package/lib/cjs/ChangedElements.js.map +1 -1
- package/lib/cjs/ChangedEntities.js.map +1 -1
- package/lib/cjs/ClipStyle.js.map +1 -1
- package/lib/cjs/CloudStorage.js.map +1 -1
- package/lib/cjs/CloudStorageTileCache.js.map +1 -1
- package/lib/cjs/Code.js.map +1 -1
- package/lib/cjs/ConcurrentQuery.js.map +1 -1
- package/lib/cjs/ContextRealityModel.js.map +1 -1
- package/lib/cjs/DisplayStyleSettings.js.map +1 -1
- package/lib/cjs/ECSqlReader.js.map +1 -1
- package/lib/cjs/ECSqlTypes.js.map +1 -1
- package/lib/cjs/EntityProps.js.map +1 -1
- package/lib/cjs/FeatureGates.js.map +1 -1
- package/lib/cjs/FeatureIndex.js.map +1 -1
- package/lib/cjs/Fonts.js.map +1 -1
- package/lib/cjs/Frustum.js.map +1 -1
- package/lib/cjs/IModelError.js.map +1 -1
- package/lib/cjs/Image.js.map +1 -1
- package/lib/cjs/Localization.d.ts +12 -6
- package/lib/cjs/Localization.d.ts.map +1 -1
- package/lib/cjs/Localization.js +1 -0
- package/lib/cjs/Localization.js.map +1 -1
- package/lib/cjs/MapImagerySettings.js.map +1 -1
- package/lib/cjs/ModelClipGroup.js.map +1 -1
- package/lib/cjs/ModelProps.js.map +1 -1
- package/lib/cjs/OctEncodedNormal.js.map +1 -1
- package/lib/cjs/PlanarClipMask.js.map +1 -1
- package/lib/cjs/QPoint.js.map +1 -1
- package/lib/cjs/Render.js.map +1 -1
- package/lib/cjs/RpcInterface.js.map +1 -1
- package/lib/cjs/RpcManager.js.map +1 -1
- package/lib/cjs/SpatialClassification.js.map +1 -1
- package/lib/cjs/SubCategoryAppearance.js.map +1 -1
- package/lib/cjs/Thumbnail.js.map +1 -1
- package/lib/cjs/TxnAction.js.map +1 -1
- package/lib/cjs/ViewDetails.js.map +1 -1
- package/lib/cjs/ViewProps.js.map +1 -1
- package/lib/cjs/WhiteOnWhiteReversalSettings.js.map +1 -1
- package/lib/cjs/core-common.js.map +1 -1
- package/lib/cjs/geometry/AdditionalTransform.js.map +1 -1
- package/lib/cjs/geometry/AreaPattern.js.map +1 -1
- package/lib/cjs/geometry/Cartographic.js.map +1 -1
- package/lib/cjs/geometry/CoordinateReferenceSystem.js.map +1 -1
- package/lib/cjs/geometry/GeodeticDatum.js.map +1 -1
- package/lib/cjs/geometry/GeodeticEllipsoid.js.map +1 -1
- package/lib/cjs/geometry/LineStyle.js.map +1 -1
- package/lib/cjs/geometry/Projection.js.map +1 -1
- package/lib/cjs/geometry/TextString.js.map +1 -1
- package/lib/cjs/ipc/IpcWebSocket.js.map +1 -1
- package/lib/cjs/rpc/IModelReadRpcInterface.js.map +1 -1
- package/lib/cjs/rpc/SnapshotIModelRpcInterface.js.map +1 -1
- package/lib/cjs/rpc/TestRpcManager.js.map +1 -1
- package/lib/cjs/rpc/core/RpcConfiguration.js.map +1 -1
- package/lib/cjs/rpc/core/RpcConstants.js.map +1 -1
- package/lib/cjs/rpc/core/RpcControl.js.map +1 -1
- package/lib/cjs/rpc/core/RpcInvocation.js.map +1 -1
- package/lib/cjs/rpc/core/RpcMarshaling.js.map +1 -1
- package/lib/cjs/rpc/core/RpcOperation.js.map +1 -1
- package/lib/cjs/rpc/core/RpcPendingQueue.js.map +1 -1
- package/lib/cjs/rpc/core/RpcProtocol.js.map +1 -1
- package/lib/cjs/rpc/core/RpcRegistry.js.map +1 -1
- package/lib/cjs/rpc/core/RpcRequest.js.map +1 -1
- package/lib/cjs/rpc/core/RpcRoutingToken.js.map +1 -1
- package/lib/cjs/rpc/web/BentleyCloudRpcManager.js.map +1 -1
- package/lib/cjs/rpc/web/BentleyCloudRpcProtocol.js.map +1 -1
- package/lib/cjs/rpc/web/OpenAPI.js.map +1 -1
- package/lib/cjs/rpc/web/RpcMultipart.js.map +1 -1
- package/lib/cjs/rpc/web/WebAppRpcLogging.js.map +1 -1
- package/lib/cjs/rpc/web/WebAppRpcProtocol.js.map +1 -1
- package/lib/cjs/rpc/web/WebAppRpcRequest.js.map +1 -1
- package/lib/cjs/rpc/web/multipart/RpcMultipartParser.js.map +1 -1
- package/lib/cjs/tile/ElementGraphics.js.map +1 -1
- package/lib/esm/AuthorizationClient.js.map +1 -1
- package/lib/esm/BackgroundMapProvider.js.map +1 -1
- package/lib/esm/Base64EncodedString.js.map +1 -1
- package/lib/esm/BlobReader.js.map +1 -1
- package/lib/esm/ChangedElements.js.map +1 -1
- package/lib/esm/ChangedEntities.js.map +1 -1
- package/lib/esm/ClipStyle.js.map +1 -1
- package/lib/esm/CloudStorage.js.map +1 -1
- package/lib/esm/CloudStorageTileCache.js.map +1 -1
- package/lib/esm/Code.js.map +1 -1
- package/lib/esm/ConcurrentQuery.js.map +1 -1
- package/lib/esm/ContextRealityModel.js.map +1 -1
- package/lib/esm/DisplayStyleSettings.js.map +1 -1
- package/lib/esm/ECSqlReader.js.map +1 -1
- package/lib/esm/ECSqlTypes.js.map +1 -1
- package/lib/esm/EntityProps.js.map +1 -1
- package/lib/esm/FeatureGates.js.map +1 -1
- package/lib/esm/FeatureIndex.js.map +1 -1
- package/lib/esm/Fonts.js.map +1 -1
- package/lib/esm/Frustum.js.map +1 -1
- package/lib/esm/IModelError.js.map +1 -1
- package/lib/esm/Image.js.map +1 -1
- package/lib/esm/Localization.d.ts +12 -6
- package/lib/esm/Localization.d.ts.map +1 -1
- package/lib/esm/Localization.js +1 -0
- package/lib/esm/Localization.js.map +1 -1
- package/lib/esm/MapImagerySettings.js.map +1 -1
- package/lib/esm/ModelClipGroup.js.map +1 -1
- package/lib/esm/ModelProps.js.map +1 -1
- package/lib/esm/OctEncodedNormal.js.map +1 -1
- package/lib/esm/PlanarClipMask.js.map +1 -1
- package/lib/esm/QPoint.js.map +1 -1
- package/lib/esm/Render.js.map +1 -1
- package/lib/esm/RpcInterface.js.map +1 -1
- package/lib/esm/RpcManager.js.map +1 -1
- package/lib/esm/SpatialClassification.js.map +1 -1
- package/lib/esm/SubCategoryAppearance.js.map +1 -1
- package/lib/esm/Thumbnail.js.map +1 -1
- package/lib/esm/TxnAction.js.map +1 -1
- package/lib/esm/ViewDetails.js.map +1 -1
- package/lib/esm/ViewProps.js.map +1 -1
- package/lib/esm/WhiteOnWhiteReversalSettings.js.map +1 -1
- package/lib/esm/core-common.js.map +1 -1
- package/lib/esm/geometry/AdditionalTransform.js.map +1 -1
- package/lib/esm/geometry/AreaPattern.js.map +1 -1
- package/lib/esm/geometry/Cartographic.js.map +1 -1
- package/lib/esm/geometry/CoordinateReferenceSystem.js.map +1 -1
- package/lib/esm/geometry/GeodeticDatum.js.map +1 -1
- package/lib/esm/geometry/GeodeticEllipsoid.js.map +1 -1
- package/lib/esm/geometry/LineStyle.js.map +1 -1
- package/lib/esm/geometry/Projection.js.map +1 -1
- package/lib/esm/geometry/TextString.js.map +1 -1
- package/lib/esm/ipc/IpcWebSocket.js.map +1 -1
- package/lib/esm/rpc/IModelReadRpcInterface.js.map +1 -1
- package/lib/esm/rpc/SnapshotIModelRpcInterface.js.map +1 -1
- package/lib/esm/rpc/TestRpcManager.js.map +1 -1
- package/lib/esm/rpc/core/RpcConfiguration.js.map +1 -1
- package/lib/esm/rpc/core/RpcConstants.js.map +1 -1
- package/lib/esm/rpc/core/RpcControl.js.map +1 -1
- package/lib/esm/rpc/core/RpcInvocation.js.map +1 -1
- package/lib/esm/rpc/core/RpcMarshaling.js.map +1 -1
- package/lib/esm/rpc/core/RpcOperation.js.map +1 -1
- package/lib/esm/rpc/core/RpcPendingQueue.js.map +1 -1
- package/lib/esm/rpc/core/RpcProtocol.js.map +1 -1
- package/lib/esm/rpc/core/RpcRegistry.js.map +1 -1
- package/lib/esm/rpc/core/RpcRequest.js.map +1 -1
- package/lib/esm/rpc/core/RpcRoutingToken.js.map +1 -1
- package/lib/esm/rpc/web/BentleyCloudRpcManager.js.map +1 -1
- package/lib/esm/rpc/web/BentleyCloudRpcProtocol.js.map +1 -1
- package/lib/esm/rpc/web/OpenAPI.js.map +1 -1
- package/lib/esm/rpc/web/RpcMultipart.js.map +1 -1
- package/lib/esm/rpc/web/WebAppRpcLogging.js.map +1 -1
- package/lib/esm/rpc/web/WebAppRpcProtocol.js.map +1 -1
- package/lib/esm/rpc/web/WebAppRpcRequest.js.map +1 -1
- package/lib/esm/rpc/web/multipart/RpcMultipartParser.js.map +1 -1
- package/lib/esm/tile/ElementGraphics.js.map +1 -1
- package/package.json +9 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cartographic.js","sourceRoot":"","sources":["../../../src/geometry/Cartographic.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/** @packageDocumentation\n * @module Geometry\n */\n\nimport { Angle, Constant, Point3d, Range1d, Range2d, Range3d, Transform, Vector3d, XYAndZ, XYZ } from \"@itwin/core-geometry\";\nimport { assert } from \"@itwin/core-bentley\";\n\n// portions adapted from Cesium.js Copyright 2011 - 2017 Cesium Contributors\n\n/** The JSON representation of a Cartographic object.\n * @public\n **/\nexport interface CartographicProps {\n /** The longitude, specified in radians. */\n longitude: number;\n /** The latitude, specified in radians. */\n latitude: number;\n /** The height, specified in meters above the ellipsoid. */\n height: number;\n}\n\n/** A position on the earth defined by longitude, latitude, and height above the [WGS84](https://en.wikipedia.org/wiki/World_Geodetic_System) ellipsoid.\n * @public\n */\nexport class Cartographic implements CartographicProps {\n /**\n * @param longitude longitude, in radians.\n * @param latitude latitude, in radians.\n * @param height The height, in meters, above the ellipsoid.\n */\n private constructor(public longitude: number = 0, public latitude: number = 0, public height: number = 0) { }\n\n /** Create a Cartographic object with longitude, latitude, and height of zero. */\n public static createZero() {\n return new Cartographic(0, 0, 0);\n }\n\n /** Create a new Cartographic from longitude and latitude specified in radians.\n * @param args an object containing a longitude, latitude, and an optional height property. The longitude and latitude properties are numbers specified in radians. The height property, if specified, is a number which contains the height in meters above the ellipsoid; if undefined, this height will default to zero.\n * @param result The object onto which to store the result.\n */\n public static fromRadians(args: { longitude: number, latitude: number, height?: number }, result?: Cartographic) {\n if (!result)\n return new Cartographic(args.longitude, args.latitude, args.height);\n\n result.longitude = args.longitude;\n result.latitude = args.latitude;\n result.height = args.height !== undefined ? args.height : 0;\n return result;\n }\n\n /** Create a JSON representation of a Cartographic object. */\n public toJSON(): CartographicProps {\n return {\n latitude: this.latitude,\n longitude: this.longitude,\n height: this.height,\n };\n }\n\n /** Freeze this Cartographic */\n public freeze(): Readonly<this> {\n return Object.freeze(this);\n }\n\n /** longitude, in degrees */\n public get longitudeDegrees() {\n return Angle.radiansToDegrees(this.longitude);\n }\n\n /** latitude, in degrees */\n public get latitudeDegrees() {\n return Angle.radiansToDegrees(this.latitude);\n }\n\n private static _oneMinusF = 1 - (Constant.earthRadiusWGS84.equator - Constant.earthRadiusWGS84.polar) / Constant.earthRadiusWGS84.equator;\n private static _equatorOverPolar = Constant.earthRadiusWGS84.equator / Constant.earthRadiusWGS84.polar;\n /** return the geocentric latitude angle for the input geodetic latitude angle (both in radians).\n * @param geodeticLatitude geodetic latitude angle in radians\n */\n public static geocentricLatitudeFromGeodeticLatitude(geodeticLatitude: number): number {\n return Math.atan(Cartographic._oneMinusF * Cartographic._oneMinusF * Math.tan(geodeticLatitude));\n }\n /** return the parametric latitude angle for the input geodetic latitude angle (both in radians). The parametric latitude\n * is appropriate for input to the Ellipsoid methods.\n * @param geodeticLatitude geodetic latitude angle in radians\n */\n public static parametricLatitudeFromGeodeticLatitude(geodeticLatitude: number): number {\n return Math.atan(Cartographic._oneMinusF * Cartographic._oneMinusF * Cartographic._equatorOverPolar * Math.tan(geodeticLatitude));\n }\n\n /** Create a new Cartographic from longitude and latitude specified in degrees. The values in the resulting object will be in radians.\n * @param args an object containing a longitude, latitude, and an optional height property. The longitude and latitude properties are numbers specified in degrees. The height property, if specified, is a number which contains the height in meters above the ellipsoid; if undefined, this height will default to zero.\n * @param result The object onto which to store the result.\n */\n public static fromDegrees(args: { longitude: number, latitude: number, height?: number }, result?: Cartographic) {\n return Cartographic.fromRadians({ longitude: Angle.degreesToRadians(args.longitude), latitude: Angle.degreesToRadians(args.latitude), height: args.height }, result);\n }\n\n /** Create a new Cartographic from longitude and latitude in [Angle]($geometry)s. The values in the resulting object will be in radians.\n * @param args an object containing a longitude, latitude, and an optional height property. The longitude and latitude properties are Angle objects. The height property, if specified, is a number which contains the height in meters above the ellipsoid; if undefined, this height will default to zero.\n * @param result The object into which to store the result (optional)\n */\n public static fromAngles(args: { longitude: Angle, latitude: Angle, height?: number }, result?: Cartographic) {\n return Cartographic.fromRadians({ longitude: args.longitude.radians, latitude: args.latitude.radians, height: args.height }, result);\n }\n\n private static _cartesianToCartographicN = new Point3d();\n private static _cartesianToCartographicP = new Point3d();\n private static _cartesianToCartographicH = new Vector3d();\n private static _wgs84OneOverRadii = new Point3d(1.0 / 6378137.0, 1.0 / 6378137.0, 1.0 / 6356752.3142451793);\n private static _wgs84OneOverRadiiSquared = new Point3d(1.0 / (6378137.0 * 6378137.0), 1.0 / (6378137.0 * 6378137.0), 1.0 / (6356752.3142451793 * 6356752.3142451793));\n private static _wgs84RadiiSquared = new Point3d(6378137.0 * 6378137.0, 6378137.0 * 6378137.0, 6356752.3142451793 * 6356752.3142451793);\n private static _wgs84CenterToleranceSquared = 0.1;\n private static _scratchN = new Vector3d();\n private static _scratchK = new Vector3d();\n\n /** Creates a new Cartographic from an [ECEF](https://en.wikipedia.org/wiki/ECEF) position.\n * @param cartesian The position, in ECEF, to convert to cartographic representation.\n * @param [result] The object onto which to store the result.\n * @returns The modified result parameter, new Cartographic instance if none was provided, or undefined if the cartesian is at the center of the ellipsoid.\n */\n public static fromEcef(cartesian: Point3d, result?: Cartographic): Cartographic | undefined {\n const oneOverRadiiSquared = Cartographic._wgs84OneOverRadiiSquared;\n const p = Cartographic.scalePointToGeodeticSurface(cartesian, Cartographic._cartesianToCartographicP);\n\n if (!p)\n return undefined;\n\n const n = Cartographic._cartesianToCartographicN;\n Cartographic.multiplyComponents(p, oneOverRadiiSquared, n);\n Cartographic.normalize(n, n);\n\n const h = p.vectorTo(cartesian, Cartographic._cartesianToCartographicH);\n const longitude = Math.atan2(n.y, n.x);\n const latitude = Math.asin(n.z);\n const height = Math.sign(h.dotProduct(cartesian)) * h.magnitude();\n\n if (!result)\n return new Cartographic(longitude, latitude, height);\n\n result.longitude = longitude;\n result.latitude = latitude;\n result.height = height;\n return result;\n }\n\n /** Scale point to geodetic surface\n * @param point in ECEF to scale to the surface\n * @param [result] The object onto which to store the result.\n * @returns a point on the geodetic surface\n */\n public static scalePointToGeodeticSurface(point: Point3d, result?: Point3d): Point3d | undefined {\n const oneOverRadii = Cartographic._wgs84OneOverRadii;\n const oneOverRadiiSquared = Cartographic._wgs84OneOverRadiiSquared;\n const centerToleranceSquared = Cartographic._wgs84CenterToleranceSquared;\n return Cartographic._scaleToGeodeticSurface(point, oneOverRadii, oneOverRadiiSquared, centerToleranceSquared, result);\n }\n\n /** Duplicates a Cartographic. */\n public clone(result?: Cartographic): Cartographic {\n if (!result)\n return new Cartographic(this.longitude, this.latitude, this.height);\n\n result.longitude = this.longitude;\n result.latitude = this.latitude;\n result.height = this.height;\n return result;\n }\n\n /** Return true if this Cartographic is the same as right */\n public equals(right: CartographicProps): boolean {\n return (this === right) ||\n ((this.longitude === right.longitude) &&\n (this.latitude === right.latitude) &&\n (this.height === right.height));\n }\n\n /** Compares this Cartographic component-wise and returns true if they are within the provided epsilon, */\n public equalsEpsilon(right: CartographicProps, epsilon: number): boolean {\n return (this === right) ||\n ((Math.abs(this.longitude - right.longitude) <= epsilon) &&\n (Math.abs(this.latitude - right.latitude) <= epsilon) &&\n (Math.abs(this.height - right.height) <= epsilon));\n }\n\n private static normalize(cartesian: XYZ, result: XYZ) {\n const magnitude = cartesian.magnitude();\n result.x = cartesian.x / magnitude;\n result.y = cartesian.y / magnitude;\n result.z = cartesian.z / magnitude;\n }\n\n private static multiplyComponents(left: XYAndZ, right: XYAndZ, result: XYZ) {\n result.x = left.x * right.x;\n result.y = left.y * right.y;\n result.z = left.z * right.z;\n }\n\n private static scalePoint(cartesian: XYAndZ, scalar: number, result: XYZ) {\n result.x = cartesian.x * scalar;\n result.y = cartesian.y * scalar;\n result.z = cartesian.z * scalar;\n }\n\n private static addPoints(left: XYAndZ, right: XYAndZ, result: XYZ) {\n result.x = left.x + right.x;\n result.y = left.y + right.y;\n result.z = left.z + right.z;\n }\n\n /** Create a string representing this cartographic in the format '(longitude, latitude, height)'. */\n public toString(): string { return `(${this.longitude}, ${this.latitude}, ${this.height})`; }\n\n private static _scaleToGeodeticSurfaceIntersection = new Point3d();\n private static _scaleToGeodeticSurfaceGradient = new Point3d();\n private static _scaleToGeodeticSurface(cartesian: Point3d, oneOverRadii: XYAndZ, oneOverRadiiSquared: XYAndZ, centerToleranceSquared: number, result?: Point3d) {\n const positionX = cartesian.x;\n const positionY = cartesian.y;\n const positionZ = cartesian.z;\n\n const oneOverRadiiX = oneOverRadii.x;\n const oneOverRadiiY = oneOverRadii.y;\n const oneOverRadiiZ = oneOverRadii.z;\n\n const x2 = positionX * positionX * oneOverRadiiX * oneOverRadiiX;\n const y2 = positionY * positionY * oneOverRadiiY * oneOverRadiiY;\n const z2 = positionZ * positionZ * oneOverRadiiZ * oneOverRadiiZ;\n\n // Compute the squared ellipsoid norm.\n const squaredNorm = x2 + y2 + z2;\n const ratio = Math.sqrt(1.0 / squaredNorm);\n\n // As an initial approximation, assume that the radial intersection is the projection point.\n const intersection = Cartographic._scaleToGeodeticSurfaceIntersection;\n Cartographic.scalePoint(cartesian, ratio, intersection);\n\n // If the position is near the center, the iteration will not converge.\n if (squaredNorm < centerToleranceSquared) {\n return !isFinite(ratio) ? undefined : Point3d.createFrom(intersection, result);\n }\n\n const oneOverRadiiSquaredX = oneOverRadiiSquared.x;\n const oneOverRadiiSquaredY = oneOverRadiiSquared.y;\n const oneOverRadiiSquaredZ = oneOverRadiiSquared.z;\n\n // Use the gradient at the intersection point in place of the true unit normal.\n // The difference in magnitude will be absorbed in the multiplier.\n const gradient = Cartographic._scaleToGeodeticSurfaceGradient;\n gradient.x = intersection.x * oneOverRadiiSquaredX * 2.0;\n gradient.y = intersection.y * oneOverRadiiSquaredY * 2.0;\n gradient.z = intersection.z * oneOverRadiiSquaredZ * 2.0;\n\n // Compute the initial guess at the normal vector multiplier, lambda.\n let lambda = (1.0 - ratio) * cartesian.magnitude() / (0.5 * gradient.magnitude());\n let correction = 0.0;\n let func;\n let denominator;\n let xMultiplier;\n let yMultiplier;\n let zMultiplier;\n let xMultiplier2;\n let yMultiplier2;\n let zMultiplier2;\n let xMultiplier3;\n let yMultiplier3;\n let zMultiplier3;\n\n do {\n lambda -= correction;\n\n xMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredX);\n yMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredY);\n zMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredZ);\n\n xMultiplier2 = xMultiplier * xMultiplier;\n yMultiplier2 = yMultiplier * yMultiplier;\n zMultiplier2 = zMultiplier * zMultiplier;\n\n xMultiplier3 = xMultiplier2 * xMultiplier;\n yMultiplier3 = yMultiplier2 * yMultiplier;\n zMultiplier3 = zMultiplier2 * zMultiplier;\n\n func = x2 * xMultiplier2 + y2 * yMultiplier2 + z2 * zMultiplier2 - 1.0;\n\n // \"denominator\" here refers to the use of this expression in the velocity and acceleration\n // computations in the sections to follow.\n denominator = x2 * xMultiplier3 * oneOverRadiiSquaredX + y2 * yMultiplier3 * oneOverRadiiSquaredY + z2 * zMultiplier3 * oneOverRadiiSquaredZ;\n\n const derivative = -2.0 * denominator;\n\n correction = func / derivative;\n } while (Math.abs(func) > 0.01);\n\n if (!result)\n return new Point3d(positionX * xMultiplier, positionY * yMultiplier, positionZ * zMultiplier);\n\n result.x = positionX * xMultiplier;\n result.y = positionY * yMultiplier;\n result.z = positionZ * zMultiplier;\n return result;\n }\n\n /** Return an ECEF point from a Cartographic point */\n public toEcef(result?: Point3d): Point3d {\n const cosLatitude = Math.cos(this.latitude);\n const scratchN = Cartographic._scratchN;\n const scratchK = Cartographic._scratchK;\n scratchN.x = cosLatitude * Math.cos(this.longitude);\n scratchN.y = cosLatitude * Math.sin(this.longitude);\n scratchN.z = Math.sin(this.latitude);\n Cartographic.normalize(scratchN, scratchN);\n\n Cartographic.multiplyComponents(Cartographic._wgs84RadiiSquared, scratchN, scratchK);\n const gamma = Math.sqrt(scratchN.dotProduct(scratchK));\n Cartographic.scalePoint(scratchK, 1.0 / gamma, scratchK);\n Cartographic.scalePoint(scratchN, this.height, scratchN);\n\n result = result ? result : new Point3d();\n Cartographic.addPoints(scratchK, scratchN, result);\n return result;\n }\n}\n/** A cartographic range representing a rectangular region if low longitude/latitude > high then area crossing seam is indicated.\n * @public\n */\nexport class CartographicRange {\n private _ranges: Range2d[] = [];\n\n // These following are used to preserve the min/max latitude and longitudes.\n // The longitudes are raw values and may cross over the -PI or 2PI boundaries.\n private _minLongitude = 0;\n private _maxLongitude = 0;\n private _minLatitude = 0;\n private _maxLatitude = 0;\n constructor(spatialRange: Range3d, spatialToEcef: Transform) {\n // Compute 8 corners in spatial coordinate system before converting to ECEF\n // We want a box oriented in the spatial coordinate system and not in the ECEF coordinate system\n const spatialCorners = spatialRange.corners();\n const ecefCorners = spatialToEcef.multiplyPoint3dArray(spatialCorners);\n let low: Cartographic | undefined, high: Cartographic | undefined;\n\n for (const ecefCorner of ecefCorners) {\n const geoPt = Cartographic.fromEcef(ecefCorner);\n if (!geoPt)\n continue;\n if (undefined === low || undefined === high) {\n low = geoPt;\n high = geoPt.clone();\n continue;\n }\n low.latitude = Math.min(low.latitude, geoPt.latitude);\n low.longitude = Math.min(low.longitude, geoPt.longitude);\n high.latitude = Math.max(high.latitude, geoPt.latitude);\n high.longitude = Math.max(high.longitude, geoPt.longitude);\n }\n\n if (!low || !high) {\n assert(false);\n return;\n }\n\n const longitudeRanges = [];\n this._minLongitude = Math.min(low.longitude, high.longitude), this._maxLongitude = Math.max(low.longitude, high.longitude);\n if (this._maxLongitude - this._minLongitude > Angle.piRadians) {\n longitudeRanges.push(Range1d.createXX(0.0, this._minLongitude));\n longitudeRanges.push(Range1d.createXX(this._maxLongitude, Angle.pi2Radians));\n } else {\n longitudeRanges.push(Range1d.createXX(this._minLongitude, this._maxLongitude));\n }\n\n for (const longitudeRange of longitudeRanges) {\n this._minLatitude = Math.min(low.latitude, high.latitude), this._maxLatitude = Math.max(low.latitude, high.latitude);\n if (this._maxLatitude - this._minLatitude > Angle.piOver2Radians) {\n this._ranges.push(Range2d.createXYXY(longitudeRange.low, 0.0, longitudeRange.high, this._minLatitude));\n this._ranges.push(Range2d.createXYXY(longitudeRange.low, this._maxLatitude, longitudeRange.high, Angle.piRadians));\n } else {\n this._ranges.push(Range2d.createXYXY(longitudeRange.low, this._minLatitude, longitudeRange.high, this._maxLatitude));\n }\n }\n }\n\n public intersectsRange(other: CartographicRange): boolean {\n for (const range of this._ranges)\n for (const otherRange of other._ranges)\n if (range.intersectsRange(otherRange))\n return true;\n return false;\n }\n\n /** This method returns the raw latitude / longitude for the range in a Range2d object.\n * The X value represents the longitude and the Y value the latitudes.\n * Y values are kept between -PI and +PI while\n * longitude values can be expressed in any range between -2PI to +2PI\n * given the minimum longitude is always smaller numerically than the maximum longitude.\n * Note that usually the longitudes are usually by convention in the range of -PI to PI except\n * for ranges that overlap the -PI/+PI frontier in which case either representation is acceptable.\n */\n public getLongitudeLatitudeBoundingBox(): Range2d {\n return Range2d.createXYXY(this._minLongitude, this._minLatitude, this._maxLongitude, this._maxLatitude);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Cartographic.js","sourceRoot":"","sources":["../../../src/geometry/Cartographic.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/** @packageDocumentation\r\n * @module Geometry\r\n */\r\n\r\nimport { Angle, Constant, Point3d, Range1d, Range2d, Range3d, Transform, Vector3d, XYAndZ, XYZ } from \"@itwin/core-geometry\";\r\nimport { assert } from \"@itwin/core-bentley\";\r\n\r\n// portions adapted from Cesium.js Copyright 2011 - 2017 Cesium Contributors\r\n\r\n/** The JSON representation of a Cartographic object.\r\n * @public\r\n **/\r\nexport interface CartographicProps {\r\n /** The longitude, specified in radians. */\r\n longitude: number;\r\n /** The latitude, specified in radians. */\r\n latitude: number;\r\n /** The height, specified in meters above the ellipsoid. */\r\n height: number;\r\n}\r\n\r\n/** A position on the earth defined by longitude, latitude, and height above the [WGS84](https://en.wikipedia.org/wiki/World_Geodetic_System) ellipsoid.\r\n * @public\r\n */\r\nexport class Cartographic implements CartographicProps {\r\n /**\r\n * @param longitude longitude, in radians.\r\n * @param latitude latitude, in radians.\r\n * @param height The height, in meters, above the ellipsoid.\r\n */\r\n private constructor(public longitude: number = 0, public latitude: number = 0, public height: number = 0) { }\r\n\r\n /** Create a Cartographic object with longitude, latitude, and height of zero. */\r\n public static createZero() {\r\n return new Cartographic(0, 0, 0);\r\n }\r\n\r\n /** Create a new Cartographic from longitude and latitude specified in radians.\r\n * @param args an object containing a longitude, latitude, and an optional height property. The longitude and latitude properties are numbers specified in radians. The height property, if specified, is a number which contains the height in meters above the ellipsoid; if undefined, this height will default to zero.\r\n * @param result The object onto which to store the result.\r\n */\r\n public static fromRadians(args: { longitude: number, latitude: number, height?: number }, result?: Cartographic) {\r\n if (!result)\r\n return new Cartographic(args.longitude, args.latitude, args.height);\r\n\r\n result.longitude = args.longitude;\r\n result.latitude = args.latitude;\r\n result.height = args.height !== undefined ? args.height : 0;\r\n return result;\r\n }\r\n\r\n /** Create a JSON representation of a Cartographic object. */\r\n public toJSON(): CartographicProps {\r\n return {\r\n latitude: this.latitude,\r\n longitude: this.longitude,\r\n height: this.height,\r\n };\r\n }\r\n\r\n /** Freeze this Cartographic */\r\n public freeze(): Readonly<this> {\r\n return Object.freeze(this);\r\n }\r\n\r\n /** longitude, in degrees */\r\n public get longitudeDegrees() {\r\n return Angle.radiansToDegrees(this.longitude);\r\n }\r\n\r\n /** latitude, in degrees */\r\n public get latitudeDegrees() {\r\n return Angle.radiansToDegrees(this.latitude);\r\n }\r\n\r\n private static _oneMinusF = 1 - (Constant.earthRadiusWGS84.equator - Constant.earthRadiusWGS84.polar) / Constant.earthRadiusWGS84.equator;\r\n private static _equatorOverPolar = Constant.earthRadiusWGS84.equator / Constant.earthRadiusWGS84.polar;\r\n /** return the geocentric latitude angle for the input geodetic latitude angle (both in radians).\r\n * @param geodeticLatitude geodetic latitude angle in radians\r\n */\r\n public static geocentricLatitudeFromGeodeticLatitude(geodeticLatitude: number): number {\r\n return Math.atan(Cartographic._oneMinusF * Cartographic._oneMinusF * Math.tan(geodeticLatitude));\r\n }\r\n /** return the parametric latitude angle for the input geodetic latitude angle (both in radians). The parametric latitude\r\n * is appropriate for input to the Ellipsoid methods.\r\n * @param geodeticLatitude geodetic latitude angle in radians\r\n */\r\n public static parametricLatitudeFromGeodeticLatitude(geodeticLatitude: number): number {\r\n return Math.atan(Cartographic._oneMinusF * Cartographic._oneMinusF * Cartographic._equatorOverPolar * Math.tan(geodeticLatitude));\r\n }\r\n\r\n /** Create a new Cartographic from longitude and latitude specified in degrees. The values in the resulting object will be in radians.\r\n * @param args an object containing a longitude, latitude, and an optional height property. The longitude and latitude properties are numbers specified in degrees. The height property, if specified, is a number which contains the height in meters above the ellipsoid; if undefined, this height will default to zero.\r\n * @param result The object onto which to store the result.\r\n */\r\n public static fromDegrees(args: { longitude: number, latitude: number, height?: number }, result?: Cartographic) {\r\n return Cartographic.fromRadians({ longitude: Angle.degreesToRadians(args.longitude), latitude: Angle.degreesToRadians(args.latitude), height: args.height }, result);\r\n }\r\n\r\n /** Create a new Cartographic from longitude and latitude in [Angle]($geometry)s. The values in the resulting object will be in radians.\r\n * @param args an object containing a longitude, latitude, and an optional height property. The longitude and latitude properties are Angle objects. The height property, if specified, is a number which contains the height in meters above the ellipsoid; if undefined, this height will default to zero.\r\n * @param result The object into which to store the result (optional)\r\n */\r\n public static fromAngles(args: { longitude: Angle, latitude: Angle, height?: number }, result?: Cartographic) {\r\n return Cartographic.fromRadians({ longitude: args.longitude.radians, latitude: args.latitude.radians, height: args.height }, result);\r\n }\r\n\r\n private static _cartesianToCartographicN = new Point3d();\r\n private static _cartesianToCartographicP = new Point3d();\r\n private static _cartesianToCartographicH = new Vector3d();\r\n private static _wgs84OneOverRadii = new Point3d(1.0 / 6378137.0, 1.0 / 6378137.0, 1.0 / 6356752.3142451793);\r\n private static _wgs84OneOverRadiiSquared = new Point3d(1.0 / (6378137.0 * 6378137.0), 1.0 / (6378137.0 * 6378137.0), 1.0 / (6356752.3142451793 * 6356752.3142451793));\r\n private static _wgs84RadiiSquared = new Point3d(6378137.0 * 6378137.0, 6378137.0 * 6378137.0, 6356752.3142451793 * 6356752.3142451793);\r\n private static _wgs84CenterToleranceSquared = 0.1;\r\n private static _scratchN = new Vector3d();\r\n private static _scratchK = new Vector3d();\r\n\r\n /** Creates a new Cartographic from an [ECEF](https://en.wikipedia.org/wiki/ECEF) position.\r\n * @param cartesian The position, in ECEF, to convert to cartographic representation.\r\n * @param [result] The object onto which to store the result.\r\n * @returns The modified result parameter, new Cartographic instance if none was provided, or undefined if the cartesian is at the center of the ellipsoid.\r\n */\r\n public static fromEcef(cartesian: Point3d, result?: Cartographic): Cartographic | undefined {\r\n const oneOverRadiiSquared = Cartographic._wgs84OneOverRadiiSquared;\r\n const p = Cartographic.scalePointToGeodeticSurface(cartesian, Cartographic._cartesianToCartographicP);\r\n\r\n if (!p)\r\n return undefined;\r\n\r\n const n = Cartographic._cartesianToCartographicN;\r\n Cartographic.multiplyComponents(p, oneOverRadiiSquared, n);\r\n Cartographic.normalize(n, n);\r\n\r\n const h = p.vectorTo(cartesian, Cartographic._cartesianToCartographicH);\r\n const longitude = Math.atan2(n.y, n.x);\r\n const latitude = Math.asin(n.z);\r\n const height = Math.sign(h.dotProduct(cartesian)) * h.magnitude();\r\n\r\n if (!result)\r\n return new Cartographic(longitude, latitude, height);\r\n\r\n result.longitude = longitude;\r\n result.latitude = latitude;\r\n result.height = height;\r\n return result;\r\n }\r\n\r\n /** Scale point to geodetic surface\r\n * @param point in ECEF to scale to the surface\r\n * @param [result] The object onto which to store the result.\r\n * @returns a point on the geodetic surface\r\n */\r\n public static scalePointToGeodeticSurface(point: Point3d, result?: Point3d): Point3d | undefined {\r\n const oneOverRadii = Cartographic._wgs84OneOverRadii;\r\n const oneOverRadiiSquared = Cartographic._wgs84OneOverRadiiSquared;\r\n const centerToleranceSquared = Cartographic._wgs84CenterToleranceSquared;\r\n return Cartographic._scaleToGeodeticSurface(point, oneOverRadii, oneOverRadiiSquared, centerToleranceSquared, result);\r\n }\r\n\r\n /** Duplicates a Cartographic. */\r\n public clone(result?: Cartographic): Cartographic {\r\n if (!result)\r\n return new Cartographic(this.longitude, this.latitude, this.height);\r\n\r\n result.longitude = this.longitude;\r\n result.latitude = this.latitude;\r\n result.height = this.height;\r\n return result;\r\n }\r\n\r\n /** Return true if this Cartographic is the same as right */\r\n public equals(right: CartographicProps): boolean {\r\n return (this === right) ||\r\n ((this.longitude === right.longitude) &&\r\n (this.latitude === right.latitude) &&\r\n (this.height === right.height));\r\n }\r\n\r\n /** Compares this Cartographic component-wise and returns true if they are within the provided epsilon, */\r\n public equalsEpsilon(right: CartographicProps, epsilon: number): boolean {\r\n return (this === right) ||\r\n ((Math.abs(this.longitude - right.longitude) <= epsilon) &&\r\n (Math.abs(this.latitude - right.latitude) <= epsilon) &&\r\n (Math.abs(this.height - right.height) <= epsilon));\r\n }\r\n\r\n private static normalize(cartesian: XYZ, result: XYZ) {\r\n const magnitude = cartesian.magnitude();\r\n result.x = cartesian.x / magnitude;\r\n result.y = cartesian.y / magnitude;\r\n result.z = cartesian.z / magnitude;\r\n }\r\n\r\n private static multiplyComponents(left: XYAndZ, right: XYAndZ, result: XYZ) {\r\n result.x = left.x * right.x;\r\n result.y = left.y * right.y;\r\n result.z = left.z * right.z;\r\n }\r\n\r\n private static scalePoint(cartesian: XYAndZ, scalar: number, result: XYZ) {\r\n result.x = cartesian.x * scalar;\r\n result.y = cartesian.y * scalar;\r\n result.z = cartesian.z * scalar;\r\n }\r\n\r\n private static addPoints(left: XYAndZ, right: XYAndZ, result: XYZ) {\r\n result.x = left.x + right.x;\r\n result.y = left.y + right.y;\r\n result.z = left.z + right.z;\r\n }\r\n\r\n /** Create a string representing this cartographic in the format '(longitude, latitude, height)'. */\r\n public toString(): string { return `(${this.longitude}, ${this.latitude}, ${this.height})`; }\r\n\r\n private static _scaleToGeodeticSurfaceIntersection = new Point3d();\r\n private static _scaleToGeodeticSurfaceGradient = new Point3d();\r\n private static _scaleToGeodeticSurface(cartesian: Point3d, oneOverRadii: XYAndZ, oneOverRadiiSquared: XYAndZ, centerToleranceSquared: number, result?: Point3d) {\r\n const positionX = cartesian.x;\r\n const positionY = cartesian.y;\r\n const positionZ = cartesian.z;\r\n\r\n const oneOverRadiiX = oneOverRadii.x;\r\n const oneOverRadiiY = oneOverRadii.y;\r\n const oneOverRadiiZ = oneOverRadii.z;\r\n\r\n const x2 = positionX * positionX * oneOverRadiiX * oneOverRadiiX;\r\n const y2 = positionY * positionY * oneOverRadiiY * oneOverRadiiY;\r\n const z2 = positionZ * positionZ * oneOverRadiiZ * oneOverRadiiZ;\r\n\r\n // Compute the squared ellipsoid norm.\r\n const squaredNorm = x2 + y2 + z2;\r\n const ratio = Math.sqrt(1.0 / squaredNorm);\r\n\r\n // As an initial approximation, assume that the radial intersection is the projection point.\r\n const intersection = Cartographic._scaleToGeodeticSurfaceIntersection;\r\n Cartographic.scalePoint(cartesian, ratio, intersection);\r\n\r\n // If the position is near the center, the iteration will not converge.\r\n if (squaredNorm < centerToleranceSquared) {\r\n return !isFinite(ratio) ? undefined : Point3d.createFrom(intersection, result);\r\n }\r\n\r\n const oneOverRadiiSquaredX = oneOverRadiiSquared.x;\r\n const oneOverRadiiSquaredY = oneOverRadiiSquared.y;\r\n const oneOverRadiiSquaredZ = oneOverRadiiSquared.z;\r\n\r\n // Use the gradient at the intersection point in place of the true unit normal.\r\n // The difference in magnitude will be absorbed in the multiplier.\r\n const gradient = Cartographic._scaleToGeodeticSurfaceGradient;\r\n gradient.x = intersection.x * oneOverRadiiSquaredX * 2.0;\r\n gradient.y = intersection.y * oneOverRadiiSquaredY * 2.0;\r\n gradient.z = intersection.z * oneOverRadiiSquaredZ * 2.0;\r\n\r\n // Compute the initial guess at the normal vector multiplier, lambda.\r\n let lambda = (1.0 - ratio) * cartesian.magnitude() / (0.5 * gradient.magnitude());\r\n let correction = 0.0;\r\n let func;\r\n let denominator;\r\n let xMultiplier;\r\n let yMultiplier;\r\n let zMultiplier;\r\n let xMultiplier2;\r\n let yMultiplier2;\r\n let zMultiplier2;\r\n let xMultiplier3;\r\n let yMultiplier3;\r\n let zMultiplier3;\r\n\r\n do {\r\n lambda -= correction;\r\n\r\n xMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredX);\r\n yMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredY);\r\n zMultiplier = 1.0 / (1.0 + lambda * oneOverRadiiSquaredZ);\r\n\r\n xMultiplier2 = xMultiplier * xMultiplier;\r\n yMultiplier2 = yMultiplier * yMultiplier;\r\n zMultiplier2 = zMultiplier * zMultiplier;\r\n\r\n xMultiplier3 = xMultiplier2 * xMultiplier;\r\n yMultiplier3 = yMultiplier2 * yMultiplier;\r\n zMultiplier3 = zMultiplier2 * zMultiplier;\r\n\r\n func = x2 * xMultiplier2 + y2 * yMultiplier2 + z2 * zMultiplier2 - 1.0;\r\n\r\n // \"denominator\" here refers to the use of this expression in the velocity and acceleration\r\n // computations in the sections to follow.\r\n denominator = x2 * xMultiplier3 * oneOverRadiiSquaredX + y2 * yMultiplier3 * oneOverRadiiSquaredY + z2 * zMultiplier3 * oneOverRadiiSquaredZ;\r\n\r\n const derivative = -2.0 * denominator;\r\n\r\n correction = func / derivative;\r\n } while (Math.abs(func) > 0.01);\r\n\r\n if (!result)\r\n return new Point3d(positionX * xMultiplier, positionY * yMultiplier, positionZ * zMultiplier);\r\n\r\n result.x = positionX * xMultiplier;\r\n result.y = positionY * yMultiplier;\r\n result.z = positionZ * zMultiplier;\r\n return result;\r\n }\r\n\r\n /** Return an ECEF point from a Cartographic point */\r\n public toEcef(result?: Point3d): Point3d {\r\n const cosLatitude = Math.cos(this.latitude);\r\n const scratchN = Cartographic._scratchN;\r\n const scratchK = Cartographic._scratchK;\r\n scratchN.x = cosLatitude * Math.cos(this.longitude);\r\n scratchN.y = cosLatitude * Math.sin(this.longitude);\r\n scratchN.z = Math.sin(this.latitude);\r\n Cartographic.normalize(scratchN, scratchN);\r\n\r\n Cartographic.multiplyComponents(Cartographic._wgs84RadiiSquared, scratchN, scratchK);\r\n const gamma = Math.sqrt(scratchN.dotProduct(scratchK));\r\n Cartographic.scalePoint(scratchK, 1.0 / gamma, scratchK);\r\n Cartographic.scalePoint(scratchN, this.height, scratchN);\r\n\r\n result = result ? result : new Point3d();\r\n Cartographic.addPoints(scratchK, scratchN, result);\r\n return result;\r\n }\r\n}\r\n/** A cartographic range representing a rectangular region if low longitude/latitude > high then area crossing seam is indicated.\r\n * @public\r\n */\r\nexport class CartographicRange {\r\n private _ranges: Range2d[] = [];\r\n\r\n // These following are used to preserve the min/max latitude and longitudes.\r\n // The longitudes are raw values and may cross over the -PI or 2PI boundaries.\r\n private _minLongitude = 0;\r\n private _maxLongitude = 0;\r\n private _minLatitude = 0;\r\n private _maxLatitude = 0;\r\n constructor(spatialRange: Range3d, spatialToEcef: Transform) {\r\n // Compute 8 corners in spatial coordinate system before converting to ECEF\r\n // We want a box oriented in the spatial coordinate system and not in the ECEF coordinate system\r\n const spatialCorners = spatialRange.corners();\r\n const ecefCorners = spatialToEcef.multiplyPoint3dArray(spatialCorners);\r\n let low: Cartographic | undefined, high: Cartographic | undefined;\r\n\r\n for (const ecefCorner of ecefCorners) {\r\n const geoPt = Cartographic.fromEcef(ecefCorner);\r\n if (!geoPt)\r\n continue;\r\n if (undefined === low || undefined === high) {\r\n low = geoPt;\r\n high = geoPt.clone();\r\n continue;\r\n }\r\n low.latitude = Math.min(low.latitude, geoPt.latitude);\r\n low.longitude = Math.min(low.longitude, geoPt.longitude);\r\n high.latitude = Math.max(high.latitude, geoPt.latitude);\r\n high.longitude = Math.max(high.longitude, geoPt.longitude);\r\n }\r\n\r\n if (!low || !high) {\r\n assert(false);\r\n return;\r\n }\r\n\r\n const longitudeRanges = [];\r\n this._minLongitude = Math.min(low.longitude, high.longitude), this._maxLongitude = Math.max(low.longitude, high.longitude);\r\n if (this._maxLongitude - this._minLongitude > Angle.piRadians) {\r\n longitudeRanges.push(Range1d.createXX(0.0, this._minLongitude));\r\n longitudeRanges.push(Range1d.createXX(this._maxLongitude, Angle.pi2Radians));\r\n } else {\r\n longitudeRanges.push(Range1d.createXX(this._minLongitude, this._maxLongitude));\r\n }\r\n\r\n for (const longitudeRange of longitudeRanges) {\r\n this._minLatitude = Math.min(low.latitude, high.latitude), this._maxLatitude = Math.max(low.latitude, high.latitude);\r\n if (this._maxLatitude - this._minLatitude > Angle.piOver2Radians) {\r\n this._ranges.push(Range2d.createXYXY(longitudeRange.low, 0.0, longitudeRange.high, this._minLatitude));\r\n this._ranges.push(Range2d.createXYXY(longitudeRange.low, this._maxLatitude, longitudeRange.high, Angle.piRadians));\r\n } else {\r\n this._ranges.push(Range2d.createXYXY(longitudeRange.low, this._minLatitude, longitudeRange.high, this._maxLatitude));\r\n }\r\n }\r\n }\r\n\r\n public intersectsRange(other: CartographicRange): boolean {\r\n for (const range of this._ranges)\r\n for (const otherRange of other._ranges)\r\n if (range.intersectsRange(otherRange))\r\n return true;\r\n return false;\r\n }\r\n\r\n /** This method returns the raw latitude / longitude for the range in a Range2d object.\r\n * The X value represents the longitude and the Y value the latitudes.\r\n * Y values are kept between -PI and +PI while\r\n * longitude values can be expressed in any range between -2PI to +2PI\r\n * given the minimum longitude is always smaller numerically than the maximum longitude.\r\n * Note that usually the longitudes are usually by convention in the range of -PI to PI except\r\n * for ranges that overlap the -PI/+PI frontier in which case either representation is acceptable.\r\n */\r\n public getLongitudeLatitudeBoundingBox(): Range2d {\r\n return Range2d.createXYXY(this._minLongitude, this._minLatitude, this._maxLongitude, this._maxLatitude);\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CoordinateReferenceSystem.js","sourceRoot":"","sources":["../../../src/geometry/CoordinateReferenceSystem.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/** @packageDocumentation\n * @module Geometry\n */\n// cspell:ignore NAVD, NGVD\n\nimport { GeodeticDatum, GeodeticDatumProps } from \"./GeodeticDatum\";\nimport { GeodeticEllipsoid, GeodeticEllipsoidProps } from \"./GeodeticEllipsoid\";\nimport { Carto2DDegrees, Carto2DDegreesProps, Projection, ProjectionProps } from \"./Projection\";\nimport { AdditionalTransform, AdditionalTransformProps } from \"./AdditionalTransform\";\n/** This type indicates possible linear and angular units supported.\n * @public\n*/\nexport type UnitType = \"Meter\" | \"InternationalFoot\" | \"USSurveyFoot\" | \"Degree\" | \"Unsupported\";\n\n/** The extent in latitude, longitude bounds where a horizontal CRS is applicable\n * @public\n*/\nexport interface HorizontalCRSExtentProps {\n /** The South West point in latitude and longitude in degrees for the user-defined extent of the CRS */\n southWest: Carto2DDegreesProps;\n /** The North East point in latitude in longitude in degrees for the user-defined extent of the CRS.\n The latitude of the North East must be greater or equal to the latitude of the South West point\n It is possible, however, for the longitude of the South West corner to have greater value than the\n longitude of the North East point such as when the west longitude is located on the other side\n of the -180/180 degree longitude line.*/\n northEast: Carto2DDegreesProps;\n}\n\n/** The extent in latitude, longitude bounds where a horizontal CRS is applicable\n * @public\n */\nexport class HorizontalCRSExtent implements HorizontalCRSExtentProps {\n /** The latitude minimum and maximum for the user-defined extent of the CRS */\n public readonly southWest: Carto2DDegrees;\n /** The North East point in latitude in longitude in degrees for the user-defined extent of the CRS.\n The latitude of the North East must be greater or equal to the latitude of the South West point\n It is possible, however, for the longitude of the South West corner to have greater value than the\n longitude of the North East point such as when the west longitude is located on the other side\n of the -180/180 degree longitude line.*/\n public readonly northEast: Carto2DDegrees;\n\n public constructor(data?: HorizontalCRSExtentProps) {\n if (data) {\n this.southWest = Carto2DDegrees.fromJSON(data.southWest);\n this.northEast = Carto2DDegrees.fromJSON(data.northEast);\n if (this.northEast.latitude < this.southWest.latitude)\n this.northEast.latitude = this.southWest.latitude;\n } else {\n this.southWest = new Carto2DDegrees();\n this.northEast = new Carto2DDegrees();\n }\n }\n\n /** Creates an extent object from JSON representation.\n * @public */\n public static fromJSON(data: HorizontalCRSExtentProps): HorizontalCRSExtent {\n return new HorizontalCRSExtent(data);\n }\n\n /** Creates a JSON from the Extent definition\n * @public */\n public toJSON(): HorizontalCRSExtentProps {\n return { southWest: this.southWest.toJSON(), northEast: this.northEast.toJSON() };\n }\n\n /** Compares two Extents. It applies a minuscule tolerance to comparing numbers.\n * @public */\n public equals(other: HorizontalCRSExtent): boolean {\n return this.southWest.equals(other.southWest) && this.northEast.equals(other.northEast);\n }\n}\n\n/** Horizontal Geographic Coordinate Reference System definition\n * @public\n */\nexport interface HorizontalCRSProps {\n /** The identifier of the horizontal CRS as stored in the dictionary or the service database */\n id?: string;\n /** Used only for user-defined definitions that will typically use a GUID as id. A display name for the CRS that allows\n * a human to understand the nature of the definition\n */\n name?: string;\n /** Description */\n description?: string;\n /** A textual description of the source of the CRS definition. */\n source?: string;\n /** If true then indicates the definition is deprecated. It should then be used for backward compatibility only.\n * If false or undefined then the definition is not deprecated.\n */\n deprecated?: boolean;\n /** The EPSG code of the CRS. If undefined then there is no EPSG code associated. */\n epsg?: number;\n /** The identifier of the geodetic datum as stored in the dictionary or the service database. */\n datumId?: string;\n /** The complete definition of the geodetic datum referred to by datumId. It can also be used if the datum is not stored\n * in either service or dictionary.\n */\n datum?: GeodeticDatumProps;\n /** The identifier of the geodetic ellipsoid as stored in the dictionary or the service database. This property is exclusive\n * of having datumId and datum properties undefined.\n */\n ellipsoidId?: string;\n /** The complete definition of the geodetic datum referred to by datumId. It can also be used if the datum is not stored\n * in either service or dictionary\n */\n ellipsoid?: GeodeticEllipsoidProps;\n /** The text indicating the unit used. */\n unit?: UnitType;\n /** Projection including projection parameters. */\n projection?: ProjectionProps;\n /** Extent representing the domain of application of the CRS. */\n extent?: HorizontalCRSExtentProps;\n}\n\n/** Horizontal Geographic Coordinate reference System implementation.\n * An horizontal CRS defines the portion which is horizontal to the Earth surface (within the deformation brought by the projection process).\n * There are two major classes of Horizontal Coordinate Reference Systems:\n * - The projected CRS which rely on a projection to flatten the coordinate system space into axises using linear\n * units (meter, US Survey Feet, ...) relative to some origin.\n * - The non projected CRS (also named geographic CRS by EPSG nomenclature) that does\n * not require a projection (projection method = None) and horizontal coordinates are expressed\n * as longitude and latitude (see [[Cartographic]])\n * Horizontal Coordinate Systems rely on a projection to flatten the surface of an ellipsoid (see [[GeodeticEllipsoid]]) which is\n * the mathematical model of the Earth surface.\n * Explanations in more details of the various concepts can be obtained from other sources including the page on the subject\n * on itwinJS.org (see https://www.itwinjs.org/learning/geolocation/?term=coordinate+system).\n * A few details are still required to grasp the model. Geographic Coordinate Reference Systems rely on the concept of geodetic datums\n * (see [[GeodeticDatum]]) to convert latitude/longitude from one frame of reference to another. Such geodetic datum will bind the ellipsoid\n * and possibly define transformation steps required to convert from the currently used geodetic datum to the common datum WGS84\n * used for worldwide data (such as most popular imagery data sources). If there are no rules established to convert to WGS84\n * or if those rules are secret then the horizontal CRS can be datum-less and must make direct use of the ellipsoid\n * to define the earth surface.\n * For this purpose either the geodetic datum must be specified using either datumId or datum properties or both. If\n * both these values are undefined then it is possible to define the ellipsoid using properties ellipsoidId or ellipsoid or both.\n * These two pairs of properties are mutually exclusive with datum related properties having precedence. If a datum or datumId is set then\n * ellipsoid properties will automatically be undefined. If datumId or datum is defined then attempts to set ellipsoidId or ellipsoid\n * will fail silently, the values remaining undefined. The ellipsoidId will not be a repeat of the ellipsoidId property part of the\n * geodetic datum definition.\n * @public\n */\nexport class HorizontalCRS implements HorizontalCRSProps {\n /** The identifier of the horizontal CRS as stored in the dictionary or the service database */\n public readonly id?: string;\n /** Used only for user-defined definitions that will typically use a GUID as id. A display name for the CRS that allows\n ** a human to understand the nature of the definition\n */\n public readonly name?: string;\n /** Description */\n public readonly description?: string;\n /** The source of the CRS definition. */\n public readonly source?: string;\n /** If true then indicates the definition is deprecated. It should then be used for backward compatibility only.\n * If false then the definition is not deprecated. Default is false.\n */\n public readonly deprecated: boolean;\n /** The EPSG code of the CRS. If undefined then there is no EPSG code associated. */\n public readonly epsg?: number;\n /** The identifier of the geodetic datum as stored in the dictionary or the service database. */\n public readonly datumId?: string;\n /** The complete definition of the geodetic datum referred to by datumId. It can also be used if the datum is not stored\n * in either service or dictionary.\n */\n public readonly datum?: GeodeticDatum;\n\n /** The identifier of the geodetic ellipsoid as stored in the dictionary or the service database. This property is exclusive\n * of having datumId and datum properties undefined.\n */\n public readonly ellipsoidId?: string;\n /** The complete definition of the geodetic ellipsoid referred to by ellipsoidId. It can also be used if the ellipsoid is not stored\n * in either service or dictionary. This property is exclusive\n * of having datumId and datum properties undefined.\n */\n public readonly ellipsoid?: GeodeticEllipsoid;\n /** The text indicating the unit used. */\n public readonly unit?: UnitType;\n /** Projection including projection parameters. */\n public readonly projection?: Projection;\n /** Extent representing the domain of application of the CRS. */\n public readonly extent?: HorizontalCRSExtent;\n\n public constructor(_data?: HorizontalCRSProps) {\n this.deprecated = false;\n if (_data) {\n this.id = _data.id;\n this.description = _data.description;\n this.source = _data.source;\n this.deprecated = _data.deprecated ?? false;\n this.epsg = _data.epsg;\n this.datumId = _data.datumId;\n this.datum = _data.datum ? GeodeticDatum.fromJSON(_data.datum) : undefined;\n if (!this.datumId && !this.datum) {\n this.ellipsoidId = _data.ellipsoidId;\n this.ellipsoid = _data.ellipsoid ? GeodeticEllipsoid.fromJSON(_data.ellipsoid) : undefined;\n }\n this.unit = _data.unit;\n this.projection = _data.projection ? Projection.fromJSON(_data.projection) : undefined;\n this.extent = _data.extent ? HorizontalCRSExtent.fromJSON(_data.extent) : undefined;\n }\n }\n\n /** Creates an Horizontal CRS from JSON representation.\n * @public */\n public static fromJSON(data: HorizontalCRSProps): HorizontalCRS {\n return new HorizontalCRS(data);\n }\n\n /** Creates a JSON from the Horizontal CRS definition\n * @public */\n public toJSON(): HorizontalCRSProps {\n const data: HorizontalCRSProps = {};\n data.id = this.id;\n data.description = this.description;\n data.source = this.source;\n /* We prefer to use the default undef instead of false value for deprecated in Json */\n if (this.deprecated)\n data.deprecated = true;\n\n data.epsg = this.epsg;\n data.datumId = this.datumId;\n if (this.datum)\n data.datum = this.datum.toJSON();\n\n data.ellipsoidId = this.ellipsoidId;\n if (this.ellipsoid)\n data.ellipsoid = this.ellipsoid.toJSON();\n\n data.unit = this.unit;\n if (this.projection)\n data.projection = this.projection.toJSON();\n\n if (this.extent)\n data.extent = this.extent.toJSON();\n\n return data;\n }\n\n /** Compares two horizontal CRS. It is not an equivalence test as descriptive properties are also compared\n * but number compares are applied a minuscule tolerance.\n * @public */\n public equals(other: HorizontalCRS): boolean {\n if (this.id !== other.id ||\n this.description !== other.description ||\n this.source !== other.source ||\n this.deprecated !== other.deprecated ||\n this.epsg !== other.epsg ||\n this.datumId !== other.datumId ||\n this.ellipsoidId !== other.ellipsoidId ||\n this.unit !== other.unit)\n return false;\n\n if ((this.datum === undefined) !== (other.datum === undefined))\n return false;\n\n if (this.datum && !this.datum.equals(other.datum!))\n return false;\n\n if ((this.ellipsoid === undefined) !== (other.ellipsoid === undefined))\n return false;\n\n if (this.ellipsoid && !this.ellipsoid.equals(other.ellipsoid!))\n return false;\n\n if ((this.projection === undefined) !== (other.projection === undefined))\n return false;\n\n if (this.projection && !this.projection.equals(other.projection!))\n return false;\n\n if ((this.extent === undefined) !== (other.extent === undefined))\n return false;\n\n if (this.extent && !this.extent.equals(other.extent!))\n return false;\n\n return true;\n }\n}\n\n/** Vertical Geographic Coordinate reference System definition\n * @public\n */\nexport interface VerticalCRSProps {\n /** Vertical CRS Key name. */\n id: \"GEOID\" | \"ELLIPSOID\" | \"NGVD29\" | \"NAVD88\";\n}\n\n/** Vertical Coordinate reference System implementation.\n * The VerticalCRS contains currently a single identifier property of string type. Although\n * we currently only support four distinct key values \"GEOID\", \"ELLIPSOID\", \"NAVD88\" and \"NGVD29\"\n * we expect to support a broader set in the future including, eventually, user defined vertical CRS\n * which will require additional parameters to be added.\n * @public\n*/\nexport class VerticalCRS implements VerticalCRSProps {\n /** Vertical CRS Key name. The only supported values are currently \"GEOID\", \"ELLIPSOID\", \"NAVD88\" and \"NGVD29\". The default is ELLIPSOID */\n public readonly id: \"GEOID\" | \"ELLIPSOID\" | \"NGVD29\" | \"NAVD88\";\n\n public constructor(data?: VerticalCRSProps) {\n this.id = \"ELLIPSOID\";\n if (data)\n this.id = data.id;\n }\n\n /** Creates a Vertical CRS from JSON representation.\n * @public */\n public static fromJSON(data: VerticalCRSProps): VerticalCRS {\n return new VerticalCRS(data);\n }\n\n /** Creates a JSON from the Vertical CRS definition\n * @public */\n public toJSON(): VerticalCRSProps {\n return { id: this.id };\n }\n\n /** Compares two vertical CRS.\n * @public */\n public equals(other: VerticalCRS): boolean {\n return (this.id === other.id);\n }\n}\n\n/** Geographic Coordinate Reference System definition that includes both the horizontal and vertical definitions\n * @public\n */\nexport interface GeographicCRSProps {\n /** The horizontal portion of the geographic coordinate reference system. */\n horizontalCRS?: HorizontalCRSProps;\n /** The vertical portion of the geographic coordinate reference system. */\n verticalCRS?: VerticalCRSProps;\n /** The optional additional transform the geographic coordinate reference system. */\n additionalTransform?: AdditionalTransformProps;\n}\n\n/** Geographic Coordinate Reference System implementation. This is the class that indicates the definition of a Geographic\n * coordinate reference system comprised of two components: Horizontal and Vertical.\n * The vertical component (see [[VerticalCRS]]) is the simplest being formed of a simple identifier as a string.\n * The horizontal component contains a list of identification and documentation properties as well as\n * defining details possibly including the projection with method and parameters, the definition of the datum, ellipsoid, extent and so on.\n * The principle of describing a Geographic CRS is that the definition may be incomplete. The whole set of classes related to geographic\n * coordinate reference system classes ([[GeodeticEllipsoid]], [[GeodeticDatum]], [[Projection]], [[GeodeticTransform]], ...) are designed\n * so that they can be parsed from incomplete JSON fragments, or produce incomplete JSON fragments such as would be\n * generated from a request to a REST API to a server when select OData clauses are used.\n * Often GeographicCRS would knowingly be created incomplete but with sufficient information to perform conversion from some\n * reprojection engine (the present set of classes do not provide any GeographicCRS conversion).\n * For example the following definitions are quite sufficient to request conversion to or from by a reprojection engine:\n * { horizontalCRS: {id: \"LL84\"}, verticalCRS: {id:\"GEOID\"}\n * or\n * { horizontalCRS: {datumId: \"WGS84\", projection: {method: \"None\"}}, verticalCRS: \"ELLIPSOID\"}\n * The reprojection engine will use the engine internal dictionary to obtain the details if it can.\n * Some definitions will originate from other sources (a parsed WKT for example) and the reprojection engine will require\n * all mathematical and operational details to perform any conversion (descriptive information are ignored in the conversion process).\n * @note In the absence of the verticalCRS property then ELLIPSOID (Geodetic elevation) will be assumed by reprojection engines.\n * @note see important detailed explanation in the [[HorizontalCRS]] documentation.\n * @note Earth Centered, Earth Fixed coordinate system (ECEF) is a full 3D cartesian system that unambiguously\n * expressed coordinates relative to the Earth Center. Since there is no horizontal portion independent from\n * the vertical portion this system cannot be represented by a GeographicCRS and remains a separate concept.\n * @public\n*/\nexport class GeographicCRS implements GeographicCRSProps {\n /** The horizontal portion of the geographic coordinate reference system. */\n public readonly horizontalCRS?: HorizontalCRS;\n /** The vertical portion of the geographic coordinate reference system. */\n public readonly verticalCRS?: VerticalCRS;\n /** The optional additional transform the geographic coordinate reference system. */\n public readonly additionalTransform?: AdditionalTransform;\n\n public constructor(data?: GeographicCRSProps) {\n if (data) {\n this.horizontalCRS = data.horizontalCRS ? HorizontalCRS.fromJSON(data.horizontalCRS) : undefined;\n this.verticalCRS = data.verticalCRS ? VerticalCRS.fromJSON(data.verticalCRS) : undefined;\n this.additionalTransform = data.additionalTransform ? AdditionalTransform.fromJSON(data.additionalTransform) : undefined;\n }\n }\n\n /** Creates a Geographic CRS from JSON representation.\n * @public */\n public static fromJSON(data: GeographicCRSProps): GeographicCRS {\n return new GeographicCRS(data);\n }\n\n /** Creates a JSON from the Geographic CRS definition\n * @public */\n public toJSON(): GeographicCRSProps {\n const data: GeographicCRSProps = {};\n if (this.horizontalCRS)\n data.horizontalCRS = this.horizontalCRS.toJSON();\n\n if (this.verticalCRS)\n data.verticalCRS = this.verticalCRS.toJSON();\n\n if (this.additionalTransform)\n data.additionalTransform = this.additionalTransform.toJSON();\n\n return data;\n }\n\n /** Compares two Geographic CRS. It is a strict compare operation not an equivalence test though\n * number compares are applied a minuscule tolerance.\n * It takes into account descriptive properties not only mathematical definition properties.\n * @public\n */\n public equals(other: GeographicCRS): boolean {\n if ((this.horizontalCRS === undefined) !== (other.horizontalCRS === undefined))\n return false;\n\n if (this.horizontalCRS && !this.horizontalCRS.equals(other.horizontalCRS!))\n return false;\n\n if ((this.verticalCRS === undefined) !== (other.verticalCRS === undefined))\n return false;\n\n if (this.verticalCRS && !this.verticalCRS.equals(other.verticalCRS!))\n return false;\n\n if ((this.additionalTransform === undefined) !== (other.additionalTransform === undefined))\n return false;\n\n if (this.additionalTransform && !this.additionalTransform.equals(other.additionalTransform!))\n return false;\n\n return true;\n }\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"CoordinateReferenceSystem.js","sourceRoot":"","sources":["../../../src/geometry/CoordinateReferenceSystem.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/** @packageDocumentation\r\n * @module Geometry\r\n */\r\n// cspell:ignore NAVD, NGVD\r\n\r\nimport { GeodeticDatum, GeodeticDatumProps } from \"./GeodeticDatum\";\r\nimport { GeodeticEllipsoid, GeodeticEllipsoidProps } from \"./GeodeticEllipsoid\";\r\nimport { Carto2DDegrees, Carto2DDegreesProps, Projection, ProjectionProps } from \"./Projection\";\r\nimport { AdditionalTransform, AdditionalTransformProps } from \"./AdditionalTransform\";\r\n/** This type indicates possible linear and angular units supported.\r\n * @public\r\n*/\r\nexport type UnitType = \"Meter\" | \"InternationalFoot\" | \"USSurveyFoot\" | \"Degree\" | \"Unsupported\";\r\n\r\n/** The extent in latitude, longitude bounds where a horizontal CRS is applicable\r\n * @public\r\n*/\r\nexport interface HorizontalCRSExtentProps {\r\n /** The South West point in latitude and longitude in degrees for the user-defined extent of the CRS */\r\n southWest: Carto2DDegreesProps;\r\n /** The North East point in latitude in longitude in degrees for the user-defined extent of the CRS.\r\n The latitude of the North East must be greater or equal to the latitude of the South West point\r\n It is possible, however, for the longitude of the South West corner to have greater value than the\r\n longitude of the North East point such as when the west longitude is located on the other side\r\n of the -180/180 degree longitude line.*/\r\n northEast: Carto2DDegreesProps;\r\n}\r\n\r\n/** The extent in latitude, longitude bounds where a horizontal CRS is applicable\r\n * @public\r\n */\r\nexport class HorizontalCRSExtent implements HorizontalCRSExtentProps {\r\n /** The latitude minimum and maximum for the user-defined extent of the CRS */\r\n public readonly southWest: Carto2DDegrees;\r\n /** The North East point in latitude in longitude in degrees for the user-defined extent of the CRS.\r\n The latitude of the North East must be greater or equal to the latitude of the South West point\r\n It is possible, however, for the longitude of the South West corner to have greater value than the\r\n longitude of the North East point such as when the west longitude is located on the other side\r\n of the -180/180 degree longitude line.*/\r\n public readonly northEast: Carto2DDegrees;\r\n\r\n public constructor(data?: HorizontalCRSExtentProps) {\r\n if (data) {\r\n this.southWest = Carto2DDegrees.fromJSON(data.southWest);\r\n this.northEast = Carto2DDegrees.fromJSON(data.northEast);\r\n if (this.northEast.latitude < this.southWest.latitude)\r\n this.northEast.latitude = this.southWest.latitude;\r\n } else {\r\n this.southWest = new Carto2DDegrees();\r\n this.northEast = new Carto2DDegrees();\r\n }\r\n }\r\n\r\n /** Creates an extent object from JSON representation.\r\n * @public */\r\n public static fromJSON(data: HorizontalCRSExtentProps): HorizontalCRSExtent {\r\n return new HorizontalCRSExtent(data);\r\n }\r\n\r\n /** Creates a JSON from the Extent definition\r\n * @public */\r\n public toJSON(): HorizontalCRSExtentProps {\r\n return { southWest: this.southWest.toJSON(), northEast: this.northEast.toJSON() };\r\n }\r\n\r\n /** Compares two Extents. It applies a minuscule tolerance to comparing numbers.\r\n * @public */\r\n public equals(other: HorizontalCRSExtent): boolean {\r\n return this.southWest.equals(other.southWest) && this.northEast.equals(other.northEast);\r\n }\r\n}\r\n\r\n/** Horizontal Geographic Coordinate Reference System definition\r\n * @public\r\n */\r\nexport interface HorizontalCRSProps {\r\n /** The identifier of the horizontal CRS as stored in the dictionary or the service database */\r\n id?: string;\r\n /** Used only for user-defined definitions that will typically use a GUID as id. A display name for the CRS that allows\r\n * a human to understand the nature of the definition\r\n */\r\n name?: string;\r\n /** Description */\r\n description?: string;\r\n /** A textual description of the source of the CRS definition. */\r\n source?: string;\r\n /** If true then indicates the definition is deprecated. It should then be used for backward compatibility only.\r\n * If false or undefined then the definition is not deprecated.\r\n */\r\n deprecated?: boolean;\r\n /** The EPSG code of the CRS. If undefined then there is no EPSG code associated. */\r\n epsg?: number;\r\n /** The identifier of the geodetic datum as stored in the dictionary or the service database. */\r\n datumId?: string;\r\n /** The complete definition of the geodetic datum referred to by datumId. It can also be used if the datum is not stored\r\n * in either service or dictionary.\r\n */\r\n datum?: GeodeticDatumProps;\r\n /** The identifier of the geodetic ellipsoid as stored in the dictionary or the service database. This property is exclusive\r\n * of having datumId and datum properties undefined.\r\n */\r\n ellipsoidId?: string;\r\n /** The complete definition of the geodetic datum referred to by datumId. It can also be used if the datum is not stored\r\n * in either service or dictionary\r\n */\r\n ellipsoid?: GeodeticEllipsoidProps;\r\n /** The text indicating the unit used. */\r\n unit?: UnitType;\r\n /** Projection including projection parameters. */\r\n projection?: ProjectionProps;\r\n /** Extent representing the domain of application of the CRS. */\r\n extent?: HorizontalCRSExtentProps;\r\n}\r\n\r\n/** Horizontal Geographic Coordinate reference System implementation.\r\n * An horizontal CRS defines the portion which is horizontal to the Earth surface (within the deformation brought by the projection process).\r\n * There are two major classes of Horizontal Coordinate Reference Systems:\r\n * - The projected CRS which rely on a projection to flatten the coordinate system space into axises using linear\r\n * units (meter, US Survey Feet, ...) relative to some origin.\r\n * - The non projected CRS (also named geographic CRS by EPSG nomenclature) that does\r\n * not require a projection (projection method = None) and horizontal coordinates are expressed\r\n * as longitude and latitude (see [[Cartographic]])\r\n * Horizontal Coordinate Systems rely on a projection to flatten the surface of an ellipsoid (see [[GeodeticEllipsoid]]) which is\r\n * the mathematical model of the Earth surface.\r\n * Explanations in more details of the various concepts can be obtained from other sources including the page on the subject\r\n * on itwinJS.org (see https://www.itwinjs.org/learning/geolocation/?term=coordinate+system).\r\n * A few details are still required to grasp the model. Geographic Coordinate Reference Systems rely on the concept of geodetic datums\r\n * (see [[GeodeticDatum]]) to convert latitude/longitude from one frame of reference to another. Such geodetic datum will bind the ellipsoid\r\n * and possibly define transformation steps required to convert from the currently used geodetic datum to the common datum WGS84\r\n * used for worldwide data (such as most popular imagery data sources). If there are no rules established to convert to WGS84\r\n * or if those rules are secret then the horizontal CRS can be datum-less and must make direct use of the ellipsoid\r\n * to define the earth surface.\r\n * For this purpose either the geodetic datum must be specified using either datumId or datum properties or both. If\r\n * both these values are undefined then it is possible to define the ellipsoid using properties ellipsoidId or ellipsoid or both.\r\n * These two pairs of properties are mutually exclusive with datum related properties having precedence. If a datum or datumId is set then\r\n * ellipsoid properties will automatically be undefined. If datumId or datum is defined then attempts to set ellipsoidId or ellipsoid\r\n * will fail silently, the values remaining undefined. The ellipsoidId will not be a repeat of the ellipsoidId property part of the\r\n * geodetic datum definition.\r\n * @public\r\n */\r\nexport class HorizontalCRS implements HorizontalCRSProps {\r\n /** The identifier of the horizontal CRS as stored in the dictionary or the service database */\r\n public readonly id?: string;\r\n /** Used only for user-defined definitions that will typically use a GUID as id. A display name for the CRS that allows\r\n ** a human to understand the nature of the definition\r\n */\r\n public readonly name?: string;\r\n /** Description */\r\n public readonly description?: string;\r\n /** The source of the CRS definition. */\r\n public readonly source?: string;\r\n /** If true then indicates the definition is deprecated. It should then be used for backward compatibility only.\r\n * If false then the definition is not deprecated. Default is false.\r\n */\r\n public readonly deprecated: boolean;\r\n /** The EPSG code of the CRS. If undefined then there is no EPSG code associated. */\r\n public readonly epsg?: number;\r\n /** The identifier of the geodetic datum as stored in the dictionary or the service database. */\r\n public readonly datumId?: string;\r\n /** The complete definition of the geodetic datum referred to by datumId. It can also be used if the datum is not stored\r\n * in either service or dictionary.\r\n */\r\n public readonly datum?: GeodeticDatum;\r\n\r\n /** The identifier of the geodetic ellipsoid as stored in the dictionary or the service database. This property is exclusive\r\n * of having datumId and datum properties undefined.\r\n */\r\n public readonly ellipsoidId?: string;\r\n /** The complete definition of the geodetic ellipsoid referred to by ellipsoidId. It can also be used if the ellipsoid is not stored\r\n * in either service or dictionary. This property is exclusive\r\n * of having datumId and datum properties undefined.\r\n */\r\n public readonly ellipsoid?: GeodeticEllipsoid;\r\n /** The text indicating the unit used. */\r\n public readonly unit?: UnitType;\r\n /** Projection including projection parameters. */\r\n public readonly projection?: Projection;\r\n /** Extent representing the domain of application of the CRS. */\r\n public readonly extent?: HorizontalCRSExtent;\r\n\r\n public constructor(_data?: HorizontalCRSProps) {\r\n this.deprecated = false;\r\n if (_data) {\r\n this.id = _data.id;\r\n this.description = _data.description;\r\n this.source = _data.source;\r\n this.deprecated = _data.deprecated ?? false;\r\n this.epsg = _data.epsg;\r\n this.datumId = _data.datumId;\r\n this.datum = _data.datum ? GeodeticDatum.fromJSON(_data.datum) : undefined;\r\n if (!this.datumId && !this.datum) {\r\n this.ellipsoidId = _data.ellipsoidId;\r\n this.ellipsoid = _data.ellipsoid ? GeodeticEllipsoid.fromJSON(_data.ellipsoid) : undefined;\r\n }\r\n this.unit = _data.unit;\r\n this.projection = _data.projection ? Projection.fromJSON(_data.projection) : undefined;\r\n this.extent = _data.extent ? HorizontalCRSExtent.fromJSON(_data.extent) : undefined;\r\n }\r\n }\r\n\r\n /** Creates an Horizontal CRS from JSON representation.\r\n * @public */\r\n public static fromJSON(data: HorizontalCRSProps): HorizontalCRS {\r\n return new HorizontalCRS(data);\r\n }\r\n\r\n /** Creates a JSON from the Horizontal CRS definition\r\n * @public */\r\n public toJSON(): HorizontalCRSProps {\r\n const data: HorizontalCRSProps = {};\r\n data.id = this.id;\r\n data.description = this.description;\r\n data.source = this.source;\r\n /* We prefer to use the default undef instead of false value for deprecated in Json */\r\n if (this.deprecated)\r\n data.deprecated = true;\r\n\r\n data.epsg = this.epsg;\r\n data.datumId = this.datumId;\r\n if (this.datum)\r\n data.datum = this.datum.toJSON();\r\n\r\n data.ellipsoidId = this.ellipsoidId;\r\n if (this.ellipsoid)\r\n data.ellipsoid = this.ellipsoid.toJSON();\r\n\r\n data.unit = this.unit;\r\n if (this.projection)\r\n data.projection = this.projection.toJSON();\r\n\r\n if (this.extent)\r\n data.extent = this.extent.toJSON();\r\n\r\n return data;\r\n }\r\n\r\n /** Compares two horizontal CRS. It is not an equivalence test as descriptive properties are also compared\r\n * but number compares are applied a minuscule tolerance.\r\n * @public */\r\n public equals(other: HorizontalCRS): boolean {\r\n if (this.id !== other.id ||\r\n this.description !== other.description ||\r\n this.source !== other.source ||\r\n this.deprecated !== other.deprecated ||\r\n this.epsg !== other.epsg ||\r\n this.datumId !== other.datumId ||\r\n this.ellipsoidId !== other.ellipsoidId ||\r\n this.unit !== other.unit)\r\n return false;\r\n\r\n if ((this.datum === undefined) !== (other.datum === undefined))\r\n return false;\r\n\r\n if (this.datum && !this.datum.equals(other.datum!))\r\n return false;\r\n\r\n if ((this.ellipsoid === undefined) !== (other.ellipsoid === undefined))\r\n return false;\r\n\r\n if (this.ellipsoid && !this.ellipsoid.equals(other.ellipsoid!))\r\n return false;\r\n\r\n if ((this.projection === undefined) !== (other.projection === undefined))\r\n return false;\r\n\r\n if (this.projection && !this.projection.equals(other.projection!))\r\n return false;\r\n\r\n if ((this.extent === undefined) !== (other.extent === undefined))\r\n return false;\r\n\r\n if (this.extent && !this.extent.equals(other.extent!))\r\n return false;\r\n\r\n return true;\r\n }\r\n}\r\n\r\n/** Vertical Geographic Coordinate reference System definition\r\n * @public\r\n */\r\nexport interface VerticalCRSProps {\r\n /** Vertical CRS Key name. */\r\n id: \"GEOID\" | \"ELLIPSOID\" | \"NGVD29\" | \"NAVD88\";\r\n}\r\n\r\n/** Vertical Coordinate reference System implementation.\r\n * The VerticalCRS contains currently a single identifier property of string type. Although\r\n * we currently only support four distinct key values \"GEOID\", \"ELLIPSOID\", \"NAVD88\" and \"NGVD29\"\r\n * we expect to support a broader set in the future including, eventually, user defined vertical CRS\r\n * which will require additional parameters to be added.\r\n * @public\r\n*/\r\nexport class VerticalCRS implements VerticalCRSProps {\r\n /** Vertical CRS Key name. The only supported values are currently \"GEOID\", \"ELLIPSOID\", \"NAVD88\" and \"NGVD29\". The default is ELLIPSOID */\r\n public readonly id: \"GEOID\" | \"ELLIPSOID\" | \"NGVD29\" | \"NAVD88\";\r\n\r\n public constructor(data?: VerticalCRSProps) {\r\n this.id = \"ELLIPSOID\";\r\n if (data)\r\n this.id = data.id;\r\n }\r\n\r\n /** Creates a Vertical CRS from JSON representation.\r\n * @public */\r\n public static fromJSON(data: VerticalCRSProps): VerticalCRS {\r\n return new VerticalCRS(data);\r\n }\r\n\r\n /** Creates a JSON from the Vertical CRS definition\r\n * @public */\r\n public toJSON(): VerticalCRSProps {\r\n return { id: this.id };\r\n }\r\n\r\n /** Compares two vertical CRS.\r\n * @public */\r\n public equals(other: VerticalCRS): boolean {\r\n return (this.id === other.id);\r\n }\r\n}\r\n\r\n/** Geographic Coordinate Reference System definition that includes both the horizontal and vertical definitions\r\n * @public\r\n */\r\nexport interface GeographicCRSProps {\r\n /** The horizontal portion of the geographic coordinate reference system. */\r\n horizontalCRS?: HorizontalCRSProps;\r\n /** The vertical portion of the geographic coordinate reference system. */\r\n verticalCRS?: VerticalCRSProps;\r\n /** The optional additional transform the geographic coordinate reference system. */\r\n additionalTransform?: AdditionalTransformProps;\r\n}\r\n\r\n/** Geographic Coordinate Reference System implementation. This is the class that indicates the definition of a Geographic\r\n * coordinate reference system comprised of two components: Horizontal and Vertical.\r\n * The vertical component (see [[VerticalCRS]]) is the simplest being formed of a simple identifier as a string.\r\n * The horizontal component contains a list of identification and documentation properties as well as\r\n * defining details possibly including the projection with method and parameters, the definition of the datum, ellipsoid, extent and so on.\r\n * The principle of describing a Geographic CRS is that the definition may be incomplete. The whole set of classes related to geographic\r\n * coordinate reference system classes ([[GeodeticEllipsoid]], [[GeodeticDatum]], [[Projection]], [[GeodeticTransform]], ...) are designed\r\n * so that they can be parsed from incomplete JSON fragments, or produce incomplete JSON fragments such as would be\r\n * generated from a request to a REST API to a server when select OData clauses are used.\r\n * Often GeographicCRS would knowingly be created incomplete but with sufficient information to perform conversion from some\r\n * reprojection engine (the present set of classes do not provide any GeographicCRS conversion).\r\n * For example the following definitions are quite sufficient to request conversion to or from by a reprojection engine:\r\n * { horizontalCRS: {id: \"LL84\"}, verticalCRS: {id:\"GEOID\"}\r\n * or\r\n * { horizontalCRS: {datumId: \"WGS84\", projection: {method: \"None\"}}, verticalCRS: \"ELLIPSOID\"}\r\n * The reprojection engine will use the engine internal dictionary to obtain the details if it can.\r\n * Some definitions will originate from other sources (a parsed WKT for example) and the reprojection engine will require\r\n * all mathematical and operational details to perform any conversion (descriptive information are ignored in the conversion process).\r\n * @note In the absence of the verticalCRS property then ELLIPSOID (Geodetic elevation) will be assumed by reprojection engines.\r\n * @note see important detailed explanation in the [[HorizontalCRS]] documentation.\r\n * @note Earth Centered, Earth Fixed coordinate system (ECEF) is a full 3D cartesian system that unambiguously\r\n * expressed coordinates relative to the Earth Center. Since there is no horizontal portion independent from\r\n * the vertical portion this system cannot be represented by a GeographicCRS and remains a separate concept.\r\n * @public\r\n*/\r\nexport class GeographicCRS implements GeographicCRSProps {\r\n /** The horizontal portion of the geographic coordinate reference system. */\r\n public readonly horizontalCRS?: HorizontalCRS;\r\n /** The vertical portion of the geographic coordinate reference system. */\r\n public readonly verticalCRS?: VerticalCRS;\r\n /** The optional additional transform the geographic coordinate reference system. */\r\n public readonly additionalTransform?: AdditionalTransform;\r\n\r\n public constructor(data?: GeographicCRSProps) {\r\n if (data) {\r\n this.horizontalCRS = data.horizontalCRS ? HorizontalCRS.fromJSON(data.horizontalCRS) : undefined;\r\n this.verticalCRS = data.verticalCRS ? VerticalCRS.fromJSON(data.verticalCRS) : undefined;\r\n this.additionalTransform = data.additionalTransform ? AdditionalTransform.fromJSON(data.additionalTransform) : undefined;\r\n }\r\n }\r\n\r\n /** Creates a Geographic CRS from JSON representation.\r\n * @public */\r\n public static fromJSON(data: GeographicCRSProps): GeographicCRS {\r\n return new GeographicCRS(data);\r\n }\r\n\r\n /** Creates a JSON from the Geographic CRS definition\r\n * @public */\r\n public toJSON(): GeographicCRSProps {\r\n const data: GeographicCRSProps = {};\r\n if (this.horizontalCRS)\r\n data.horizontalCRS = this.horizontalCRS.toJSON();\r\n\r\n if (this.verticalCRS)\r\n data.verticalCRS = this.verticalCRS.toJSON();\r\n\r\n if (this.additionalTransform)\r\n data.additionalTransform = this.additionalTransform.toJSON();\r\n\r\n return data;\r\n }\r\n\r\n /** Compares two Geographic CRS. It is a strict compare operation not an equivalence test though\r\n * number compares are applied a minuscule tolerance.\r\n * It takes into account descriptive properties not only mathematical definition properties.\r\n * @public\r\n */\r\n public equals(other: GeographicCRS): boolean {\r\n if ((this.horizontalCRS === undefined) !== (other.horizontalCRS === undefined))\r\n return false;\r\n\r\n if (this.horizontalCRS && !this.horizontalCRS.equals(other.horizontalCRS!))\r\n return false;\r\n\r\n if ((this.verticalCRS === undefined) !== (other.verticalCRS === undefined))\r\n return false;\r\n\r\n if (this.verticalCRS && !this.verticalCRS.equals(other.verticalCRS!))\r\n return false;\r\n\r\n if ((this.additionalTransform === undefined) !== (other.additionalTransform === undefined))\r\n return false;\r\n\r\n if (this.additionalTransform && !this.additionalTransform.equals(other.additionalTransform!))\r\n return false;\r\n\r\n return true;\r\n }\r\n}\r\n\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeodeticDatum.js","sourceRoot":"","sources":["../../../src/geometry/GeodeticDatum.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/** @packageDocumentation\n * @module Geometry\n */\n// cspell:ignore JSONXYZ, ETRF, OSGB, DHDN, NADCON, GEOCN\n\nimport { Geometry, Vector3d, XYAndZ } from \"@itwin/core-geometry\";\nimport { GeodeticEllipsoid, GeodeticEllipsoidProps } from \"./GeodeticEllipsoid\";\n\n/** Holds 3 components of a Positional Vector rotation definition in arc seconds\n * @public\n */\nexport interface XyzRotationProps {\n /** X rotation component in arc second */\n x: number;\n /** Y rotation component in arc second*/\n y: number;\n /** Z rotation component in arc second*/\n z: number;\n}\n\n/** Hold 3 components data of a Positional Vector rotation definition in arc seconds\n * @public\n */\nexport class XyzRotation implements XyzRotationProps {\n /** X rotation component in arc second */\n public readonly x!: number;\n /** Y rotation component in arc second*/\n public readonly y!: number;\n /** Z rotation component in arc second*/\n public readonly z!: number;\n\n public constructor(data?: XyzRotationProps) {\n if (data) {\n this.x = data.x;\n this.y = data.y;\n this.z = data.z;\n }\n }\n\n /** Creates a Rotations object from JSON representation.\n * @public */\n public static fromJSON(data: XyzRotationProps): XyzRotation {\n return new XyzRotation(data);\n }\n\n /** Creates a JSON from the Rotations definition\n * @public */\n public toJSON(): XyzRotationProps {\n return { x: this.x, y: this.y, z: this.z };\n }\n\n /** Compares two geodetic rotations. It applies a minuscule angular tolerance\n * @public */\n public equals(other: XyzRotation): boolean {\n return (Math.abs(this.x - other.x) < Geometry.smallAngleSeconds &&\n Math.abs(this.y - other.y) < Geometry.smallAngleSeconds &&\n Math.abs(this.z - other.z) < Geometry.smallAngleSeconds);\n }\n}\n\n/** Type indicating the geodetic transformation method\n * @public\n */\nexport type GeodeticTransformMethod =\n \"None\" |\n \"Geocentric\" |\n \"PositionalVector\" |\n \"GridFiles\" |\n \"MultipleRegression\" |\n \"Undefined\";\n\n/** This interface represents a geocentric (three parameters) geodetic transformation.\n * @public\n */\nexport interface GeocentricTransformProps {\n /** The frame translation components in meters */\n delta: XYAndZ;\n}\n\n/** This class represents a geocentric (three parameters) geodetic transformation.\n * @public\n */\nexport class GeocentricTransform implements GeocentricTransformProps {\n /** The frame translation components in meters */\n public readonly delta: Vector3d;\n\n public constructor(data?: GeocentricTransformProps) {\n this.delta = data ? Vector3d.fromJSON(data.delta) : new Vector3d();\n }\n\n /** Creates a Geocentric Transform from JSON representation.\n * @public */\n public static fromJSON(data: GeocentricTransformProps): GeocentricTransform {\n return new GeocentricTransform(data);\n }\n\n /** Creates a JSON from the Geodetic GeocentricTransform definition\n * @public */\n public toJSON(): GeocentricTransformProps {\n return { delta: { x: this.delta.x, y: this.delta.y, z: this.delta.z } };\n }\n\n /** Compares two geodetic transforms. It applies a minuscule tolerance.\n * @public */\n public equals(other: GeocentricTransform): boolean {\n return (Math.abs(this.delta.x - other.delta.x) < Geometry.smallMetricDistance &&\n Math.abs(this.delta.y - other.delta.y) < Geometry.smallMetricDistance &&\n Math.abs(this.delta.z - other.delta.z) < Geometry.smallMetricDistance);\n }\n}\n\n/** This interface represents a positional vector (seven parameters) geodetic transformation corresponding to\n * EPSG operation 9606. Beware that the convention relative to rotation direction is different\n * from the Coordinate Frame operation (epsg 9607).\n * @public\n */\nexport interface PositionalVectorTransformProps {\n /** The frame translation components in meters */\n delta: XYAndZ;\n /** The frame rotation components in arc seconds. The rotation sign convention is the one associated with\n * the operation EPSG:9606 following recommendation of ISO 19111 specifications */\n rotation: XyzRotationProps;\n /** Scale in parts per million. The scale effectively applied will be 1 plus scale divided by 1 000 000. */\n scalePPM: number;\n}\n\n/** This class represents a positional vector (seven parameters) geodetic transformation corresponding to\n * EPSG operation 9606. Beware that the convention relative to rotation direction is different\n * from the Coordinate Frame operation (epsg 9607).\n * @public\n */\nexport class PositionalVectorTransform implements PositionalVectorTransformProps {\n /** The frame translation components in meters */\n public readonly delta!: Vector3d;\n /** The frame rotation components in arc seconds. The rotation sign convention is the one associated with\n * the operation EPSG:9606 following recommendation of ISO 19111 specifications */\n public readonly rotation!: XyzRotation;\n /** Scale in parts per million. The scale effectively applied will be 1 plus scale divided by 1 000 000. */\n public readonly scalePPM!: number;\n\n public constructor(data?: PositionalVectorTransformProps) {\n if (data) {\n this.delta = data.delta ? Vector3d.fromJSON(data.delta) : new Vector3d();\n this.rotation = data.rotation ? XyzRotation.fromJSON(data.rotation) : new XyzRotation();\n this.scalePPM = data.scalePPM;\n }\n }\n\n /** Creates a Positional Vector Transform from JSON representation.\n * @public */\n public static fromJSON(data: PositionalVectorTransformProps): PositionalVectorTransform {\n return new PositionalVectorTransform(data);\n }\n\n /** Creates a JSON from the Positional Vector Transform definition\n * @public */\n public toJSON(): PositionalVectorTransformProps {\n return {\n delta: { x: this.delta.x, y: this.delta.y, z: this.delta.z },\n rotation: this.rotation.toJSON(),\n scalePPM: this.scalePPM,\n };\n }\n\n /** Compares two Positional Vector Transforms. It applies a minuscule tolerance to number compares.\n * @public */\n public equals(other: PositionalVectorTransform): boolean {\n if (Math.abs(this.delta.x - other.delta.x) > Geometry.smallMetricDistance ||\n Math.abs(this.delta.y - other.delta.y) > Geometry.smallMetricDistance ||\n Math.abs(this.delta.z - other.delta.z) > Geometry.smallMetricDistance ||\n Math.abs(this.scalePPM - other.scalePPM) > Geometry.smallFraction)\n return false;\n\n return this.rotation.equals(other.rotation);\n }\n}\n\n/** Type indicating the file format of the grid files.\n * @public\n */\nexport type GridFileFormat =\n \"NONE\" |\n \"NTv1\" |\n \"NTv2\" |\n \"NADCON\" |\n \"FRENCH\" |\n \"JAPAN\" |\n \"ATS77\" |\n \"GEOCN\";\n\n/** type to indicate the grid file application direction.\n * @public\n */\nexport type GridFileDirection = \"Direct\" | \"Inverse\";\n\n/** Grid file definition containing name of the file, the format and the direction it should be applied\n * @public\n */\nexport interface GridFileDefinitionProps {\n /** Name of the grid shift file. This name is relative to the expected dictionary root document.\n * Typical grid shift file name will contain first the country name it applies to then possibly some sub path.\n * Example of existing grid files:\n * Germany/BETA2007.gsb or Brazil/SAD69_003.GSB but sometimes longer paths USA/NADCON/conus.l*s\n * Note that the file name can contain wildcards when the format requires more than one file. For example\n * the NADCON format makes use of a different file for latitude and longitude shifts thus the .l*s extension in the\n * file name above.\n * Forward slash is always used to separate the path components.\n */\n fileName: string;\n /** The grid file format */\n format: GridFileFormat;\n /** The grid file application direction */\n direction: GridFileDirection;\n}\n\n/** Grid file definition containing name of the file, the format and the direction it should be applied\n * @public\n */\nexport class GridFileDefinition implements GridFileDefinitionProps {\n /** Name of the grid shift file. This name is relative to the expected dictionary root document.\n * Typical grid shift file name will contain first the country name it applies to then possibly some sub path.\n * Example of existing grid files:\n * Germany/BETA2007.gsb or Brazil/SAD69_003.GSB but sometimes longer paths USA/NADCON/conus.l*s\n * Note that the file name can contain wildcards when the format requires more than one file. For example\n * the NADCON format makes use of a different file for latitude and longitude shifts thus the .l*s extension in the\n * file name above.\n * Forward slash is always used to separate the path components.\n */\n public readonly fileName: string;\n /** The grid file format */\n public readonly format: GridFileFormat;\n /** The grid file application direction */\n public readonly direction: GridFileDirection;\n\n public constructor(data?: GridFileDefinitionProps) {\n this.fileName = data ? data.fileName : \"\";\n this.format = data ? data.format : \"NTv2\";\n this.direction = data ? data.direction : \"Direct\";\n }\n\n /** Creates a Grid File Definition from JSON representation.\n * @public */\n public static fromJSON(data: GridFileDefinitionProps): GridFileDefinition {\n return new GridFileDefinition(data);\n }\n\n /** Creates a JSON from the Grid File Definition\n * @public */\n public toJSON(): GridFileDefinitionProps {\n return { fileName: this.fileName, format: this.format, direction: this.direction };\n }\n\n /** Compares two grid file definition. It is a strict compare operation not an equivalence test.\n * @public */\n public equals(other: GridFileDefinition): boolean {\n return (this.fileName === other.fileName && this.direction === other.direction && this.format === other.format);\n }\n}\n\n/** This interface represents a grid files based geodetic transformation.\n * @public\n */\nexport interface GridFileTransformProps {\n /** The list of grid files. The order of file is meaningful, the first encountered that covers the extent of coordinate\n * transformation will be used. */\n files: GridFileDefinitionProps[];\n /** The positional vector fallback transformation used for extents not covered by the grid files */\n fallback?: PositionalVectorTransformProps;\n}\n\n/** This class represents a grid files based geodetic transformation.\n * @public\n */\nexport class GridFileTransform implements GridFileTransformProps {\n /** The list of grid files. The order of file is meaningful, the first encountered that covers the extent of coordinate\n * transformation will be used. */\n public readonly files: GridFileDefinition[];\n /** The positional vector fallback transformation used for extents not covered by the grid files */\n public readonly fallback?: PositionalVectorTransform;\n\n public constructor(data?: GridFileTransformProps) {\n this.files = [];\n if (data) {\n this.fallback = data.fallback ? PositionalVectorTransform.fromJSON(data.fallback) : undefined;\n if (Array.isArray(data.files)) {\n this.files = [];\n for (const item of data.files)\n this.files.push(GridFileDefinition.fromJSON(item));\n }\n }\n }\n\n /** Creates a Grid File Transform from JSON representation.\n * @public */\n public static fromJSON(data: GridFileTransformProps): GridFileTransform {\n return new GridFileTransform(data);\n }\n\n /** Creates a JSON from the Grid File Transform definition\n * @public */\n public toJSON(): GridFileTransformProps {\n const data: GridFileTransformProps = { files: [] };\n data.fallback = this.fallback ? this.fallback.toJSON() : undefined;\n if (Array.isArray(this.files)) {\n for (const item of this.files)\n data.files.push(item.toJSON());\n }\n return data;\n }\n\n /** Compares two Grid File Transforms. It is a strict compare operation not an equivalence test.\n * @public */\n public equals(other: GridFileTransform): boolean {\n if (this.files.length !== other.files.length)\n return false;\n\n for (let idx = 0; idx < this.files.length; ++idx)\n if (!this.files[idx].equals(other.files[idx]))\n return false;\n\n if ((this.fallback === undefined) !== (other.fallback === undefined))\n return false;\n\n if (this.fallback && !this.fallback.equals(other.fallback!))\n return false;\n\n return true;\n }\n}\n\n/** This interface represents a geodetic transformation that enables transforming longitude/latitude coordinates\n * from one datum to another.\n * @public\n */\nexport interface GeodeticTransformProps {\n /** The method used by the geodetic transform */\n method: GeodeticTransformMethod;\n /** The complete definition of the source geodetic ellipsoid referred to by ellipsoidId.\n * The source ellipsoid identifier enables obtaining the shape of the Earth mathematical model\n * for the purpose of performing the transformation.\n */\n sourceEllipsoid?: GeodeticEllipsoidProps;\n /** The complete definition of the target geodetic ellipsoid referred to by ellipsoidId.\n * The target ellipsoid identifier enables obtaining the shape of the Earth mathematical model\n * for the purpose of performing the transformation.*/\n targetEllipsoid?: GeodeticEllipsoidProps;\n /** When method is Geocentric this property contains the geocentric parameters */\n geocentric?: GeocentricTransformProps;\n /** When method is PositionalVector this property contains the positional vector parameters */\n positionalVector?: PositionalVectorTransformProps;\n /** When method is GridFiles this property contains the grid files parameters */\n gridFile?: GridFileTransformProps;\n}\n\n/** This class represents a geodetic transformation that enables transforming longitude/latitude coordinates\n * from one datum to another.\n * @public\n */\nexport class GeodeticTransform implements GeodeticTransformProps {\n /** The method used by the geodetic transform */\n public readonly method: GeodeticTransformMethod;\n /** The identifier of the source geodetic datum as stored in the dictionary or the service database.\n * This identifier is optional and informational only.\n */\n public readonly sourceEllipsoid?: GeodeticEllipsoid;\n /** The complete definition of the target geodetic ellipsoid referred to by ellipsoidId.\n * The target ellipsoid identifier enables obtaining the shape of the Earth mathematical model\n * for the purpose of performing the transformation.*/\n public readonly targetEllipsoid?: GeodeticEllipsoid;\n /** When method is Geocentric this property contains the geocentric parameters */\n public readonly geocentric?: GeocentricTransform;\n /** When method is PositionalVector this property contains the positional vector parameters */\n public readonly positionalVector?: PositionalVectorTransform;\n /** When method is GridFiles this property contains the grid files parameters */\n public readonly gridFile?: GridFileTransform;\n\n public constructor(data?: GeodeticTransformProps) {\n this.method = \"None\";\n if (data) {\n this.method = data.method;\n this.sourceEllipsoid = data.sourceEllipsoid ? GeodeticEllipsoid.fromJSON(data.sourceEllipsoid) : undefined;\n this.targetEllipsoid = data.targetEllipsoid ? GeodeticEllipsoid.fromJSON(data.targetEllipsoid) : undefined;\n this.geocentric = data.geocentric ? GeocentricTransform.fromJSON(data.geocentric) : undefined;\n this.positionalVector = data.positionalVector ? PositionalVectorTransform.fromJSON(data.positionalVector) : undefined;\n this.gridFile = data.gridFile ? GridFileTransform.fromJSON(data.gridFile) : undefined;\n }\n }\n\n /** Creates a Geodetic Transform from JSON representation.\n * @public */\n public static fromJSON(data: GeodeticTransformProps): GeodeticTransform {\n return new GeodeticTransform(data);\n }\n\n /** Creates a JSON from the Geodetic Transform definition\n * @public */\n public toJSON(): GeodeticTransformProps {\n const data: GeodeticTransformProps = { method: this.method };\n data.sourceEllipsoid = this.sourceEllipsoid ? this.sourceEllipsoid.toJSON() : undefined;\n data.targetEllipsoid = this.targetEllipsoid ? this.targetEllipsoid.toJSON() : undefined;\n data.geocentric = this.geocentric ? this.geocentric.toJSON() : undefined;\n data.positionalVector = this.positionalVector ? this.positionalVector.toJSON() : undefined;\n data.gridFile = this.gridFile ? this.gridFile.toJSON() : undefined;\n return data;\n }\n\n /** Compares two geodetic Transforms. It is not an equivalence test since\n * descriptive information is strictly compared. A minuscule tolerance is applied to number compares.\n * @public */\n public equals(other: GeodeticTransform): boolean {\n if (this.method !== other.method)\n return false;\n\n if ((this.sourceEllipsoid === undefined) !== (other.sourceEllipsoid === undefined))\n return false;\n if (this.sourceEllipsoid && !this.sourceEllipsoid.equals(other.sourceEllipsoid!))\n return false;\n\n if ((this.targetEllipsoid === undefined) !== (other.targetEllipsoid === undefined))\n return false;\n if (this.targetEllipsoid && !this.targetEllipsoid.equals(other.targetEllipsoid!))\n return false;\n\n if ((this.geocentric === undefined) !== (other.geocentric === undefined))\n return false;\n if (this.geocentric && !this.geocentric.equals(other.geocentric!))\n return false;\n\n if ((this.positionalVector === undefined) !== (other.positionalVector === undefined))\n return false;\n if (this.positionalVector && !this.positionalVector.equals(other.positionalVector!))\n return false;\n\n if ((this.gridFile === undefined) !== (other.gridFile === undefined))\n return false;\n if (this.gridFile && !this.gridFile.equals(other.gridFile!))\n return false;\n\n return true;\n }\n}\n\n/** This interface represents a geodetic datum. Geodetic datums are based on an ellipsoid.\n * In addition to the ellipsoid definition they are the base for longitude/latitude coordinates.\n * Geodetic datums are the basis for geodetic transformations. Most geodetic datums are defined by specifying\n * the transformation to the common base WGS84 (or local equivalent). The transforms property can contain the\n * definition of the transformation path to WGS84.\n * Sometimes there exists transformation paths direct from one non-WGS84 datum to another non-WGS84. The current model\n * does not allow specifications of these special paths at the moment.\n * @public\n */\nexport interface GeodeticDatumProps {\n /** GeodeticDatum key name */\n id?: string;\n /** Description */\n description?: string;\n /** If true then indicates the definition is deprecated. It should then be used for backward compatibility only.\n ** If false or undefined then the definition is not deprecated.\n */\n deprecated?: boolean;\n /** A textual description of the source of the geodetic datum definition. */\n source?: string;\n /** The EPSG code of the geodetic datum. If undefined then there is no EPSG code associated. */\n epsg?: number;\n /** The key name to the base Ellipsoid. */\n ellipsoidId?: string;\n /** The full definition of the geodetic ellipsoid associated to the datum. If undefined then the ellipsoidId must be used to fetch the definition from the dictionary, geographic coordinate system service or the backend */\n ellipsoid?: GeodeticEllipsoidProps;\n /** The transformation to WGS84. If null then there is no known transformation to WGS84. Although\n * this is rare it occurs in a few cases where the country charges for obtaining and using\n * the transformation and its parameters, or if the transformation is maintained secret for military reasons.\n * In this case the recommendation is to considered the geodetic datum to be coincident to WGS84 keeping\n * in mind imported global data such as Google Map or Bing Map data may be approximately located.\n * The list of transforms contains normally a single transform but there can be a sequence of transformations\n * required to transform to WGS84, such as the newer datum definitions for Slovakia or Switzerland.\n */\n transforms?: GeodeticTransformProps[];\n}\n\n/** This class represents a geodetic datum. Geodetic datums are based on an ellipsoid.\n * In addition to the ellipsoid definition they are the base for longitude/latitude coordinates.\n * Geodetic datums are the basis for geodetic transformations. Most geodetic datums are defined by specifying\n * the transformation to the common base WGS84 (or local equivalent). The transforms property can contain the\n * definition of the transformation path to WGS84.\n * Sometimes there exists transformation paths direct from one non-WGS84 datum to another non-WGS84. The current model\n * does not allow specifications of these special paths at the moment.\n * @public\n */\nexport class GeodeticDatum implements GeodeticDatumProps {\n /** GeodeticDatum key name */\n public readonly id?: string;\n /** Description */\n public readonly description?: string;\n /** If true then indicates the definition is deprecated. It should then be used for backward compatibility only.\n * If false then the definition is not deprecated. Default is false.\n */\n public readonly deprecated: boolean;\n /** A textual description of the source of the geodetic datum definition. */\n public readonly source?: string;\n /** The EPSG code of the geodetic datum. If undefined then there is no EPSG code associated. */\n public readonly epsg?: number;\n /** The key name to the base Ellipsoid. */\n public readonly ellipsoidId?: string;\n /** The full definition of the geodetic ellipsoid associated to the datum. If undefined then the ellipsoidId must\n * be used to fetch the definition from the dictionary, geographic coordinate system service or the backend\n */\n public readonly ellipsoid?: GeodeticEllipsoid;\n /** The transformation to WGS84. If null then there is no known transformation to WGS84. Although\n * this is rare it occurs in a few cases where the country charges for obtaining and using\n * the transformation and its parameters, or if the transformation is maintained secret for military reasons.\n * In this case the recommendation is to considered the geodetic datum to be coincident to WGS84 keeping\n * in mind imported global data such as Google Map or Bing Map data may be approximately located.\n * The list of transforms contains normally a single transform but there can be a sequence of transformations\n * required to transform to WGS84, such as the newer datum definitions for Slovakia or Switzerland.\n */\n public readonly transforms?: GeodeticTransform[];\n\n public constructor(_data?: GeodeticDatumProps) {\n this.deprecated = false;\n if (_data) {\n this.id = _data.id;\n this.description = _data.description;\n this.deprecated = _data.deprecated ?? false;\n this.source = _data.source;\n this.epsg = _data.epsg;\n this.ellipsoidId = _data.ellipsoidId;\n this.ellipsoid = _data.ellipsoid ? GeodeticEllipsoid.fromJSON(_data.ellipsoid) : undefined;\n if (Array.isArray(_data.transforms)) {\n this.transforms = [];\n for (const item of _data.transforms)\n this.transforms.push(GeodeticTransform.fromJSON(item));\n }\n }\n }\n\n /** Creates a Geodetic Datum from JSON representation.\n * @public */\n public static fromJSON(data: GeodeticDatumProps): GeodeticDatum {\n return new GeodeticDatum(data);\n }\n\n /** Creates a JSON from the Geodetic Datum definition\n * @public */\n public toJSON(): GeodeticDatumProps {\n const data: GeodeticDatumProps = {};\n data.id = this.id;\n data.description = this.description;\n /* We prefer to use the default undef instead of false value for deprecated value in Json */\n data.deprecated = (this.deprecated === false ? undefined : true);\n data.source = this.source;\n data.epsg = this.epsg;\n data.ellipsoidId = this.ellipsoidId;\n data.ellipsoid = this.ellipsoid ? this.ellipsoid.toJSON() : undefined;\n if (Array.isArray(this.transforms)) {\n data.transforms = [];\n for (const item of this.transforms)\n data.transforms.push(item.toJSON());\n }\n return data;\n }\n\n /** Compares two Geodetic Datums. It is a strict compare operation not an equivalence test.\n * It takes into account descriptive properties not only mathematical definition properties.\n * @public */\n public equals(other: GeodeticDatum): boolean {\n if (this.id !== other.id ||\n this.description !== other.description ||\n this.deprecated !== other.deprecated ||\n this.source !== other.source ||\n this.epsg !== other.epsg ||\n this.ellipsoidId !== other.ellipsoidId)\n return false;\n\n if ((this.ellipsoid === undefined) !== (other.ellipsoid === undefined))\n return false;\n\n if (this.ellipsoid && !this.ellipsoid.equals(other.ellipsoid!))\n return false;\n\n if ((this.transforms === undefined) !== (other.transforms === undefined))\n return false;\n\n if (this.transforms && other.transforms) {\n if (this.transforms.length !== other.transforms.length)\n return false;\n\n for (let idx = 0; idx < this.transforms.length; ++idx)\n if (!this.transforms[idx].equals(other.transforms[idx]))\n return false;\n }\n return true;\n }\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"GeodeticDatum.js","sourceRoot":"","sources":["../../../src/geometry/GeodeticDatum.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/** @packageDocumentation\r\n * @module Geometry\r\n */\r\n// cspell:ignore JSONXYZ, ETRF, OSGB, DHDN, NADCON, GEOCN\r\n\r\nimport { Geometry, Vector3d, XYAndZ } from \"@itwin/core-geometry\";\r\nimport { GeodeticEllipsoid, GeodeticEllipsoidProps } from \"./GeodeticEllipsoid\";\r\n\r\n/** Holds 3 components of a Positional Vector rotation definition in arc seconds\r\n * @public\r\n */\r\nexport interface XyzRotationProps {\r\n /** X rotation component in arc second */\r\n x: number;\r\n /** Y rotation component in arc second*/\r\n y: number;\r\n /** Z rotation component in arc second*/\r\n z: number;\r\n}\r\n\r\n/** Hold 3 components data of a Positional Vector rotation definition in arc seconds\r\n * @public\r\n */\r\nexport class XyzRotation implements XyzRotationProps {\r\n /** X rotation component in arc second */\r\n public readonly x!: number;\r\n /** Y rotation component in arc second*/\r\n public readonly y!: number;\r\n /** Z rotation component in arc second*/\r\n public readonly z!: number;\r\n\r\n public constructor(data?: XyzRotationProps) {\r\n if (data) {\r\n this.x = data.x;\r\n this.y = data.y;\r\n this.z = data.z;\r\n }\r\n }\r\n\r\n /** Creates a Rotations object from JSON representation.\r\n * @public */\r\n public static fromJSON(data: XyzRotationProps): XyzRotation {\r\n return new XyzRotation(data);\r\n }\r\n\r\n /** Creates a JSON from the Rotations definition\r\n * @public */\r\n public toJSON(): XyzRotationProps {\r\n return { x: this.x, y: this.y, z: this.z };\r\n }\r\n\r\n /** Compares two geodetic rotations. It applies a minuscule angular tolerance\r\n * @public */\r\n public equals(other: XyzRotation): boolean {\r\n return (Math.abs(this.x - other.x) < Geometry.smallAngleSeconds &&\r\n Math.abs(this.y - other.y) < Geometry.smallAngleSeconds &&\r\n Math.abs(this.z - other.z) < Geometry.smallAngleSeconds);\r\n }\r\n}\r\n\r\n/** Type indicating the geodetic transformation method\r\n * @public\r\n */\r\nexport type GeodeticTransformMethod =\r\n \"None\" |\r\n \"Geocentric\" |\r\n \"PositionalVector\" |\r\n \"GridFiles\" |\r\n \"MultipleRegression\" |\r\n \"Undefined\";\r\n\r\n/** This interface represents a geocentric (three parameters) geodetic transformation.\r\n * @public\r\n */\r\nexport interface GeocentricTransformProps {\r\n /** The frame translation components in meters */\r\n delta: XYAndZ;\r\n}\r\n\r\n/** This class represents a geocentric (three parameters) geodetic transformation.\r\n * @public\r\n */\r\nexport class GeocentricTransform implements GeocentricTransformProps {\r\n /** The frame translation components in meters */\r\n public readonly delta: Vector3d;\r\n\r\n public constructor(data?: GeocentricTransformProps) {\r\n this.delta = data ? Vector3d.fromJSON(data.delta) : new Vector3d();\r\n }\r\n\r\n /** Creates a Geocentric Transform from JSON representation.\r\n * @public */\r\n public static fromJSON(data: GeocentricTransformProps): GeocentricTransform {\r\n return new GeocentricTransform(data);\r\n }\r\n\r\n /** Creates a JSON from the Geodetic GeocentricTransform definition\r\n * @public */\r\n public toJSON(): GeocentricTransformProps {\r\n return { delta: { x: this.delta.x, y: this.delta.y, z: this.delta.z } };\r\n }\r\n\r\n /** Compares two geodetic transforms. It applies a minuscule tolerance.\r\n * @public */\r\n public equals(other: GeocentricTransform): boolean {\r\n return (Math.abs(this.delta.x - other.delta.x) < Geometry.smallMetricDistance &&\r\n Math.abs(this.delta.y - other.delta.y) < Geometry.smallMetricDistance &&\r\n Math.abs(this.delta.z - other.delta.z) < Geometry.smallMetricDistance);\r\n }\r\n}\r\n\r\n/** This interface represents a positional vector (seven parameters) geodetic transformation corresponding to\r\n * EPSG operation 9606. Beware that the convention relative to rotation direction is different\r\n * from the Coordinate Frame operation (epsg 9607).\r\n * @public\r\n */\r\nexport interface PositionalVectorTransformProps {\r\n /** The frame translation components in meters */\r\n delta: XYAndZ;\r\n /** The frame rotation components in arc seconds. The rotation sign convention is the one associated with\r\n * the operation EPSG:9606 following recommendation of ISO 19111 specifications */\r\n rotation: XyzRotationProps;\r\n /** Scale in parts per million. The scale effectively applied will be 1 plus scale divided by 1 000 000. */\r\n scalePPM: number;\r\n}\r\n\r\n/** This class represents a positional vector (seven parameters) geodetic transformation corresponding to\r\n * EPSG operation 9606. Beware that the convention relative to rotation direction is different\r\n * from the Coordinate Frame operation (epsg 9607).\r\n * @public\r\n */\r\nexport class PositionalVectorTransform implements PositionalVectorTransformProps {\r\n /** The frame translation components in meters */\r\n public readonly delta!: Vector3d;\r\n /** The frame rotation components in arc seconds. The rotation sign convention is the one associated with\r\n * the operation EPSG:9606 following recommendation of ISO 19111 specifications */\r\n public readonly rotation!: XyzRotation;\r\n /** Scale in parts per million. The scale effectively applied will be 1 plus scale divided by 1 000 000. */\r\n public readonly scalePPM!: number;\r\n\r\n public constructor(data?: PositionalVectorTransformProps) {\r\n if (data) {\r\n this.delta = data.delta ? Vector3d.fromJSON(data.delta) : new Vector3d();\r\n this.rotation = data.rotation ? XyzRotation.fromJSON(data.rotation) : new XyzRotation();\r\n this.scalePPM = data.scalePPM;\r\n }\r\n }\r\n\r\n /** Creates a Positional Vector Transform from JSON representation.\r\n * @public */\r\n public static fromJSON(data: PositionalVectorTransformProps): PositionalVectorTransform {\r\n return new PositionalVectorTransform(data);\r\n }\r\n\r\n /** Creates a JSON from the Positional Vector Transform definition\r\n * @public */\r\n public toJSON(): PositionalVectorTransformProps {\r\n return {\r\n delta: { x: this.delta.x, y: this.delta.y, z: this.delta.z },\r\n rotation: this.rotation.toJSON(),\r\n scalePPM: this.scalePPM,\r\n };\r\n }\r\n\r\n /** Compares two Positional Vector Transforms. It applies a minuscule tolerance to number compares.\r\n * @public */\r\n public equals(other: PositionalVectorTransform): boolean {\r\n if (Math.abs(this.delta.x - other.delta.x) > Geometry.smallMetricDistance ||\r\n Math.abs(this.delta.y - other.delta.y) > Geometry.smallMetricDistance ||\r\n Math.abs(this.delta.z - other.delta.z) > Geometry.smallMetricDistance ||\r\n Math.abs(this.scalePPM - other.scalePPM) > Geometry.smallFraction)\r\n return false;\r\n\r\n return this.rotation.equals(other.rotation);\r\n }\r\n}\r\n\r\n/** Type indicating the file format of the grid files.\r\n * @public\r\n */\r\nexport type GridFileFormat =\r\n \"NONE\" |\r\n \"NTv1\" |\r\n \"NTv2\" |\r\n \"NADCON\" |\r\n \"FRENCH\" |\r\n \"JAPAN\" |\r\n \"ATS77\" |\r\n \"GEOCN\";\r\n\r\n/** type to indicate the grid file application direction.\r\n * @public\r\n */\r\nexport type GridFileDirection = \"Direct\" | \"Inverse\";\r\n\r\n/** Grid file definition containing name of the file, the format and the direction it should be applied\r\n * @public\r\n */\r\nexport interface GridFileDefinitionProps {\r\n /** Name of the grid shift file. This name is relative to the expected dictionary root document.\r\n * Typical grid shift file name will contain first the country name it applies to then possibly some sub path.\r\n * Example of existing grid files:\r\n * Germany/BETA2007.gsb or Brazil/SAD69_003.GSB but sometimes longer paths USA/NADCON/conus.l*s\r\n * Note that the file name can contain wildcards when the format requires more than one file. For example\r\n * the NADCON format makes use of a different file for latitude and longitude shifts thus the .l*s extension in the\r\n * file name above.\r\n * Forward slash is always used to separate the path components.\r\n */\r\n fileName: string;\r\n /** The grid file format */\r\n format: GridFileFormat;\r\n /** The grid file application direction */\r\n direction: GridFileDirection;\r\n}\r\n\r\n/** Grid file definition containing name of the file, the format and the direction it should be applied\r\n * @public\r\n */\r\nexport class GridFileDefinition implements GridFileDefinitionProps {\r\n /** Name of the grid shift file. This name is relative to the expected dictionary root document.\r\n * Typical grid shift file name will contain first the country name it applies to then possibly some sub path.\r\n * Example of existing grid files:\r\n * Germany/BETA2007.gsb or Brazil/SAD69_003.GSB but sometimes longer paths USA/NADCON/conus.l*s\r\n * Note that the file name can contain wildcards when the format requires more than one file. For example\r\n * the NADCON format makes use of a different file for latitude and longitude shifts thus the .l*s extension in the\r\n * file name above.\r\n * Forward slash is always used to separate the path components.\r\n */\r\n public readonly fileName: string;\r\n /** The grid file format */\r\n public readonly format: GridFileFormat;\r\n /** The grid file application direction */\r\n public readonly direction: GridFileDirection;\r\n\r\n public constructor(data?: GridFileDefinitionProps) {\r\n this.fileName = data ? data.fileName : \"\";\r\n this.format = data ? data.format : \"NTv2\";\r\n this.direction = data ? data.direction : \"Direct\";\r\n }\r\n\r\n /** Creates a Grid File Definition from JSON representation.\r\n * @public */\r\n public static fromJSON(data: GridFileDefinitionProps): GridFileDefinition {\r\n return new GridFileDefinition(data);\r\n }\r\n\r\n /** Creates a JSON from the Grid File Definition\r\n * @public */\r\n public toJSON(): GridFileDefinitionProps {\r\n return { fileName: this.fileName, format: this.format, direction: this.direction };\r\n }\r\n\r\n /** Compares two grid file definition. It is a strict compare operation not an equivalence test.\r\n * @public */\r\n public equals(other: GridFileDefinition): boolean {\r\n return (this.fileName === other.fileName && this.direction === other.direction && this.format === other.format);\r\n }\r\n}\r\n\r\n/** This interface represents a grid files based geodetic transformation.\r\n * @public\r\n */\r\nexport interface GridFileTransformProps {\r\n /** The list of grid files. The order of file is meaningful, the first encountered that covers the extent of coordinate\r\n * transformation will be used. */\r\n files: GridFileDefinitionProps[];\r\n /** The positional vector fallback transformation used for extents not covered by the grid files */\r\n fallback?: PositionalVectorTransformProps;\r\n}\r\n\r\n/** This class represents a grid files based geodetic transformation.\r\n * @public\r\n */\r\nexport class GridFileTransform implements GridFileTransformProps {\r\n /** The list of grid files. The order of file is meaningful, the first encountered that covers the extent of coordinate\r\n * transformation will be used. */\r\n public readonly files: GridFileDefinition[];\r\n /** The positional vector fallback transformation used for extents not covered by the grid files */\r\n public readonly fallback?: PositionalVectorTransform;\r\n\r\n public constructor(data?: GridFileTransformProps) {\r\n this.files = [];\r\n if (data) {\r\n this.fallback = data.fallback ? PositionalVectorTransform.fromJSON(data.fallback) : undefined;\r\n if (Array.isArray(data.files)) {\r\n this.files = [];\r\n for (const item of data.files)\r\n this.files.push(GridFileDefinition.fromJSON(item));\r\n }\r\n }\r\n }\r\n\r\n /** Creates a Grid File Transform from JSON representation.\r\n * @public */\r\n public static fromJSON(data: GridFileTransformProps): GridFileTransform {\r\n return new GridFileTransform(data);\r\n }\r\n\r\n /** Creates a JSON from the Grid File Transform definition\r\n * @public */\r\n public toJSON(): GridFileTransformProps {\r\n const data: GridFileTransformProps = { files: [] };\r\n data.fallback = this.fallback ? this.fallback.toJSON() : undefined;\r\n if (Array.isArray(this.files)) {\r\n for (const item of this.files)\r\n data.files.push(item.toJSON());\r\n }\r\n return data;\r\n }\r\n\r\n /** Compares two Grid File Transforms. It is a strict compare operation not an equivalence test.\r\n * @public */\r\n public equals(other: GridFileTransform): boolean {\r\n if (this.files.length !== other.files.length)\r\n return false;\r\n\r\n for (let idx = 0; idx < this.files.length; ++idx)\r\n if (!this.files[idx].equals(other.files[idx]))\r\n return false;\r\n\r\n if ((this.fallback === undefined) !== (other.fallback === undefined))\r\n return false;\r\n\r\n if (this.fallback && !this.fallback.equals(other.fallback!))\r\n return false;\r\n\r\n return true;\r\n }\r\n}\r\n\r\n/** This interface represents a geodetic transformation that enables transforming longitude/latitude coordinates\r\n * from one datum to another.\r\n * @public\r\n */\r\nexport interface GeodeticTransformProps {\r\n /** The method used by the geodetic transform */\r\n method: GeodeticTransformMethod;\r\n /** The complete definition of the source geodetic ellipsoid referred to by ellipsoidId.\r\n * The source ellipsoid identifier enables obtaining the shape of the Earth mathematical model\r\n * for the purpose of performing the transformation.\r\n */\r\n sourceEllipsoid?: GeodeticEllipsoidProps;\r\n /** The complete definition of the target geodetic ellipsoid referred to by ellipsoidId.\r\n * The target ellipsoid identifier enables obtaining the shape of the Earth mathematical model\r\n * for the purpose of performing the transformation.*/\r\n targetEllipsoid?: GeodeticEllipsoidProps;\r\n /** When method is Geocentric this property contains the geocentric parameters */\r\n geocentric?: GeocentricTransformProps;\r\n /** When method is PositionalVector this property contains the positional vector parameters */\r\n positionalVector?: PositionalVectorTransformProps;\r\n /** When method is GridFiles this property contains the grid files parameters */\r\n gridFile?: GridFileTransformProps;\r\n}\r\n\r\n/** This class represents a geodetic transformation that enables transforming longitude/latitude coordinates\r\n * from one datum to another.\r\n * @public\r\n */\r\nexport class GeodeticTransform implements GeodeticTransformProps {\r\n /** The method used by the geodetic transform */\r\n public readonly method: GeodeticTransformMethod;\r\n /** The identifier of the source geodetic datum as stored in the dictionary or the service database.\r\n * This identifier is optional and informational only.\r\n */\r\n public readonly sourceEllipsoid?: GeodeticEllipsoid;\r\n /** The complete definition of the target geodetic ellipsoid referred to by ellipsoidId.\r\n * The target ellipsoid identifier enables obtaining the shape of the Earth mathematical model\r\n * for the purpose of performing the transformation.*/\r\n public readonly targetEllipsoid?: GeodeticEllipsoid;\r\n /** When method is Geocentric this property contains the geocentric parameters */\r\n public readonly geocentric?: GeocentricTransform;\r\n /** When method is PositionalVector this property contains the positional vector parameters */\r\n public readonly positionalVector?: PositionalVectorTransform;\r\n /** When method is GridFiles this property contains the grid files parameters */\r\n public readonly gridFile?: GridFileTransform;\r\n\r\n public constructor(data?: GeodeticTransformProps) {\r\n this.method = \"None\";\r\n if (data) {\r\n this.method = data.method;\r\n this.sourceEllipsoid = data.sourceEllipsoid ? GeodeticEllipsoid.fromJSON(data.sourceEllipsoid) : undefined;\r\n this.targetEllipsoid = data.targetEllipsoid ? GeodeticEllipsoid.fromJSON(data.targetEllipsoid) : undefined;\r\n this.geocentric = data.geocentric ? GeocentricTransform.fromJSON(data.geocentric) : undefined;\r\n this.positionalVector = data.positionalVector ? PositionalVectorTransform.fromJSON(data.positionalVector) : undefined;\r\n this.gridFile = data.gridFile ? GridFileTransform.fromJSON(data.gridFile) : undefined;\r\n }\r\n }\r\n\r\n /** Creates a Geodetic Transform from JSON representation.\r\n * @public */\r\n public static fromJSON(data: GeodeticTransformProps): GeodeticTransform {\r\n return new GeodeticTransform(data);\r\n }\r\n\r\n /** Creates a JSON from the Geodetic Transform definition\r\n * @public */\r\n public toJSON(): GeodeticTransformProps {\r\n const data: GeodeticTransformProps = { method: this.method };\r\n data.sourceEllipsoid = this.sourceEllipsoid ? this.sourceEllipsoid.toJSON() : undefined;\r\n data.targetEllipsoid = this.targetEllipsoid ? this.targetEllipsoid.toJSON() : undefined;\r\n data.geocentric = this.geocentric ? this.geocentric.toJSON() : undefined;\r\n data.positionalVector = this.positionalVector ? this.positionalVector.toJSON() : undefined;\r\n data.gridFile = this.gridFile ? this.gridFile.toJSON() : undefined;\r\n return data;\r\n }\r\n\r\n /** Compares two geodetic Transforms. It is not an equivalence test since\r\n * descriptive information is strictly compared. A minuscule tolerance is applied to number compares.\r\n * @public */\r\n public equals(other: GeodeticTransform): boolean {\r\n if (this.method !== other.method)\r\n return false;\r\n\r\n if ((this.sourceEllipsoid === undefined) !== (other.sourceEllipsoid === undefined))\r\n return false;\r\n if (this.sourceEllipsoid && !this.sourceEllipsoid.equals(other.sourceEllipsoid!))\r\n return false;\r\n\r\n if ((this.targetEllipsoid === undefined) !== (other.targetEllipsoid === undefined))\r\n return false;\r\n if (this.targetEllipsoid && !this.targetEllipsoid.equals(other.targetEllipsoid!))\r\n return false;\r\n\r\n if ((this.geocentric === undefined) !== (other.geocentric === undefined))\r\n return false;\r\n if (this.geocentric && !this.geocentric.equals(other.geocentric!))\r\n return false;\r\n\r\n if ((this.positionalVector === undefined) !== (other.positionalVector === undefined))\r\n return false;\r\n if (this.positionalVector && !this.positionalVector.equals(other.positionalVector!))\r\n return false;\r\n\r\n if ((this.gridFile === undefined) !== (other.gridFile === undefined))\r\n return false;\r\n if (this.gridFile && !this.gridFile.equals(other.gridFile!))\r\n return false;\r\n\r\n return true;\r\n }\r\n}\r\n\r\n/** This interface represents a geodetic datum. Geodetic datums are based on an ellipsoid.\r\n * In addition to the ellipsoid definition they are the base for longitude/latitude coordinates.\r\n * Geodetic datums are the basis for geodetic transformations. Most geodetic datums are defined by specifying\r\n * the transformation to the common base WGS84 (or local equivalent). The transforms property can contain the\r\n * definition of the transformation path to WGS84.\r\n * Sometimes there exists transformation paths direct from one non-WGS84 datum to another non-WGS84. The current model\r\n * does not allow specifications of these special paths at the moment.\r\n * @public\r\n */\r\nexport interface GeodeticDatumProps {\r\n /** GeodeticDatum key name */\r\n id?: string;\r\n /** Description */\r\n description?: string;\r\n /** If true then indicates the definition is deprecated. It should then be used for backward compatibility only.\r\n ** If false or undefined then the definition is not deprecated.\r\n */\r\n deprecated?: boolean;\r\n /** A textual description of the source of the geodetic datum definition. */\r\n source?: string;\r\n /** The EPSG code of the geodetic datum. If undefined then there is no EPSG code associated. */\r\n epsg?: number;\r\n /** The key name to the base Ellipsoid. */\r\n ellipsoidId?: string;\r\n /** The full definition of the geodetic ellipsoid associated to the datum. If undefined then the ellipsoidId must be used to fetch the definition from the dictionary, geographic coordinate system service or the backend */\r\n ellipsoid?: GeodeticEllipsoidProps;\r\n /** The transformation to WGS84. If null then there is no known transformation to WGS84. Although\r\n * this is rare it occurs in a few cases where the country charges for obtaining and using\r\n * the transformation and its parameters, or if the transformation is maintained secret for military reasons.\r\n * In this case the recommendation is to considered the geodetic datum to be coincident to WGS84 keeping\r\n * in mind imported global data such as Google Map or Bing Map data may be approximately located.\r\n * The list of transforms contains normally a single transform but there can be a sequence of transformations\r\n * required to transform to WGS84, such as the newer datum definitions for Slovakia or Switzerland.\r\n */\r\n transforms?: GeodeticTransformProps[];\r\n}\r\n\r\n/** This class represents a geodetic datum. Geodetic datums are based on an ellipsoid.\r\n * In addition to the ellipsoid definition they are the base for longitude/latitude coordinates.\r\n * Geodetic datums are the basis for geodetic transformations. Most geodetic datums are defined by specifying\r\n * the transformation to the common base WGS84 (or local equivalent). The transforms property can contain the\r\n * definition of the transformation path to WGS84.\r\n * Sometimes there exists transformation paths direct from one non-WGS84 datum to another non-WGS84. The current model\r\n * does not allow specifications of these special paths at the moment.\r\n * @public\r\n */\r\nexport class GeodeticDatum implements GeodeticDatumProps {\r\n /** GeodeticDatum key name */\r\n public readonly id?: string;\r\n /** Description */\r\n public readonly description?: string;\r\n /** If true then indicates the definition is deprecated. It should then be used for backward compatibility only.\r\n * If false then the definition is not deprecated. Default is false.\r\n */\r\n public readonly deprecated: boolean;\r\n /** A textual description of the source of the geodetic datum definition. */\r\n public readonly source?: string;\r\n /** The EPSG code of the geodetic datum. If undefined then there is no EPSG code associated. */\r\n public readonly epsg?: number;\r\n /** The key name to the base Ellipsoid. */\r\n public readonly ellipsoidId?: string;\r\n /** The full definition of the geodetic ellipsoid associated to the datum. If undefined then the ellipsoidId must\r\n * be used to fetch the definition from the dictionary, geographic coordinate system service or the backend\r\n */\r\n public readonly ellipsoid?: GeodeticEllipsoid;\r\n /** The transformation to WGS84. If null then there is no known transformation to WGS84. Although\r\n * this is rare it occurs in a few cases where the country charges for obtaining and using\r\n * the transformation and its parameters, or if the transformation is maintained secret for military reasons.\r\n * In this case the recommendation is to considered the geodetic datum to be coincident to WGS84 keeping\r\n * in mind imported global data such as Google Map or Bing Map data may be approximately located.\r\n * The list of transforms contains normally a single transform but there can be a sequence of transformations\r\n * required to transform to WGS84, such as the newer datum definitions for Slovakia or Switzerland.\r\n */\r\n public readonly transforms?: GeodeticTransform[];\r\n\r\n public constructor(_data?: GeodeticDatumProps) {\r\n this.deprecated = false;\r\n if (_data) {\r\n this.id = _data.id;\r\n this.description = _data.description;\r\n this.deprecated = _data.deprecated ?? false;\r\n this.source = _data.source;\r\n this.epsg = _data.epsg;\r\n this.ellipsoidId = _data.ellipsoidId;\r\n this.ellipsoid = _data.ellipsoid ? GeodeticEllipsoid.fromJSON(_data.ellipsoid) : undefined;\r\n if (Array.isArray(_data.transforms)) {\r\n this.transforms = [];\r\n for (const item of _data.transforms)\r\n this.transforms.push(GeodeticTransform.fromJSON(item));\r\n }\r\n }\r\n }\r\n\r\n /** Creates a Geodetic Datum from JSON representation.\r\n * @public */\r\n public static fromJSON(data: GeodeticDatumProps): GeodeticDatum {\r\n return new GeodeticDatum(data);\r\n }\r\n\r\n /** Creates a JSON from the Geodetic Datum definition\r\n * @public */\r\n public toJSON(): GeodeticDatumProps {\r\n const data: GeodeticDatumProps = {};\r\n data.id = this.id;\r\n data.description = this.description;\r\n /* We prefer to use the default undef instead of false value for deprecated value in Json */\r\n data.deprecated = (this.deprecated === false ? undefined : true);\r\n data.source = this.source;\r\n data.epsg = this.epsg;\r\n data.ellipsoidId = this.ellipsoidId;\r\n data.ellipsoid = this.ellipsoid ? this.ellipsoid.toJSON() : undefined;\r\n if (Array.isArray(this.transforms)) {\r\n data.transforms = [];\r\n for (const item of this.transforms)\r\n data.transforms.push(item.toJSON());\r\n }\r\n return data;\r\n }\r\n\r\n /** Compares two Geodetic Datums. It is a strict compare operation not an equivalence test.\r\n * It takes into account descriptive properties not only mathematical definition properties.\r\n * @public */\r\n public equals(other: GeodeticDatum): boolean {\r\n if (this.id !== other.id ||\r\n this.description !== other.description ||\r\n this.deprecated !== other.deprecated ||\r\n this.source !== other.source ||\r\n this.epsg !== other.epsg ||\r\n this.ellipsoidId !== other.ellipsoidId)\r\n return false;\r\n\r\n if ((this.ellipsoid === undefined) !== (other.ellipsoid === undefined))\r\n return false;\r\n\r\n if (this.ellipsoid && !this.ellipsoid.equals(other.ellipsoid!))\r\n return false;\r\n\r\n if ((this.transforms === undefined) !== (other.transforms === undefined))\r\n return false;\r\n\r\n if (this.transforms && other.transforms) {\r\n if (this.transforms.length !== other.transforms.length)\r\n return false;\r\n\r\n for (let idx = 0; idx < this.transforms.length; ++idx)\r\n if (!this.transforms[idx].equals(other.transforms[idx]))\r\n return false;\r\n }\r\n return true;\r\n }\r\n}\r\n\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeodeticEllipsoid.js","sourceRoot":"","sources":["../../../src/geometry/GeodeticEllipsoid.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,wDAAgD;AA4BhD;;;;;;;;;;;;GAYG;AACH,MAAa,iBAAiB;IAkB5B,YAAmB,IAA6B;;QAC9C,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YACpC,IAAI,CAAC,UAAU,GAAG,MAAA,IAAI,CAAC,UAAU,mCAAI,KAAK,CAAC;YAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACtB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAC9C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;SACrC;IACH,CAAC;IAED;iBACa;IACN,MAAM,CAAC,QAAQ,CAAC,IAA4B;QACjD,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED;iBACa;IACN,MAAM;QACX,MAAM,IAAI,GAA2B,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;QAChH,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,sFAAsF;QACtF,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAC9C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;kBAGc;IACP,MAAM,CAAC,KAAwB;QACpC,OAAO,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE;YACzB,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW;YACtC,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU;YACpC,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;YAC5B,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;YACxB,wBAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE,wBAAQ,CAAC,mBAAmB,CAAC;YAC3G,wBAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,wBAAQ,CAAC,mBAAmB,CAAC,CAAC;IACtG,CAAC;CACF;AAjED,8CAiEC","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/** @packageDocumentation\n * @module Geometry\n */\n\nimport { Geometry } from \"@itwin/core-geometry\";\n\n/** This interface defines the mathematical model of the Earth shape in the form of an ellipsoid.\n * There are various ways to define an ellipsoid but we have retained the definition based on the polar and equatorial radiuses.\n * The other ellipsoid properties, such as flattening and inverse flattening, can be obtained using\n * the simple equations that are defined at:\n * https://en.wikipedia.org/wiki/Flattening and https://en.wikipedia.org/wiki/Earth_ellipsoid.\n * @public\n */\nexport interface GeodeticEllipsoidProps {\n /** Ellipsoid key name */\n id?: string;\n /** Description of the ellipsoid */\n description?: string;\n /** If true then indicates the definition is deprecated. It should then be used for backward compatibility only.\n * If false or undefined then the definition is not deprecated.\n */\n deprecated?: boolean;\n /** The textual description of the source of the ellipsoid definition. */\n source?: string;\n /** The EPSG code of the ellipsoid. If undefined then there is no EPSG code associated. */\n epsg?: number;\n /** The equatorial radius of the ellipsoid in meters */\n equatorialRadius?: number;\n /** The polar radius of the ellipsoid in meters*/\n polarRadius?: number;\n}\n\n/** This class defines the mathematical model of the Earth shape in the form of an ellipsoid.\n * There are various ways to define an ellipsoid but we have retained the definition based on the polar and equatorial radiuses.\n * The other ellipsoid properties, such as flattening and inverse flattening, can be obtained using\n * the simple equations that are defined at:\n * https://en.wikipedia.org/wiki/Flattening and https://en.wikipedia.org/wiki/Earth_ellipsoid.\n * The present class only implements the definition of the ellipsoid. No processing is performed here. If ellipsoid based computation\n * are required refer to [[Ellipsoid]] in core/geometry package.\n * The class only serves to describe a geodetic ellipsoid and can be partially or fully defined.\n * For a lot of purposes simply setting the id property is sufficient to describe the ellipsoid in most cases\n * as the mathematical properties (equatorial and polar radiuses) will be often extracted from the dictionary\n * of commonly known ellipsoids by the reprojection engine used.\n * @public\n */\nexport class GeodeticEllipsoid implements GeodeticEllipsoidProps {\n /** Ellipsoid key name */\n public readonly id?: string;\n /** Description of the ellipsoid */\n public readonly description?: string;\n /** If true then indicates the definition is deprecated. It should then be used for backward compatibility only.\n * If false then the definition is not deprecated. Default is false.\n */\n public readonly deprecated: boolean;\n /** The textual description of the source of the ellipsoid definition. */\n public readonly source?: string;\n /** The EPSG code of the ellipsoid. If undefined then there is no EPSG code associated. */\n public readonly epsg?: number;\n /** The equatorial radius of the ellipsoid in meters. */\n public readonly equatorialRadius?: number;\n /** The polar radius of the ellipsoid in meters. */\n public readonly polarRadius?: number;\n\n public constructor(data?: GeodeticEllipsoidProps) {\n this.deprecated = false;\n if (data) {\n this.id = data.id;\n this.description = data.description;\n this.deprecated = data.deprecated ?? false;\n this.source = data.source;\n this.epsg = data.epsg;\n this.equatorialRadius = data.equatorialRadius;\n this.polarRadius = data.polarRadius;\n }\n }\n\n /** Creates a Geodetic Ellipsoid from JSON representation.\n * @public */\n public static fromJSON(data: GeodeticEllipsoidProps): GeodeticEllipsoid {\n return new GeodeticEllipsoid(data);\n }\n\n /** Creates a JSON from the Geodetic Ellipsoid definition\n * @public */\n public toJSON(): GeodeticEllipsoidProps {\n const data: GeodeticEllipsoidProps = { equatorialRadius: this.equatorialRadius, polarRadius: this.polarRadius };\n data.id = this.id;\n data.description = this.description;\n /* We prefer to use the default undef instead of false value for deprecated in Json */\n data.deprecated = (this.deprecated === false ? undefined : true);\n data.source = this.source;\n data.epsg = this.epsg;\n data.equatorialRadius = this.equatorialRadius;\n data.polarRadius = this.polarRadius;\n return data;\n }\n\n /** Compares two Geodetic Ellipsoid. It is a strict compare operation not an equivalence test\n * but it applies a minuscule tolerance for floating point compares.\n * It takes into account descriptive properties not only mathematical definition properties.\n * @public */\n public equals(other: GeodeticEllipsoid): boolean {\n return this.id === other.id &&\n this.description === other.description &&\n this.deprecated === other.deprecated &&\n this.source === other.source &&\n this.epsg === other.epsg &&\n Geometry.isAlmostEqualOptional(this.equatorialRadius, other.equatorialRadius, Geometry.smallMetricDistance) &&\n Geometry.isAlmostEqualOptional(this.polarRadius, other.polarRadius, Geometry.smallMetricDistance);\n }\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"GeodeticEllipsoid.js","sourceRoot":"","sources":["../../../src/geometry/GeodeticEllipsoid.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,wDAAgD;AA4BhD;;;;;;;;;;;;GAYG;AACH,MAAa,iBAAiB;IAkB5B,YAAmB,IAA6B;;QAC9C,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YACpC,IAAI,CAAC,UAAU,GAAG,MAAA,IAAI,CAAC,UAAU,mCAAI,KAAK,CAAC;YAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACtB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAC9C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;SACrC;IACH,CAAC;IAED;iBACa;IACN,MAAM,CAAC,QAAQ,CAAC,IAA4B;QACjD,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED;iBACa;IACN,MAAM;QACX,MAAM,IAAI,GAA2B,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;QAChH,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,sFAAsF;QACtF,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAC9C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;kBAGc;IACP,MAAM,CAAC,KAAwB;QACpC,OAAO,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE;YACzB,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW;YACtC,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,UAAU;YACpC,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;YAC5B,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;YACxB,wBAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE,wBAAQ,CAAC,mBAAmB,CAAC;YAC3G,wBAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,wBAAQ,CAAC,mBAAmB,CAAC,CAAC;IACtG,CAAC;CACF;AAjED,8CAiEC","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/** @packageDocumentation\r\n * @module Geometry\r\n */\r\n\r\nimport { Geometry } from \"@itwin/core-geometry\";\r\n\r\n/** This interface defines the mathematical model of the Earth shape in the form of an ellipsoid.\r\n * There are various ways to define an ellipsoid but we have retained the definition based on the polar and equatorial radiuses.\r\n * The other ellipsoid properties, such as flattening and inverse flattening, can be obtained using\r\n * the simple equations that are defined at:\r\n * https://en.wikipedia.org/wiki/Flattening and https://en.wikipedia.org/wiki/Earth_ellipsoid.\r\n * @public\r\n */\r\nexport interface GeodeticEllipsoidProps {\r\n /** Ellipsoid key name */\r\n id?: string;\r\n /** Description of the ellipsoid */\r\n description?: string;\r\n /** If true then indicates the definition is deprecated. It should then be used for backward compatibility only.\r\n * If false or undefined then the definition is not deprecated.\r\n */\r\n deprecated?: boolean;\r\n /** The textual description of the source of the ellipsoid definition. */\r\n source?: string;\r\n /** The EPSG code of the ellipsoid. If undefined then there is no EPSG code associated. */\r\n epsg?: number;\r\n /** The equatorial radius of the ellipsoid in meters */\r\n equatorialRadius?: number;\r\n /** The polar radius of the ellipsoid in meters*/\r\n polarRadius?: number;\r\n}\r\n\r\n/** This class defines the mathematical model of the Earth shape in the form of an ellipsoid.\r\n * There are various ways to define an ellipsoid but we have retained the definition based on the polar and equatorial radiuses.\r\n * The other ellipsoid properties, such as flattening and inverse flattening, can be obtained using\r\n * the simple equations that are defined at:\r\n * https://en.wikipedia.org/wiki/Flattening and https://en.wikipedia.org/wiki/Earth_ellipsoid.\r\n * The present class only implements the definition of the ellipsoid. No processing is performed here. If ellipsoid based computation\r\n * are required refer to [[Ellipsoid]] in core/geometry package.\r\n * The class only serves to describe a geodetic ellipsoid and can be partially or fully defined.\r\n * For a lot of purposes simply setting the id property is sufficient to describe the ellipsoid in most cases\r\n * as the mathematical properties (equatorial and polar radiuses) will be often extracted from the dictionary\r\n * of commonly known ellipsoids by the reprojection engine used.\r\n * @public\r\n */\r\nexport class GeodeticEllipsoid implements GeodeticEllipsoidProps {\r\n /** Ellipsoid key name */\r\n public readonly id?: string;\r\n /** Description of the ellipsoid */\r\n public readonly description?: string;\r\n /** If true then indicates the definition is deprecated. It should then be used for backward compatibility only.\r\n * If false then the definition is not deprecated. Default is false.\r\n */\r\n public readonly deprecated: boolean;\r\n /** The textual description of the source of the ellipsoid definition. */\r\n public readonly source?: string;\r\n /** The EPSG code of the ellipsoid. If undefined then there is no EPSG code associated. */\r\n public readonly epsg?: number;\r\n /** The equatorial radius of the ellipsoid in meters. */\r\n public readonly equatorialRadius?: number;\r\n /** The polar radius of the ellipsoid in meters. */\r\n public readonly polarRadius?: number;\r\n\r\n public constructor(data?: GeodeticEllipsoidProps) {\r\n this.deprecated = false;\r\n if (data) {\r\n this.id = data.id;\r\n this.description = data.description;\r\n this.deprecated = data.deprecated ?? false;\r\n this.source = data.source;\r\n this.epsg = data.epsg;\r\n this.equatorialRadius = data.equatorialRadius;\r\n this.polarRadius = data.polarRadius;\r\n }\r\n }\r\n\r\n /** Creates a Geodetic Ellipsoid from JSON representation.\r\n * @public */\r\n public static fromJSON(data: GeodeticEllipsoidProps): GeodeticEllipsoid {\r\n return new GeodeticEllipsoid(data);\r\n }\r\n\r\n /** Creates a JSON from the Geodetic Ellipsoid definition\r\n * @public */\r\n public toJSON(): GeodeticEllipsoidProps {\r\n const data: GeodeticEllipsoidProps = { equatorialRadius: this.equatorialRadius, polarRadius: this.polarRadius };\r\n data.id = this.id;\r\n data.description = this.description;\r\n /* We prefer to use the default undef instead of false value for deprecated in Json */\r\n data.deprecated = (this.deprecated === false ? undefined : true);\r\n data.source = this.source;\r\n data.epsg = this.epsg;\r\n data.equatorialRadius = this.equatorialRadius;\r\n data.polarRadius = this.polarRadius;\r\n return data;\r\n }\r\n\r\n /** Compares two Geodetic Ellipsoid. It is a strict compare operation not an equivalence test\r\n * but it applies a minuscule tolerance for floating point compares.\r\n * It takes into account descriptive properties not only mathematical definition properties.\r\n * @public */\r\n public equals(other: GeodeticEllipsoid): boolean {\r\n return this.id === other.id &&\r\n this.description === other.description &&\r\n this.deprecated === other.deprecated &&\r\n this.source === other.source &&\r\n this.epsg === other.epsg &&\r\n Geometry.isAlmostEqualOptional(this.equatorialRadius, other.equatorialRadius, Geometry.smallMetricDistance) &&\r\n Geometry.isAlmostEqualOptional(this.polarRadius, other.polarRadius, Geometry.smallMetricDistance);\r\n }\r\n}\r\n\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LineStyle.js","sourceRoot":"","sources":["../../../src/geometry/LineStyle.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/** @packageDocumentation\n * @module Symbology\n */\n\nimport { Id64String } from \"@itwin/core-bentley\";\nimport { Transform, Vector3d, XYZProps, YawPitchRollAngles, YawPitchRollProps } from \"@itwin/core-geometry\";\n\n/** @public */\nexport namespace LineStyle {\n\n /** Modify the line style appearance without changing the line style definition.\n * Applies to the style previously established by a [[GeometryAppearanceProps]] or current [[SubCategoryAppearance]].\n * Most of the modifiers affect the line style stroke pattern, with the orientation and scales being the exception.\n * @see [[GeometryStreamEntryProps]]\n */\n export interface ModifierProps {\n /** Optional scale to apply to all length values, 1.0 if undefined */\n scale?: number;\n /** Optional scale to apply to scalable dashes, 1.0 if undefined */\n dashScale?: number;\n /** Optional scale to apply to scalable gaps, 1.0 if undefined */\n gapScale?: number;\n /** Optional start width in meters to apply to dashes, no width if undefined */\n startWidth?: number;\n /** Optional end width in meters to apply to dashes, same as startWidth if undefined */\n endWidth?: number;\n /** Optional shift by distance in meters, 0.0 if undefined */\n distPhase?: number;\n /** Optional shift by fraction, 0.0 if undefined */\n fractPhase?: number;\n /** Optional flag to center stroke pattern and stretch ends, false if undefined */\n centerPhase?: boolean;\n /** Optional flag to enable or disable single segment mode */\n segmentMode?: boolean;\n /** Optional flag that denotes startWidth and endWidth represent physical widths that should not be affected by scale, false if undefined */\n physicalWidth?: boolean;\n /** Optional up vector for style (applicable to 3d only), 0.0,0.0,1.0 if undefined */\n normal?: XYZProps;\n /** Optional orientation for style (applicable to 3d only), 0.0,0.0,0.0 if undefined */\n rotation?: YawPitchRollProps;\n }\n\n /** Optional modifiers to override line style definition */\n export class Modifier implements ModifierProps {\n public scale?: number;\n public dashScale?: number;\n public gapScale?: number;\n public startWidth?: number;\n public endWidth?: number;\n public distPhase?: number;\n public fractPhase?: number;\n public centerPhase?: boolean;\n public segmentMode?: boolean;\n public physicalWidth?: boolean;\n public normal?: Vector3d;\n public rotation?: YawPitchRollAngles;\n\n /** constructor for LineStyle.Modifier */\n constructor(props: ModifierProps) {\n this.scale = props.scale;\n this.dashScale = props.dashScale;\n this.gapScale = props.gapScale;\n this.startWidth = props.startWidth;\n this.endWidth = props.endWidth;\n this.distPhase = props.distPhase;\n this.fractPhase = props.fractPhase;\n this.centerPhase = props.centerPhase;\n this.segmentMode = props.segmentMode;\n this.physicalWidth = props.physicalWidth;\n this.normal = props.normal ? Vector3d.fromJSON(props.normal) : undefined;\n this.rotation = props.rotation ? YawPitchRollAngles.fromJSON(props.rotation) : undefined;\n }\n\n /** Returns a deep copy of this object. */\n public clone() {\n return new Modifier(this);\n }\n\n /** Compare two LineStyle.Modifier for equivalence */\n public equals(other: Modifier): boolean {\n if (this === other) // same pointer\n return true;\n\n if (other.scale !== this.scale ||\n other.dashScale !== this.dashScale ||\n other.gapScale !== this.gapScale ||\n other.startWidth !== this.startWidth ||\n other.endWidth !== this.endWidth ||\n other.distPhase !== this.distPhase ||\n other.fractPhase !== this.fractPhase ||\n other.centerPhase !== this.centerPhase ||\n other.segmentMode !== this.segmentMode ||\n other.physicalWidth !== this.physicalWidth)\n return false;\n\n if ((this.normal === undefined) !== (other.normal === undefined))\n return false;\n if (this.normal && !this.normal.isAlmostEqual(other.normal!))\n return false;\n\n if ((this.rotation === undefined) !== (other.rotation === undefined))\n return false;\n if (this.rotation && !this.rotation.isAlmostEqual(other.rotation!))\n return false;\n\n return true;\n }\n\n public applyTransform(transform: Transform): boolean {\n if (transform.isIdentity)\n return true;\n if (this.normal) {\n transform.matrix.multiplyVector(this.normal, this.normal);\n const normalized = this.normal.normalize();\n if (normalized)\n this.normal.setFrom(normalized);\n else\n return false;\n }\n if (this.rotation) {\n const newTransform = this.rotation.toMatrix3d().multiplyMatrixTransform(transform);\n const scales = new Vector3d();\n if (!newTransform.matrix.normalizeColumnsInPlace(scales))\n return false;\n const newRotation = YawPitchRollAngles.createFromMatrix3d(newTransform.matrix);\n if (undefined === newRotation)\n return false;\n this.rotation.setFrom(newRotation);\n }\n\n let scaleFactor;\n const scaleVector = Vector3d.create();\n const scaleMatrix = transform.matrix;\n scaleMatrix.normalizeRowsInPlace(scaleVector);\n\n // Check for flatten transform, dividing scaleVector by 3 gives wrong scaleFactor\n if (scaleVector.x !== 0.0 && scaleVector.y !== 0.0 && scaleVector.z !== 0.0)\n scaleFactor = (scaleVector.x + scaleVector.y + scaleVector.z) / 3.0;\n else\n scaleFactor = (scaleVector.x + scaleVector.y + scaleVector.z) / 2.0;\n\n if (1.0 === scaleFactor)\n return true;\n\n if (this.scale)\n this.scale *= scaleFactor;\n\n if (this.physicalWidth)\n return true;\n\n if (this.startWidth)\n this.startWidth *= scaleFactor;\n\n if (this.endWidth)\n this.endWidth *= scaleFactor;\n\n return true;\n }\n }\n\n /** Line style id and optional modifiers to override line style definition */\n export class Info {\n public styleId: Id64String;\n public styleMod?: Modifier; // Optional modifiers to override line style definition\n\n /** Creates a LineStyle.Info object */\n constructor(styleId: Id64String, styleMod?: Modifier) {\n this.styleId = styleId;\n this.styleMod = styleMod;\n }\n\n /** Returns a deep copy of this object. */\n public clone(): Info {\n return new Info(this.styleId, this.styleMod ? this.styleMod.clone() : undefined);\n }\n\n public equals(other: Info): boolean {\n if (this === other)\n return true;\n if (this.styleId !== other.styleId)\n return false;\n if ((this.styleMod === undefined) !== (other.styleMod === undefined))\n return false;\n if (this.styleMod && !this.styleMod.equals(other.styleMod!))\n return false;\n return true;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"LineStyle.js","sourceRoot":"","sources":["../../../src/geometry/LineStyle.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/** @packageDocumentation\r\n * @module Symbology\r\n */\r\n\r\nimport { Id64String } from \"@itwin/core-bentley\";\r\nimport { Transform, Vector3d, XYZProps, YawPitchRollAngles, YawPitchRollProps } from \"@itwin/core-geometry\";\r\n\r\n/** @public */\r\nexport namespace LineStyle {\r\n\r\n /** Modify the line style appearance without changing the line style definition.\r\n * Applies to the style previously established by a [[GeometryAppearanceProps]] or current [[SubCategoryAppearance]].\r\n * Most of the modifiers affect the line style stroke pattern, with the orientation and scales being the exception.\r\n * @see [[GeometryStreamEntryProps]]\r\n */\r\n export interface ModifierProps {\r\n /** Optional scale to apply to all length values, 1.0 if undefined */\r\n scale?: number;\r\n /** Optional scale to apply to scalable dashes, 1.0 if undefined */\r\n dashScale?: number;\r\n /** Optional scale to apply to scalable gaps, 1.0 if undefined */\r\n gapScale?: number;\r\n /** Optional start width in meters to apply to dashes, no width if undefined */\r\n startWidth?: number;\r\n /** Optional end width in meters to apply to dashes, same as startWidth if undefined */\r\n endWidth?: number;\r\n /** Optional shift by distance in meters, 0.0 if undefined */\r\n distPhase?: number;\r\n /** Optional shift by fraction, 0.0 if undefined */\r\n fractPhase?: number;\r\n /** Optional flag to center stroke pattern and stretch ends, false if undefined */\r\n centerPhase?: boolean;\r\n /** Optional flag to enable or disable single segment mode */\r\n segmentMode?: boolean;\r\n /** Optional flag that denotes startWidth and endWidth represent physical widths that should not be affected by scale, false if undefined */\r\n physicalWidth?: boolean;\r\n /** Optional up vector for style (applicable to 3d only), 0.0,0.0,1.0 if undefined */\r\n normal?: XYZProps;\r\n /** Optional orientation for style (applicable to 3d only), 0.0,0.0,0.0 if undefined */\r\n rotation?: YawPitchRollProps;\r\n }\r\n\r\n /** Optional modifiers to override line style definition */\r\n export class Modifier implements ModifierProps {\r\n public scale?: number;\r\n public dashScale?: number;\r\n public gapScale?: number;\r\n public startWidth?: number;\r\n public endWidth?: number;\r\n public distPhase?: number;\r\n public fractPhase?: number;\r\n public centerPhase?: boolean;\r\n public segmentMode?: boolean;\r\n public physicalWidth?: boolean;\r\n public normal?: Vector3d;\r\n public rotation?: YawPitchRollAngles;\r\n\r\n /** constructor for LineStyle.Modifier */\r\n constructor(props: ModifierProps) {\r\n this.scale = props.scale;\r\n this.dashScale = props.dashScale;\r\n this.gapScale = props.gapScale;\r\n this.startWidth = props.startWidth;\r\n this.endWidth = props.endWidth;\r\n this.distPhase = props.distPhase;\r\n this.fractPhase = props.fractPhase;\r\n this.centerPhase = props.centerPhase;\r\n this.segmentMode = props.segmentMode;\r\n this.physicalWidth = props.physicalWidth;\r\n this.normal = props.normal ? Vector3d.fromJSON(props.normal) : undefined;\r\n this.rotation = props.rotation ? YawPitchRollAngles.fromJSON(props.rotation) : undefined;\r\n }\r\n\r\n /** Returns a deep copy of this object. */\r\n public clone() {\r\n return new Modifier(this);\r\n }\r\n\r\n /** Compare two LineStyle.Modifier for equivalence */\r\n public equals(other: Modifier): boolean {\r\n if (this === other) // same pointer\r\n return true;\r\n\r\n if (other.scale !== this.scale ||\r\n other.dashScale !== this.dashScale ||\r\n other.gapScale !== this.gapScale ||\r\n other.startWidth !== this.startWidth ||\r\n other.endWidth !== this.endWidth ||\r\n other.distPhase !== this.distPhase ||\r\n other.fractPhase !== this.fractPhase ||\r\n other.centerPhase !== this.centerPhase ||\r\n other.segmentMode !== this.segmentMode ||\r\n other.physicalWidth !== this.physicalWidth)\r\n return false;\r\n\r\n if ((this.normal === undefined) !== (other.normal === undefined))\r\n return false;\r\n if (this.normal && !this.normal.isAlmostEqual(other.normal!))\r\n return false;\r\n\r\n if ((this.rotation === undefined) !== (other.rotation === undefined))\r\n return false;\r\n if (this.rotation && !this.rotation.isAlmostEqual(other.rotation!))\r\n return false;\r\n\r\n return true;\r\n }\r\n\r\n public applyTransform(transform: Transform): boolean {\r\n if (transform.isIdentity)\r\n return true;\r\n if (this.normal) {\r\n transform.matrix.multiplyVector(this.normal, this.normal);\r\n const normalized = this.normal.normalize();\r\n if (normalized)\r\n this.normal.setFrom(normalized);\r\n else\r\n return false;\r\n }\r\n if (this.rotation) {\r\n const newTransform = this.rotation.toMatrix3d().multiplyMatrixTransform(transform);\r\n const scales = new Vector3d();\r\n if (!newTransform.matrix.normalizeColumnsInPlace(scales))\r\n return false;\r\n const newRotation = YawPitchRollAngles.createFromMatrix3d(newTransform.matrix);\r\n if (undefined === newRotation)\r\n return false;\r\n this.rotation.setFrom(newRotation);\r\n }\r\n\r\n let scaleFactor;\r\n const scaleVector = Vector3d.create();\r\n const scaleMatrix = transform.matrix;\r\n scaleMatrix.normalizeRowsInPlace(scaleVector);\r\n\r\n // Check for flatten transform, dividing scaleVector by 3 gives wrong scaleFactor\r\n if (scaleVector.x !== 0.0 && scaleVector.y !== 0.0 && scaleVector.z !== 0.0)\r\n scaleFactor = (scaleVector.x + scaleVector.y + scaleVector.z) / 3.0;\r\n else\r\n scaleFactor = (scaleVector.x + scaleVector.y + scaleVector.z) / 2.0;\r\n\r\n if (1.0 === scaleFactor)\r\n return true;\r\n\r\n if (this.scale)\r\n this.scale *= scaleFactor;\r\n\r\n if (this.physicalWidth)\r\n return true;\r\n\r\n if (this.startWidth)\r\n this.startWidth *= scaleFactor;\r\n\r\n if (this.endWidth)\r\n this.endWidth *= scaleFactor;\r\n\r\n return true;\r\n }\r\n }\r\n\r\n /** Line style id and optional modifiers to override line style definition */\r\n export class Info {\r\n public styleId: Id64String;\r\n public styleMod?: Modifier; // Optional modifiers to override line style definition\r\n\r\n /** Creates a LineStyle.Info object */\r\n constructor(styleId: Id64String, styleMod?: Modifier) {\r\n this.styleId = styleId;\r\n this.styleMod = styleMod;\r\n }\r\n\r\n /** Returns a deep copy of this object. */\r\n public clone(): Info {\r\n return new Info(this.styleId, this.styleMod ? this.styleMod.clone() : undefined);\r\n }\r\n\r\n public equals(other: Info): boolean {\r\n if (this === other)\r\n return true;\r\n if (this.styleId !== other.styleId)\r\n return false;\r\n if ((this.styleMod === undefined) !== (other.styleMod === undefined))\r\n return false;\r\n if (this.styleMod && !this.styleMod.equals(other.styleMod!))\r\n return false;\r\n return true;\r\n }\r\n }\r\n}\r\n"]}
|