readFromFile static method

HgtFile readFromFile(
  1. File file, {
  2. required int baseLat,
  3. required int baseLon,
  4. required int tileWidth,
  5. required int tileHeight,
  6. required int rows,
})

Implementation

static HgtFile readFromFile(File file, {required int baseLat, required int baseLon, required int tileWidth, required int tileHeight, required int rows}) {
  if (!file.existsSync()) {
    _log.warning("HGT file not found: ${file.path}");
    return HgtFile._noFile(baseLat: baseLat, baseLon: baseLon, lonWidth: tileWidth, latHeight: tileHeight);
  }

  final Uint8List bytes = file.readAsBytesSync();
  if (bytes.lengthInBytes % 2 != 0) {
    throw StateError('Invalid .hgt length: ${bytes.lengthInBytes}');
  }

  int columns = bytes.lengthInBytes ~/ 2 ~/ rows;

  // HGT stores signed 16-bit big-endian.
  final ByteData bd = ByteData.sublistView(bytes);
  final elevations = Int16List(rows * columns);
  for (int i = 0; i < rows * columns; i++) {
    elevations[i] = bd.getInt16(i * 2, Endian.little);
  }

  return HgtFile._(baseLat: baseLat, baseLon: baseLon, lonWidth: tileWidth, latHeight: tileHeight, rows: rows, columns: columns, elevations: elevations);
}