Skip to content

Commit

Permalink
[nasadem] handle weirdly named tiles
Browse files Browse the repository at this point in the history
  • Loading branch information
JayKickliter committed Nov 8, 2023
1 parent 42f057a commit 8270250
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 12 deletions.
7 changes: 4 additions & 3 deletions nasadem/src/error.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
use std::path::PathBuf;
use thiserror::Error;

#[derive(Error, Debug)]
pub enum NasademError {
#[error("")]
Io(#[from] std::io::Error),

#[error("invalid HGT name, {0}")]
#[error("invalid HGT name {0}")]
HgtName(std::path::PathBuf),

#[error("invalid HGT file len, {0}")]
HgtLen(u64),
#[error("invalid HGT file len {0} for {1}")]
HgtLen(u64, PathBuf),
}
38 changes: 29 additions & 9 deletions nasadem/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,23 @@ impl Tile {
pub fn iter(&self) -> impl Iterator<Item = Sample<'_>> + '_ {
(0..(self.dimensions.0 * self.dimensions.1)).map(|index| Sample { tile: self, index })
}

/// Returns this tile's outline as a polygon.
pub fn polygon(&self) -> Polygon {
let delta = C::from(self.resolution) * HALF_ARCSEC;
let n = self.ne_corner_center.y + delta;
let e = self.sw_corner_center.x + delta;
let s = self.sw_corner_center.y - delta;
let w = self.sw_corner_center.x - delta;

polygon![
(x: w, y: s),
(x: e, y: s),
(x: e, y: n),
(x: w, y: n),
(x: w, y: s),
]
}
}

/// Private API
Expand Down Expand Up @@ -373,12 +390,15 @@ impl<'a> std::cmp::PartialEq for Sample<'a> {
impl<'a> std::cmp::Eq for Sample<'a> {}

fn extract_resolution<P: AsRef<Path>>(path: P) -> Result<(u8, (usize, usize)), NasademError> {
const RES_1_ARCSECONDS_FIBE_BEN: u64 = 3601 * 3601 * size_of::<u16>() as u64;
const RES_3_ARCSECONDS_FIBE_BEN: u64 = 1201 * 1201 * size_of::<u16>() as u64;
const RES_1_ARCSECONDS_FILE_LEN: u64 = 3601 * 3601 * size_of::<u16>() as u64;
const RES_3_ARCSECONDS_FILE_LEN: u64 = 1201 * 1201 * size_of::<u16>() as u64;
match path.as_ref().metadata().map(|m| m.len())? {
RES_1_ARCSECONDS_FIBE_BEN => Ok((1, (3601, 3601))),
RES_3_ARCSECONDS_FIBE_BEN => Ok((3, (1201, 1201))),
invalid_len => Err(NasademError::HgtLen(invalid_len)),
RES_1_ARCSECONDS_FILE_LEN => Ok((1, (3601, 3601))),
RES_3_ARCSECONDS_FILE_LEN => Ok((3, (1201, 1201))),
invalid_len => Err(NasademError::HgtLen(
invalid_len,
path.as_ref().to_path_buf(),
)),
}
}

Expand All @@ -393,14 +413,14 @@ fn parse_sw_corner<P: AsRef<Path>>(path: P) -> Result<Coord<i16>, NasademError>
return Err(mk_err());
}
let lat_sign = match &name[0..1] {
"N" => 1,
"S" => -1,
"N" | "n" => 1,
"S" | "s" => -1,
_ => return Err(mk_err()),
};
let lat = lat_sign * name[1..3].parse::<i16>().map_err(|_| mk_err())?;
let lon_sign = match &name[3..4] {
"E" => 1,
"W" => -1,
"E" | "e" => 1,
"W" | "w" => -1,
_ => return Err(mk_err()),
};
let lon = lon_sign * name[4..7].parse::<i16>().map_err(|_| mk_err())?;
Expand Down

0 comments on commit 8270250

Please sign in to comment.