Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
export function calculateSolarAngles(date: Date, location: Cartographic): { azimuth: number, elevation: number } {
const jDay = calculateJulianDay(date);
const latitude = Angle.radiansToDegrees(location.latitude);
const longitude = Angle.radiansToDegrees(location.longitude);
const utcMinutes = date.getUTCHours() * 60 + date.getUTCMinutes() + date.getUTCSeconds() / 60;
const zone = Math.floor(.5 + longitude / 15.0); // date.getTimeZoneOffset mixes in DST.
const localMinutes = utcMinutes + zone * 60;
const jTotal = jDay + utcMinutes / 1440.0;
const T = calcTimeJulianCent(jTotal);
return calcAzEl(T, localMinutes, latitude, longitude, zone);
}
public async cartographicToSpatialFromGcs(cartographic: Cartographic, result?: Point3d): Promise {
if (undefined === this._noGcsDefined && !this.isGeoLocated)
this._noGcsDefined = true;
if (this._noGcsDefined)
throw new IModelError(IModelStatus.NoGeoLocation, "iModel is not GeoLocated");
const geoConverter = this.geoServices.getConverter()!;
const geoCoord = Point3d.create(Angle.radiansToDegrees(cartographic.longitude), Angle.radiansToDegrees(cartographic.latitude), cartographic.height); // x is longitude in degrees, y is latitude in degrees, z is height in meters...
const coordResponse = await geoConverter.getIModelCoordinatesFromGeoCoordinates([geoCoord]);
if (this._noGcsDefined = (1 !== coordResponse.iModelCoords.length || GeoCoordStatus.NoGCSDefined === coordResponse.iModelCoords[0].s))
throw new IModelError(IModelStatus.NoGeoLocation, "iModel is not GeoLocated");
if (GeoCoordStatus.Success !== coordResponse.iModelCoords[0].s)
throw new IModelError(IModelStatus.BadRequest, "Error converting cartographic to spatial");
result = result ? result : Point3d.createZero();
result.setFromJSON(coordResponse.iModelCoords[0].p);
return result;
}
export function calculateSolarAngles(date: Date, location: Cartographic): { azimuth: number, elevation: number } {
const jDay = calculateJulianDay(date);
const latitude = Angle.radiansToDegrees(location.latitude);
const longitude = Angle.radiansToDegrees(location.longitude);
const utcMinutes = date.getUTCHours() * 60 + date.getUTCMinutes() + date.getUTCSeconds() / 60;
const zone = Math.floor(.5 + longitude / 15.0); // date.getTimeZoneOffset mixes in DST.
const localMinutes = utcMinutes + zone * 60;
const jTotal = jDay + utcMinutes / 1440.0;
const T = calcTimeJulianCent(jTotal);
return calcAzEl(T, localMinutes, latitude, longitude, zone);
}
public async getHeightAverage(iModel: IModelConnection) {
const latLongRange = Range2d.createNull();
for (const corner of iModel.projectExtents.corners()) {
const carto = iModel.spatialToCartographicFromEcef(corner);
latLongRange.extendXY(Angle.radiansToDegrees(carto.longitude), Angle.radiansToDegrees(carto.latitude));
}
const heights = await this.getHeights(latLongRange);
let total = 0.0;
for (const height of heights) total += height;
return total / heights.length;
}
public async getGraphic(latLongRange: Range2d, corners: Point3d[], groundBias: number, texture: RenderTexture, system: RenderSystem): Promise {
public async getRealityDataInProjectOverlapping(requestContext: AuthorizedClientRequestContext, projectId: string, range: Range2d): Promise {
const minLongDeg = Angle.radiansToDegrees(range.low.x);
const maxLongDeg = Angle.radiansToDegrees(range.high.x);
const minLatDeg = Angle.radiansToDegrees(range.low.y);
const maxLatDeg = Angle.radiansToDegrees(range.high.y);
const polygonString = `{\"points\":[[${minLongDeg},${minLatDeg}],[${maxLongDeg},${minLatDeg}],[${maxLongDeg},${maxLatDeg}],[${minLongDeg},${maxLatDeg}],[${minLongDeg},${minLatDeg}]], \"coordinate_system\":\"4326\"}`;
const realityDatas: RealityData[] = await this.getInstances(requestContext, RealityData, `/Repositories/S3MXECPlugin--${projectId}/S3MX/RealityData?project=${projectId}&polygon=${polygonString}&$filter=Type+eq+'RealityMesh3DTiles'`);
realityDatas.forEach((realityData) => { realityData.client = this; realityData.projectId = projectId; });
return realityDatas;
}
public async getRealityDataInProjectOverlapping(requestContext: AuthorizedClientRequestContext, projectId: string, range: Range2d): Promise {
const minLongDeg = Angle.radiansToDegrees(range.low.x);
const maxLongDeg = Angle.radiansToDegrees(range.high.x);
const minLatDeg = Angle.radiansToDegrees(range.low.y);
const maxLatDeg = Angle.radiansToDegrees(range.high.y);
const polygonString = `{\"points\":[[${minLongDeg},${minLatDeg}],[${maxLongDeg},${minLatDeg}],[${maxLongDeg},${maxLatDeg}],[${minLongDeg},${maxLatDeg}],[${minLongDeg},${minLatDeg}]], \"coordinate_system\":\"4326\"}`;
const realityDatas: RealityData[] = await this.getInstances(requestContext, RealityData, `/Repositories/S3MXECPlugin--${projectId}/S3MX/RealityData?project=${projectId}&polygon=${polygonString}&$filter=Type+eq+'RealityMesh3DTiles'`);
realityDatas.forEach((realityData) => { realityData.client = this; realityData.projectId = projectId; });
return realityDatas;
}
public async getRealityDataInProjectOverlapping(requestContext: AuthorizedClientRequestContext, projectId: string, range: Range2d): Promise {
const minLongDeg = Angle.radiansToDegrees(range.low.x);
const maxLongDeg = Angle.radiansToDegrees(range.high.x);
const minLatDeg = Angle.radiansToDegrees(range.low.y);
const maxLatDeg = Angle.radiansToDegrees(range.high.y);
const polygonString = `{\"points\":[[${minLongDeg},${minLatDeg}],[${maxLongDeg},${minLatDeg}],[${maxLongDeg},${maxLatDeg}],[${minLongDeg},${maxLatDeg}],[${minLongDeg},${minLatDeg}]], \"coordinate_system\":\"4326\"}`;
const realityDatas: RealityData[] = await this.getInstances(requestContext, RealityData, `/Repositories/S3MXECPlugin--${projectId}/S3MX/RealityData?project=${projectId}&polygon=${polygonString}&$filter=Type+eq+'RealityMesh3DTiles'`);
realityDatas.forEach((realityData) => { realityData.client = this; realityData.projectId = projectId; });
return realityDatas;
}
private getZone(location: Cartographic) {
const longitude = Angle.radiansToDegrees(location.longitude);
return Math.floor(.5 + longitude / 15.0);
}
public async getHeightValue(point: Point3d, iModel: IModelConnection, geodetic = true): Promise {
const carto = iModel.spatialToCartographicFromEcef(point);
const requestUrl = this._heightListRequestTemplate.replace("{points}", Angle.radiansToDegrees(carto.latitude) + "," + Angle.radiansToDegrees(carto.longitude)).replace("{heights}", geodetic ? "ellipsoid" : "sealevel");
const requestOptions: RequestOptions = { method: "GET", responseType: "json" };
try {
const tileResponse: Response = await request(this._requestContext, requestUrl, requestOptions);
return tileResponse.body.resourceSets[0].resources[0].elevations[0];
} catch (error) {
return 0.0;
}
}