@@ -4,16 +4,16 @@ use std::io;
4
4
use std:: path:: Path ;
5
5
use std:: { borrow:: Borrow , convert:: TryInto } ;
6
6
7
- use geo:: { point, Relate , Contains , Geometry , MultiPolygon , Point , Polygon , PreparedGeometry } ;
7
+ use geo:: { point, Contains , Geometry , MultiPolygon , Point , Polygon , PreparedGeometry , Relate } ;
8
8
use numpy:: { PyArray , PyReadonlyArrayDyn } ;
9
- use rstar:: { PointDistance , RTree , RTreeObject , AABB , Envelope } ;
9
+ use rstar:: { Envelope , PointDistance , RTree , RTreeObject , AABB } ;
10
10
11
11
pub static GSHHS_F : & str = "gshhs_f_-180.000000E-90.000000N180.000000E90.000000N.wkb.xz" ;
12
12
13
13
#[ pyclass]
14
14
#[ derive( Clone ) ]
15
15
pub struct Gshhg {
16
- geom : RTree < PolW > ,
16
+ geom : PreparedGeometry < ' static > ,
17
17
}
18
18
19
19
#[ derive( Clone ) ]
@@ -63,11 +63,13 @@ impl PointDistance for PolW {
63
63
impl Gshhg {
64
64
pub fn from_geom ( geom : Geometry ) -> io:: Result < Gshhg > {
65
65
let geom: MultiPolygon = geom. try_into ( ) . unwrap ( ) ;
66
- assert ! ( geom. 0 . len( ) > 10 ) ;
67
- let geoms = geom. 0 . into_iter ( ) . map ( |p| PolW :: from ( p) ) . collect ( ) ;
66
+ // assert!(geom.0.len() > 10);
67
+ // let geoms = geom.0.into_iter().map(|p| PolW::from(p)).collect();
68
68
69
- let geom = RTree :: bulk_load ( geoms) ;
70
- Ok ( Gshhg { geom } )
69
+ // let geom = RTree::bulk_load(geoms);
70
+ Ok ( Gshhg {
71
+ geom : PreparedGeometry :: from ( geom) ,
72
+ } )
71
73
}
72
74
73
75
pub fn from_compressed < P : AsRef < Path > > ( path : P ) -> io:: Result < Gshhg > {
@@ -83,21 +85,26 @@ impl Gshhg {
83
85
let geom = wkb:: wkb_to_geom ( & mut fd) . unwrap ( ) ;
84
86
Ok ( geom)
85
87
}
86
- }
87
88
88
- #[ pymethods]
89
- impl Gshhg {
90
- /// Make a new Gshhg shapes instance.
91
- #[ staticmethod]
92
- pub fn new ( _py : Python ) -> io:: Result < Self > {
89
+ pub fn geom_from_embedded ( ) -> io:: Result < Geometry > {
93
90
use crate :: GsshgData ;
94
91
95
92
let buf = GsshgData :: get ( & GSHHS_F )
96
93
. ok_or_else ( || io:: Error :: new ( io:: ErrorKind :: NotFound , "cannot find shapes" ) ) ?;
97
94
let buf: & [ u8 ] = buf. data . borrow ( ) ;
98
95
let mut fd = xz2:: read:: XzDecoder :: new ( buf) ;
99
96
let geom = wkb:: wkb_to_geom ( & mut fd) . unwrap ( ) ;
100
- Gshhg :: from_geom ( geom)
97
+
98
+ Ok ( geom)
99
+ }
100
+ }
101
+
102
+ #[ pymethods]
103
+ impl Gshhg {
104
+ /// Make a new Gshhg shapes instance.
105
+ #[ staticmethod]
106
+ pub fn new ( _py : Python ) -> io:: Result < Self > {
107
+ Gshhg :: from_geom ( Gshhg :: geom_from_embedded ( ) ?)
101
108
}
102
109
103
110
/// Check if point (x, y) is on land.
@@ -116,7 +123,9 @@ impl Gshhg {
116
123
/// Same as `contains`, but does not check for bounds.
117
124
pub ( crate ) fn contains_unchecked ( & self , x : f64 , y : f64 ) -> bool {
118
125
let p = point ! ( x: x, y: y) ;
119
- self . geom . locate_at_point ( & p) . is_some ( )
126
+ // self.geom.locate_at_point(&p).is_some()
127
+ // self.geom.relate(&p).is_contains()
128
+ self . geom . relate ( & p) . is_covers ( )
120
129
}
121
130
122
131
pub fn contains_many (
0 commit comments