]> gitweb.factorcode.org Git - factor.git/blob - extra/shapefiles/shapefiles.factor
shapefiles: reorder words to match read-shape enum list.
[factor.git] / extra / shapefiles / shapefiles.factor
1 ! Copyright (C) 2018 John Benediktsson
2 ! See http://factorcode.org/license.txt for BSD license
3
4 USING: arrays combinators io io.binary.fast io.encodings.binary
5 io.files kernel math sequences ;
6
7 IN: shapefiles
8
9 <PRIVATE
10
11 : read-int ( -- n )
12     4 read le> ;
13
14 : read-ints ( n -- parts )
15     [ read-int ] replicate ;
16
17 : read-double ( -- n )
18     8 read le> bits>double ;
19
20 : read-doubles ( n -- array )
21     [ read-double ] replicate ;
22
23 : read-box ( -- box )
24     4 read-doubles ;
25
26 : read-range ( -- range )
27     2 read-doubles ;
28
29 PRIVATE>
30
31 TUPLE: header file-code file-length version shape-type x-min
32 y-min x-max y-max z-min z-max m-min m-max ;
33
34 : read-header ( -- header )
35     4 read be> dup 9994 assert=
36     20 read drop ! unused
37     4 read be>
38     read-int dup 1000 assert=
39     read-int
40     read-double
41     read-double
42     read-double
43     read-double
44     read-double
45     read-double
46     read-double
47     read-double
48     header boa ;
49
50 SINGLETON: null-shape
51
52 TUPLE: point x y ;
53
54 : read-point ( -- point )
55     read-double read-double point boa ;
56
57 : read-points ( n -- points )
58     [ read-point ] replicate ;
59
60 TUPLE: multipoint box points ;
61
62 : read-multipoint ( -- multipoint )
63     read-box read-int read-points multipoint boa ;
64
65 TUPLE: polyline box parts points ;
66
67 : read-polyline ( -- polyline )
68     read-box read-int read-int [ read-ints ] dip
69     read-points polyline boa ;
70
71 TUPLE: polygon box parts points ;
72
73 : read-polygon ( -- polygon )
74     read-box read-int read-int [ read-ints ] dip
75     read-points polygon boa ;
76
77 TUPLE: point-z x y z m ;
78
79 : read-point-z ( -- point-z )
80     read-double read-double read-double read-double point-z boa ;
81
82 TUPLE: polyline-z box parts points z-range z-array m-range
83 m-array ;
84
85 : read-polyline-z ( -- polyline-z )
86     read-box read-int read-int [ read-ints ] dip
87     [ read-points read-range ]
88     [ read-doubles read-range ]
89     [ read-doubles ] tri polyline-z boa ;
90
91 TUPLE: polygon-z box parts points z-range z-array m-range
92 m-array ;
93
94 : read-polygon-z ( -- polygon-z )
95     read-box read-int read-int [ read-ints ] dip
96     [ read-points read-range ]
97     [ read-doubles read-range ]
98     [ read-doubles ] tri polygon-z boa ;
99
100 TUPLE: multipoint-z box points z-range z-array m-range m-array ;
101
102 : read-multipoint-z ( -- multipoint-z )
103     read-box read-int
104     [ read-points read-range ]
105     [ read-doubles read-range ]
106     [ read-doubles ] tri multipoint-z boa ;
107
108 TUPLE: point-m x y m ;
109
110 : read-point-m ( -- point-m )
111     read-double read-double read-double point-m boa ;
112
113 TUPLE: polyline-m box parts points m-range m-array ;
114
115 : read-polyline-m ( -- polyline-m )
116     read-box read-int read-int [ read-ints ] dip
117     [ read-points read-range ] [ read-doubles ] bi
118     polyline-m boa ;
119
120 TUPLE: polygon-m box parts points m-range m-array ;
121
122 : read-polygon-m ( -- polygon-m )
123     read-box read-int read-int [ read-ints ] dip
124     [ read-points read-range ] [ read-doubles ] bi
125     polygon-m boa ;
126
127 TUPLE: multipoint-m box points m-range m-array ;
128
129 : read-multipoint-m ( -- multipoint-m )
130     read-box read-int
131     [ read-points read-range ] [ read-doubles ] bi
132     multipoint-m boa ;
133
134 TUPLE: multipatch box parts part-types points z-range z-array
135 m-range m-array ;
136
137 : read-multipatch ( -- multipatch )
138     read-box read-int read-int
139     [ [ read-ints ] [ read-ints ] bi ] dip
140     [ read-points read-range ]
141     [ read-doubles read-range ]
142     [ read-doubles ] tri multipatch boa ;
143
144 : read-shape ( -- shape )
145     read-int {
146         { 0 [ null-shape ] }
147         { 1 [ read-point ] }
148         { 3 [ read-polyline ] }
149         { 5 [ read-polygon ] }
150         { 8 [ read-multipoint ] }
151         { 11 [ read-point-z ] }
152         { 13 [ read-polyline-z ] }
153         { 15 [ read-polygon-z ] }
154         { 18 [ read-multipoint-z ] }
155         { 21 [ read-point-m ] }
156         { 23 [ read-polyline-m ] }
157         { 25 [ read-polygon-m ] }
158         { 28 [ read-multipoint-m ] }
159         { 31 [ read-multipatch ] }
160     } case ;
161
162 TUPLE: record number content-length shape ;
163
164 : read-record ( -- record/f )
165     4 read [ be> 4 read be> read-shape record boa ] [ f ] if* ;
166
167 : read-records ( -- records )
168     [ read-record dup ] [ ] produce nip ;
169
170 : read-shp ( -- header records )
171     read-header read-records ;
172
173 : file>shp ( path -- header records )
174     binary [ read-shp ] with-file-reader ;
175
176 TUPLE: index offset content-length ;
177
178 : read-index ( -- index/f )
179     4 read [ be> 4 read be> index boa ] [ f ] if* ;
180
181 : read-indices ( -- indices )
182     [ read-index dup ] [ ] produce nip ;
183
184 : read-shx ( -- header indices )
185     read-header read-indices ;
186
187 : file>shx ( path -- header indices )
188     binary [ read-shx ] with-file-reader ;