{"version":3,"file":"EarthGravityModel1996.mjs","sources":["../../../../../../packages/components/controls/status-bar/EarthGravityModel1996.ts"],"sourcesContent":["interface EarthGravityModel1996 {\n  gridFileUrl: string\n  data: unknown\n  minimumHeight: number\n  maximumHeight: number\n}\n\nclass EarthGravityModel1996 {\n  /**\n   * The Earth Gravity Model 1996 (EGM96) geoid.\n   * @param {String} gridFileUrl The URL of the WW15MGH.DAC file.\n   */\n  constructor(gridFileUrl) {\n    this.gridFileUrl = gridFileUrl\n    this.data = undefined\n\n    // These values were determined by inspecting the WW15MGH.DAC file.  We hard-code them here because\n    // we need them available before that file finishes loading.\n    this.minimumHeight = -106.99\n    this.maximumHeight = 85.39\n  }\n\n  /**\n   * Determines if this class will work in the current environment.  It will return false on older browsers without support\n   * for typed arrays.\n   * @return {Boolean} True if this class may be used in this environment; otherwise, false.\n   */\n  isSupported() {\n    return typeof Int16Array !== 'undefined' && typeof Uint8Array !== 'undefined'\n  }\n\n  /**\n   * Gets the height of EGM96 above the surface of the ellipsoid.\n   * @param {String} baseUrl The base URL for TerriaJS resources.\n   * @param {Number} longitude The longitude.\n   * @param {Number} latitude The latitude\n   * @return {Promise|Number} A promise, that, when it results The height of mean sea level above the ellipsoid at the specified location.  Negative numbers indicate that mean sea level\n   *                  is below the ellipsoid.\n   */\n  getHeight(longitude, latitude) {\n    return getHeightData(this).then(function (data) {\n      return getHeightFromData(data, longitude, latitude)\n    })\n  }\n\n  getHeights(cartographicArray) {\n    return getHeightData(this).then(function (data) {\n      for (let i = 0; i < cartographicArray.length; ++i) {\n        const cartographic = cartographicArray[i]\n        cartographic.height = getHeightFromData(data, cartographic.longitude, cartographic.latitude)\n      }\n      return cartographicArray\n    })\n  }\n}\n\nasync function getHeightData(model) {\n  const { defined } = Cesium\n  if (!defined(model.data)) {\n    model.data = loadArrayBuffer(model.gridFileUrl)\n  }\n  let data = model.data\n  if (model.data instanceof Promise) {\n    data = await model.data\n  }\n\n  if (!(model.data instanceof Int16Array)) {\n    // Data file is big-endian, all relevant platforms are little endian, so swap the byte order.\n    const byteView = new Uint8Array(data)\n    for (let k = 0; k < byteView.length; k += 2) {\n      const tmp = byteView[k]\n      byteView[k] = byteView[k + 1]\n      byteView[k + 1] = tmp\n    }\n    model.data = new Int16Array(data)\n  }\n\n  return model.data\n}\n\nfunction getHeightFromData(data, longitude, latitude) {\n  const { Math: CesiumMath } = Cesium\n  let recordIndex = (720 * (CesiumMath.PI_OVER_TWO - latitude)) / Math.PI\n  if (recordIndex < 0) {\n    recordIndex = 0\n  } else if (recordIndex > 720) {\n    recordIndex = 720\n  }\n\n  longitude = CesiumMath.zeroToTwoPi(longitude)\n  let heightIndex = (1440 * longitude) / CesiumMath.TWO_PI\n  if (heightIndex < 0) {\n    heightIndex = 0\n  } else if (heightIndex > 1440) {\n    heightIndex = 1440\n  }\n\n  const i = heightIndex | 0\n  const j = recordIndex | 0\n\n  const xMinusX1 = heightIndex - i\n  const yMinusY1 = recordIndex - j\n  const x2MinusX = 1.0 - xMinusX1\n  const y2MinusY = 1.0 - yMinusY1\n\n  const f11 = getHeightValue(data, j, i)\n  const f21 = getHeightValue(data, j, i + 1)\n  const f12 = getHeightValue(data, j + 1, i)\n  const f22 = getHeightValue(data, j + 1, i + 1)\n\n  return (f11 * x2MinusX * y2MinusY + f21 * xMinusX1 * y2MinusY + f12 * x2MinusX * yMinusY1 + f22 * xMinusX1 * yMinusY1) / 100.0\n}\n\n// Heights returned by this function are in centimeters.\nfunction getHeightValue(data, recordIndex, heightIndex) {\n  if (recordIndex > 720) {\n    recordIndex = 720\n  } else if (recordIndex < 0) {\n    recordIndex = 0\n  }\n\n  if (heightIndex > 1439) {\n    heightIndex -= 1440\n  } else if (heightIndex < 0) {\n    heightIndex += 1440\n  }\n\n  return data[recordIndex * 1440 + heightIndex]\n}\n\nfunction loadArrayBuffer(urlOrResource) {\n  const { Resource } = Cesium\n  const resource = (Resource as any).createIfNeeded(urlOrResource)\n  return resource.fetchArrayBuffer()\n}\n\nexport default EarthGravityModel1996\n"],"names":[],"mappings":"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"}