readme, code structuring
This commit is contained in:
+5
-3
@@ -2,12 +2,14 @@
|
||||
name = "latlon"
|
||||
version = "0.1.0"
|
||||
authors = ["Ondřej Hruška <ondra@ondrovo.com>"]
|
||||
description = "Parse latitude/longitude from many common formats"
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
readme = "README.md"
|
||||
keywords = ["gps", "geo", "geography", "geospatial", "location", "parse"]
|
||||
categories = ["parser-implementations", "science"]
|
||||
license = "MIT"
|
||||
|
||||
[dependencies]
|
||||
geo-types = "0.5.0"
|
||||
regex = "1.3.7"
|
||||
lazy_static = "1.4.0"
|
||||
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
# latlon
|
||||
|
||||
Parse geographic coordinates from string.
|
||||
|
||||
A wide range of commonly used formats is supported.
|
||||
See the unit tests for a complete reference.
|
||||
|
||||
If a format you need is missing, please submit a merge request (including unit tests).
|
||||
|
||||
## Usage
|
||||
|
||||
```rust
|
||||
// parse a coord
|
||||
let coord : geo::Point = latlon::parse("N 50°5.30385', E 14°26.94732'").unwrap();
|
||||
|
||||
// individual lat/lng parsing
|
||||
let lat : f64 = latlon::parse_lat("N 50°5.30385'").unwrap();
|
||||
let lng : f64 = latlon::parse_lng("E 14°26.94732'").unwrap();
|
||||
```
|
||||
|
||||
## Supported formats
|
||||
|
||||
Example of supported formats:
|
||||
|
||||
- `40° 26′ 46″ N 79° 58′ 56″ W`
|
||||
- `N 40° 26′ 46″ W 79° 58′ 56″`
|
||||
- `40° 26.767' N 79° 58.933' W`
|
||||
- `40° 26′ 46″ 79° 58′ 56″`, `40° 26′ 46″, 79° 58′ 56″`, ...
|
||||
- `N 40° 26.767' W 79° 58.933'`
|
||||
- `40° 26.767' 79° 58.933'`, `40° 26.767', 79° 58.933'`, ...
|
||||
- `N 40.446° W 79.982°`
|
||||
- `40.446° N 79.982° W`
|
||||
- `40.446° 79.982°`, `40.446,79.982`, etc.
|
||||
|
||||
## Parser rules
|
||||
- All formats support negative degrees (preceded by a minus sign). Positive latitude is North, positive longitude is East.
|
||||
- Whitespace is optional and ignored, except for formats that would become unparsable.
|
||||
- Degree, minute and second symbols can be omitted.
|
||||
- Comma (`,`) may be used as an alternate decimal separator.
|
||||
- Unicode quotes (`’`, `”`) may be used in place of apostrophe and double quote (`'`, `"`)
|
||||
for minutes and seconds.
|
||||
- The two coordinates can be separated by comma (`,`), semicolon (`;`), whitespace (` `), or nothing
|
||||
at all, if not ambiguous.
|
||||
@@ -0,0 +1,27 @@
|
||||
use std::fmt;
|
||||
use std::fmt::{Display, Formatter};
|
||||
use std::num::ParseFloatError;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub(crate) struct ParseErrorInternal;
|
||||
|
||||
impl From<ParseFloatError> for ParseErrorInternal {
|
||||
fn from(_: ParseFloatError) -> Self {
|
||||
ParseErrorInternal
|
||||
}
|
||||
}
|
||||
|
||||
impl Display for ParseErrorInternal {
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
||||
f.write_str("Parse error")
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct GeoParseError<T: AsRef<str> + Display>(pub T);
|
||||
|
||||
impl<T: AsRef<str> + Display> Display for GeoParseError<T> {
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
||||
write!(f, "Error parsing coordinates from {}", self.0)
|
||||
}
|
||||
}
|
||||
+180
-573
File diff suppressed because it is too large
Load Diff
+303
@@ -0,0 +1,303 @@
|
||||
use crate::{parse, parse_lat, parse_lng};
|
||||
use geo_types::Point;
|
||||
|
||||
#[test]
|
||||
fn dms_ns_dms_ew() {
|
||||
let reference = Point::new(-79.98222222222222, 40.44611111111111);
|
||||
|
||||
assert_eq!(reference, parse(r#"40° 26′ 46″ N 79° 58′ 56″ W"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse(r#"40° 26’ 46″ N 79° 58’ 56″ W"#).unwrap(), "fancy apos");
|
||||
assert_eq!(reference, parse(r#"40° 26′ 46″ N, 79° 58′ 56″ W"#).unwrap(), "comma");
|
||||
assert_eq!(reference, parse(r#"40° 26′ 46″ N; 79° 58′ 56″ W"#).unwrap(), "semi");
|
||||
assert_eq!(reference, parse(r#"40° 26′ 46″ N,79° 58′ 56″ W"#).unwrap(), "comma2");
|
||||
assert_eq!(reference, parse(r#"40° 26′ 46″ N;79° 58′ 56″ W"#).unwrap(), "semi2");
|
||||
assert_eq!(reference, parse(r#"40° 26′ 46″ N ,79° 58′ 56″ W"#).unwrap(), "comma2");
|
||||
assert_eq!(reference, parse(r#"40° 26′ 46″ N ;79° 58′ 56″ W"#).unwrap(), "semi2");
|
||||
assert_eq!(reference, parse(r#"40°26′46″N79°58′56″W"#).unwrap(), "compact");
|
||||
assert_eq!(reference, parse(r#"40°26′46N79°58′56W"#).unwrap(), "compact, no sec mark");
|
||||
assert_eq!(reference, parse(r#"40 26 46 N 79 58 56 W"#).unwrap(), "no symbols");
|
||||
assert_eq!(reference, parse(r#"-40 26 46 S -79 58 56 E"#).unwrap(), "inverted");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ns_dms_ew_dms() {
|
||||
let reference = Point::new(-79.98222222222222, 40.44611111111111);
|
||||
|
||||
assert_eq!(reference, parse(r#"N 40° 26′ 46″ W 79° 58′ 56″"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse(r#"N 40° 26’ 46″ W 79° 58’ 56″"#).unwrap(), "fancy apos");
|
||||
assert_eq!(reference, parse(r#"N 40° 26′ 46″, W 79° 58′ 56″"#).unwrap(), "comma");
|
||||
assert_eq!(reference, parse(r#"N 40° 26′ 46″; W 79° 58′ 56″"#).unwrap(), "semi");
|
||||
assert_eq!(reference, parse(r#"N 40° 26′ 46″,W 79° 58′ 56″"#).unwrap(), "comma2");
|
||||
assert_eq!(reference, parse(r#"N 40° 26′ 46″;W 79° 58′ 56″"#).unwrap(), "semi2");
|
||||
assert_eq!(reference, parse(r#"N 40° 26′ 46″ , W 79° 58′ 56″"#).unwrap(), "comma3");
|
||||
assert_eq!(reference, parse(r#"N 40° 26′ 46″ ; W 79° 58′ 56″"#).unwrap(), "semi3");
|
||||
assert_eq!(reference, parse(r#"N40°26′46″W79°58′56″"#).unwrap(), "compact");
|
||||
assert_eq!(reference, parse(r#"N40°26′46W79°58′56"#).unwrap(), "compact, no sec mark");
|
||||
assert_eq!(reference, parse(r#"N 40 26 46 W 79 58 56"#).unwrap(), "no symbols");
|
||||
assert_eq!(reference, parse(r#"S -40 26 46 E -79 58 56"#).unwrap(), "inverted");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn dms_dms() {
|
||||
let reference = Point::new(79.98222222222222, 40.44611111111111);
|
||||
|
||||
assert_eq!(reference, parse(r#"40° 26′ 46″ 79° 58′ 56″"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse(r#"40° 26’ 46″ 79° 58’ 56″"#).unwrap(), "fancy apos");
|
||||
assert_eq!(reference, parse(r#"40° 26′ 46″, 79° 58′ 56″"#).unwrap(), "comma");
|
||||
assert_eq!(reference, parse(r#"40° 26′ 46″; 79° 58′ 56″"#).unwrap(), "semi");
|
||||
assert_eq!(reference, parse(r#"40° 26′ 46″,79° 58′ 56″"#).unwrap(), "comma2");
|
||||
assert_eq!(reference, parse(r#"40° 26′ 46″;79° 58′ 56″"#).unwrap(), "semi2");
|
||||
assert_eq!(reference, parse(r#"40° 26′ 46″ , 79° 58′ 56″"#).unwrap(), "comma3");
|
||||
assert_eq!(reference, parse(r#"40° 26′ 46″ ; 79° 58′ 56″"#).unwrap(), "semi3");
|
||||
assert_eq!(reference, parse(r#"40°26′46″79°58′56″"#).unwrap(), "compact");
|
||||
assert_eq!(reference, parse(r#"40 26 46 79 58 56"#).unwrap(), "no symbols");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn dm_ns_dm_ew() {
|
||||
let reference = Point::new(-79.98221666666667, 40.44055);
|
||||
|
||||
assert_eq!(reference, parse(r#"40° 26.433′ N 79° 58.933′ W"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse(r#"40° 26,433′ N 79° 58,933′ W"#).unwrap(), "comma dec");
|
||||
assert_eq!(reference, parse(r#"40° 26.433’ N 79° 58.933’ W"#).unwrap(), "fancy apos");
|
||||
assert_eq!(reference, parse(r#"40° 26.433′ N, 79° 58.933′ W"#).unwrap(), "comma");
|
||||
assert_eq!(reference, parse(r#"40° 26,433′ N, 79° 58,933′ W"#).unwrap(), "comma dec and comma sep");
|
||||
assert_eq!(reference, parse(r#"40° 26.433′ N; 79° 58.933′ W"#).unwrap(), "semi");
|
||||
assert_eq!(reference, parse(r#"40° 26.433′ N, 79° 58.933′ W"#).unwrap(), "comma2");
|
||||
assert_eq!(reference, parse(r#"40° 26.433′ N; 79° 58.933′ W"#).unwrap(), "semi2");
|
||||
assert_eq!(reference, parse(r#"40° 26.433 N,79° 58.933′ W"#).unwrap(), "comma3");
|
||||
assert_eq!(reference, parse(r#"40° 26.433 N;79° 58.933′ W"#).unwrap(), "semi3");
|
||||
assert_eq!(reference, parse(r#"40° 26.433′N , 79° 58.933′ W"#).unwrap(), "comma4");
|
||||
assert_eq!(reference, parse(r#"40° 26.433′N ; 79° 58.933′ W"#).unwrap(), "semi4");
|
||||
assert_eq!(reference, parse(r#"40°26.433′N79°58.933′W"#).unwrap(), "compact");
|
||||
assert_eq!(reference, parse(r#"40°26.433N79°58.933W"#).unwrap(), "compact, no min mark");
|
||||
assert_eq!(reference, parse(r#"40 26.433 N 79 58.933 W"#).unwrap(), "no symbols");
|
||||
assert_eq!(reference, parse(r#"-40 26.433 S -79 58.933 E"#).unwrap(), "inverted");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ns_dm_ew_dm() {
|
||||
let reference = Point::new(-79.98221666666667, 40.44055);
|
||||
|
||||
assert_eq!(reference, parse(r#"N 40° 26.433′ W 79° 58.933′"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse(r#"N 40° 26.433’ W 79° 58.933’"#).unwrap(), "fancy apos");
|
||||
assert_eq!(reference, parse(r#"N 40° 26,433′ W 79° 58,933′"#).unwrap(), "comma dec");
|
||||
assert_eq!(reference, parse(r#"N 40° 26.433′, W 79° 58.933′"#).unwrap(), "comma");
|
||||
assert_eq!(reference, parse(r#"N 40° 26,433′, W 79° 58,933′"#).unwrap(), "comma dec and comma sep");
|
||||
assert_eq!(reference, parse(r#"N 40° 26.433′; W 79° 58.933′"#).unwrap(), "semi");
|
||||
assert_eq!(reference, parse(r#"N 40° 26.433′, W 79° 58.933′"#).unwrap(), "comma2");
|
||||
assert_eq!(reference, parse(r#"N 40° 26.433′; W 79° 58.933′"#).unwrap(), "semi2");
|
||||
assert_eq!(reference, parse(r#"N 40° 26.433 ,W 79° 58.933′"#).unwrap(), "comma3");
|
||||
assert_eq!(reference, parse(r#"N 40° 26.433 ;W 79° 58.933′"#).unwrap(), "semi3");
|
||||
assert_eq!(reference, parse(r#"N 40° 26.433′ , W 79° 58.933′"#).unwrap(), "comma4");
|
||||
assert_eq!(reference, parse(r#"N 40° 26.433′ ; W 79° 58.933′"#).unwrap(), "semi4");
|
||||
assert_eq!(reference, parse(r#"N40°26.433′W79°58.933′"#).unwrap(), "compact");
|
||||
assert_eq!(reference, parse(r#"N40°26.433W79°58.933"#).unwrap(), "compact, no min mark");
|
||||
assert_eq!(reference, parse(r#"N40 26.433W79 58.933"#).unwrap(), "no symbols");
|
||||
assert_eq!(reference, parse(r#"S -40 26.433 E -79 58.933"#).unwrap(), "inverted");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn dm_dm() {
|
||||
let reference = Point::new(79.98221666666667, 40.44055);
|
||||
|
||||
assert_eq!(reference, parse(r#"40° 26.433′ 79° 58.933′"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse(r#"40° 26.433’ 79° 58.933’"#).unwrap(), "fancy apos");
|
||||
assert_eq!(reference, parse(r#"40° 26,433′ 79° 58,933′"#).unwrap(), "comma dec");
|
||||
assert_eq!(reference, parse(r#"40° 26.433′, 79° 58.933′"#).unwrap(), "comma");
|
||||
assert_eq!(reference, parse(r#"40° 26,433′, 79° 58,933′"#).unwrap(), "comma dec and comma sep");
|
||||
assert_eq!(reference, parse(r#"40° 26.433′; 79° 58.933′"#).unwrap(), "semi");
|
||||
assert_eq!(reference, parse(r#"40° 26.433′, 79° 58.933′"#).unwrap(), "comma2");
|
||||
assert_eq!(reference, parse(r#"40° 26.433′; 79° 58.933′"#).unwrap(), "semi2");
|
||||
assert_eq!(reference, parse(r#"40° 26.433 ,79° 58.933′"#).unwrap(), "comma3");
|
||||
assert_eq!(reference, parse(r#"40° 26.433 ;79° 58.933′"#).unwrap(), "semi3");
|
||||
assert_eq!(reference, parse(r#"40° 26.433′ , 79° 58.933′"#).unwrap(), "comma4");
|
||||
assert_eq!(reference, parse(r#"40° 26.433′ ; 79° 58.933′"#).unwrap(), "semi4");
|
||||
assert_eq!(reference, parse(r#"40°26.433′79°58.933′"#).unwrap(), "compact");
|
||||
assert_eq!(reference, parse(r#"40 26.433 79 58.933"#).unwrap(), "no symbols");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn d_ns_d_ew() {
|
||||
let reference = Point::new(-79.9822, 40.44055);
|
||||
|
||||
assert_eq!(reference, parse(r#"40.44055° N 79.9822° W"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse(r#"40,44055° N 79,9822° W"#).unwrap(), "comma dec");
|
||||
assert_eq!(reference, parse(r#"40.44055 N 79.9822 W"#).unwrap(), "no deg");
|
||||
assert_eq!(reference, parse(r#"40.44055° N, 79.9822° W"#).unwrap(), "comma");
|
||||
assert_eq!(reference, parse(r#"40,44055° N, 79,9822° W"#).unwrap(), "comma comma");
|
||||
assert_eq!(reference, parse(r#"40.44055° N; 79.9822° W"#).unwrap(), "semi");
|
||||
assert_eq!(reference, parse(r#"40.44055° N,79.9822° W"#).unwrap(), "comma2");
|
||||
assert_eq!(reference, parse(r#"40.44055° N;79.9822° W"#).unwrap(), "semi2");
|
||||
assert_eq!(reference, parse(r#"40.44055° N ,79.9822° W"#).unwrap(), "comma3");
|
||||
assert_eq!(reference, parse(r#"40.44055° N ;79.9822° W"#).unwrap(), "semi3");
|
||||
assert_eq!(reference, parse(r#"40.44055N79.9822W"#).unwrap(), "compact");
|
||||
assert_eq!(reference, parse(r#"-40.44055° S -79.9822° E"#).unwrap(), "inverted");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn d_d() {
|
||||
let reference = Point::new(79.9822, 40.44055);
|
||||
|
||||
assert_eq!(reference, parse(r#"40.44055° 79.9822°"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse(r#"40,44055° 79,9822°"#).unwrap(), "comma dec");
|
||||
assert_eq!(reference, parse(r#"40.44055 79.9822"#).unwrap(), "no deg");
|
||||
assert_eq!(reference, parse(r#"40.44055°, 79.9822°"#).unwrap(), "comma");
|
||||
assert_eq!(reference, parse(r#"40,44055°, 79,9822°"#).unwrap(), "comma comma");
|
||||
assert_eq!(reference, parse(r#"40.44055°; 79.9822°"#).unwrap(), "semi");
|
||||
assert_eq!(reference, parse(r#"40.44055°,79.9822°"#).unwrap(), "comma2");
|
||||
assert_eq!(reference, parse(r#"40.44055°;79.9822°"#).unwrap(), "semi2");
|
||||
assert_eq!(reference, parse(r#"40.44055° ,79.9822°"#).unwrap(), "comma3");
|
||||
assert_eq!(reference, parse(r#"40.44055° ;79.9822°"#).unwrap(), "semi3");
|
||||
}
|
||||
|
||||
|
||||
// ------ lat / lng separate ------
|
||||
|
||||
#[test]
|
||||
fn dms_nsew() {
|
||||
let reference = 40.44611111111111;
|
||||
|
||||
assert_eq!(reference, parse_lat(r#"40° 26′ 46″ N"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse_lat(r#"40° 26’ 46″ N"#).unwrap(), "fancy apos");
|
||||
assert_eq!(reference, parse_lat(r#"40°26′46″N"#).unwrap(), "compact");
|
||||
assert_eq!(reference, parse_lat(r#"40°26′46N"#).unwrap(), "compact, no sec mark");
|
||||
assert_eq!(reference, parse_lat(r#"40 26 46 N"#).unwrap(), "no symbols");
|
||||
assert_eq!(reference, parse_lat(r#"-40 26 46 S"#).unwrap(), "inverted");
|
||||
|
||||
assert_eq!(reference, parse_lng(r#"40° 26′ 46″ E"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse_lng(r#"40° 26’ 46″ E"#).unwrap(), "fancy apos");
|
||||
assert_eq!(reference, parse_lng(r#"40°26′46″E"#).unwrap(), "compact");
|
||||
assert_eq!(reference, parse_lng(r#"40°26′46E"#).unwrap(), "compact, no sec mark");
|
||||
assert_eq!(reference, parse_lng(r#"40 26 46 E"#).unwrap(), "no symbols");
|
||||
assert_eq!(reference, parse_lng(r#"-40 26 46 W"#).unwrap(), "inverted");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn nsew_dms() {
|
||||
let reference = 40.44611111111111;
|
||||
|
||||
assert_eq!(reference, parse_lat(r#"N 40° 26′ 46″"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse_lat(r#"N 40° 26’ 46″"#).unwrap(), "fancy apos");
|
||||
assert_eq!(reference, parse_lat(r#"N40°26′46"#).unwrap(), "compact, no sec mark");
|
||||
assert_eq!(reference, parse_lat(r#"N 40 26 46"#).unwrap(), "no symbols");
|
||||
assert_eq!(reference, parse_lat(r#"S -40 26 46"#).unwrap(), "inverted");
|
||||
|
||||
assert_eq!(reference, parse_lng(r#"E 40° 26′ 46″"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse_lng(r#"E 40° 26’ 46″"#).unwrap(), "fancy apos");
|
||||
assert_eq!(reference, parse_lng(r#"E40°26′46"#).unwrap(), "compact, no sec mark");
|
||||
assert_eq!(reference, parse_lng(r#"E 40 26 46"#).unwrap(), "no symbols");
|
||||
assert_eq!(reference, parse_lng(r#"W -40 26 46"#).unwrap(), "inverted");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn dms() {
|
||||
let reference = 40.44611111111111;
|
||||
let ref_neg = -reference;
|
||||
|
||||
assert_eq!(reference, parse_lat(r#"40° 26′ 46″"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse_lat(r#"40° 26’ 46″"#).unwrap(), "fancy apos");
|
||||
assert_eq!(reference, parse_lat(r#"40°26′46″"#).unwrap(), "compact");
|
||||
assert_eq!(reference, parse_lat(r#"40 26 46"#).unwrap(), "no symbols");
|
||||
assert_eq!(ref_neg, parse_lat(r#"-40° 26′ 46″"#).unwrap(), "neg");
|
||||
|
||||
assert_eq!(reference, parse_lng(r#"40° 26′ 46″"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse_lng(r#"40° 26’ 46″"#).unwrap(), "fancy apos");
|
||||
assert_eq!(reference, parse_lng(r#"40°26′46″"#).unwrap(), "compact");
|
||||
assert_eq!(reference, parse_lng(r#"40 26 46"#).unwrap(), "no symbols");
|
||||
assert_eq!(ref_neg, parse_lng(r#"-40° 26′ 46″"#).unwrap(), "neg");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn dm_nsew() {
|
||||
let reference = 40.44055;
|
||||
|
||||
assert_eq!(reference, parse_lat(r#"40° 26.433′ N"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse_lat(r#"40° 26,433′ N"#).unwrap(), "comma dec");
|
||||
assert_eq!(reference, parse_lat(r#"40° 26.433’ N"#).unwrap(), "fancy apos");
|
||||
assert_eq!(reference, parse_lat(r#"40°26.433′N"#).unwrap(), "compact");
|
||||
assert_eq!(reference, parse_lat(r#"40°26.433N"#).unwrap(), "compact, no min mark");
|
||||
assert_eq!(reference, parse_lat(r#"40 26.433 N"#).unwrap(), "no symbols");
|
||||
assert_eq!(reference, parse_lat(r#"-40 26.433 S"#).unwrap(), "inverted");
|
||||
|
||||
assert_eq!(reference, parse_lng(r#"40° 26.433′ E"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse_lng(r#"40° 26,433′ E"#).unwrap(), "comma dec");
|
||||
assert_eq!(reference, parse_lng(r#"40° 26.433’ E"#).unwrap(), "fancy apos");
|
||||
assert_eq!(reference, parse_lng(r#"40°26.433′E"#).unwrap(), "compact");
|
||||
assert_eq!(reference, parse_lng(r#"40°26.433E"#).unwrap(), "compact, no min mark");
|
||||
assert_eq!(reference, parse_lng(r#"40 26.433 E"#).unwrap(), "no symbols");
|
||||
assert_eq!(reference, parse_lng(r#"-40 26.433 W"#).unwrap(), "inverted");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn nsew_dm() {
|
||||
let reference = 40.44055;
|
||||
|
||||
assert_eq!(reference, parse_lat(r#"N 40° 26.433′"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse_lat(r#"N 40° 26.433’"#).unwrap(), "fancy apos");
|
||||
assert_eq!(reference, parse_lat(r#"N 40° 26,433′"#).unwrap(), "comma dec");
|
||||
assert_eq!(reference, parse_lat(r#"N40°26.433′"#).unwrap(), "compact");
|
||||
assert_eq!(reference, parse_lat(r#"N40°26.433"#).unwrap(), "compact, no min mark");
|
||||
assert_eq!(reference, parse_lat(r#"N40 26.433"#).unwrap(), "no symbols");
|
||||
assert_eq!(reference, parse_lat(r#"S -40 26.433"#).unwrap(), "inverted");
|
||||
|
||||
assert_eq!(reference, parse_lng(r#"E 40° 26.433′"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse_lng(r#"E 40° 26.433’"#).unwrap(), "fancy apos");
|
||||
assert_eq!(reference, parse_lng(r#"E 40° 26,433′"#).unwrap(), "comma dec");
|
||||
assert_eq!(reference, parse_lng(r#"E40°26.433′"#).unwrap(), "compact");
|
||||
assert_eq!(reference, parse_lng(r#"E40°26.433"#).unwrap(), "compact, no min mark");
|
||||
assert_eq!(reference, parse_lng(r#"E40 26.433"#).unwrap(), "no symbols");
|
||||
assert_eq!(reference, parse_lng(r#"W -40 26.433"#).unwrap(), "inverted");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn dm() {
|
||||
let reference = 40.44055;
|
||||
let ref_neg = -reference;
|
||||
|
||||
assert_eq!(reference, parse_lat(r#"40° 26.433′"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse_lat(r#"40° 26.433’"#).unwrap(), "fancy apos");
|
||||
assert_eq!(reference, parse_lat(r#"40° 26,433′"#).unwrap(), "comma dec");
|
||||
assert_eq!(reference, parse_lat(r#"40°26.433′"#).unwrap(), "compact");
|
||||
assert_eq!(reference, parse_lat(r#"40 26.433"#).unwrap(), "no symbols");
|
||||
assert_eq!(ref_neg, parse_lat(r#"-40° 26.433′"#).unwrap(), "neg");
|
||||
|
||||
assert_eq!(reference, parse_lng(r#"40° 26.433′"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse_lng(r#"40° 26.433’"#).unwrap(), "fancy apos");
|
||||
assert_eq!(reference, parse_lng(r#"40° 26,433′"#).unwrap(), "comma dec");
|
||||
assert_eq!(reference, parse_lng(r#"40°26.433′"#).unwrap(), "compact");
|
||||
assert_eq!(reference, parse_lng(r#"40 26.433"#).unwrap(), "no symbols");
|
||||
assert_eq!(ref_neg, parse_lng(r#"-40° 26.433′"#).unwrap(), "neg");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn d_nsew() {
|
||||
let reference = 40.44055;
|
||||
assert_eq!(reference, parse_lat(r#"40.44055° N"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse_lat(r#"40,44055° N"#).unwrap(), "comma dec");
|
||||
assert_eq!(reference, parse_lat(r#"40.44055 N"#).unwrap(), "no deg");
|
||||
assert_eq!(reference, parse_lat(r#"40.44055N"#).unwrap(), "compact");
|
||||
assert_eq!(reference, parse_lat(r#"-40.44055° S"#).unwrap(), "inverted");
|
||||
|
||||
assert_eq!(reference, parse_lng(r#"40.44055° E"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse_lng(r#"40,44055° E"#).unwrap(), "comma dec");
|
||||
assert_eq!(reference, parse_lng(r#"40.44055 E"#).unwrap(), "no deg");
|
||||
assert_eq!(reference, parse_lng(r#"40.44055E"#).unwrap(), "compact");
|
||||
assert_eq!(reference, parse_lng(r#"-40.44055° W"#).unwrap(), "inverted");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn d() {
|
||||
let reference = 40.44055;
|
||||
let ref_neg = -reference;
|
||||
|
||||
assert_eq!(reference, parse_lat(r#"40.44055°"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse_lat(r#"40,44055°"#).unwrap(), "comma dec");
|
||||
assert_eq!(reference, parse_lat(r#"40.44055"#).unwrap(), "no deg");
|
||||
assert_eq!(ref_neg, parse_lat(r#"-40.44055"#).unwrap(), "no deg");
|
||||
|
||||
assert_eq!(reference, parse_lng(r#"40.44055°"#).unwrap(), "normal");
|
||||
assert_eq!(reference, parse_lng(r#"40,44055°"#).unwrap(), "comma dec");
|
||||
assert_eq!(reference, parse_lng(r#"40.44055"#).unwrap(), "no deg");
|
||||
assert_eq!(ref_neg, parse_lng(r#"-40.44055"#).unwrap(), "no deg");
|
||||
}
|
||||
Reference in New Issue
Block a user