1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
use std::result::Result;
use h3ron_h3_sys::H3Index;
use crate::error::Error;
use crate::index::Index;
use crate::HasH3Index;
#[derive(Debug, PartialEq, Clone)]
pub struct CoordIJ {
pub i: i32,
pub j: i32,
}
impl Default for CoordIJ {
fn default() -> Self {
Self { i: 0, j: 0 }
}
}
pub fn h3_to_local_ij(origin_index: &Index, index: &Index) -> Result<CoordIJ, Error> {
unsafe {
let mut cij = h3ron_h3_sys::CoordIJ { i: 0, j: 0 };
if h3ron_h3_sys::experimentalH3ToLocalIj(origin_index.h3index(), index.h3index(), &mut cij)
== 0
{
Ok(CoordIJ { i: cij.i, j: cij.j })
} else {
Err(Error::NoLocalIJCoordinates)
}
}
}
pub fn local_ij_to_h3(origin_index: &Index, coordij: &CoordIJ) -> Result<Index, Error> {
unsafe {
let cij = h3ron_h3_sys::CoordIJ {
i: coordij.i,
j: coordij.j,
};
let mut h3_index_out: H3Index = 0;
if h3ron_h3_sys::experimentalLocalIjToH3(origin_index.h3index(), &cij, &mut h3_index_out)
== 0
{
Ok(Index::new(h3_index_out))
} else {
Err(Error::NoLocalIJCoordinates)
}
}
}
#[cfg(test)]
mod tests {
use crate::experimental::{h3_to_local_ij, local_ij_to_h3};
use crate::index::Index;
use std::convert::TryFrom;
#[test]
fn test_local_ij() {
let origin_index = Index::try_from(0x89283080ddbffff_u64).unwrap();
let ring = origin_index.k_ring(1);
assert_ne!(ring.len(), 0);
let other_index = ring.iter().find(|i| **i != origin_index).unwrap().clone();
let coordij_origin = h3_to_local_ij(&origin_index, &origin_index).unwrap();
let coordij_other = h3_to_local_ij(&origin_index, &other_index).unwrap();
assert!(
((coordij_origin.i - coordij_other.i) >= -1)
&& ((coordij_origin.i - coordij_other.i) <= 1)
);
assert!(
((coordij_origin.j - coordij_other.j) >= -1)
&& ((coordij_origin.j - coordij_other.j) <= 1)
);
let other_index_2 = local_ij_to_h3(&origin_index, &coordij_other).unwrap();
assert_eq!(other_index, other_index_2);
}
}