53
56
wkbMultiLineString=5,
55
58
wkbGeometryCollection=7
58
wkb_reader(const char* wkb,unsigned size,wkbFormat format)
61
wkb_reader(const char* wkb,unsigned size,wkbFormat format)
67
byteOrder_ = (wkbByteOrder) wkb_[1];
70
byteOrder_ = (wkbByteOrder) wkb_[1];
73
byteOrder_ = (wkbByteOrder) wkb_[0];
76
byteOrder_ = (wkbByteOrder) wkb_[0];
78
#ifndef WORDS_BIGENDIAN
81
#ifndef MAPNIK_BIG_ENDIAN
79
82
needSwap_=byteOrder_?wkbXDR:wkbNDR;
81
84
needSwap_=byteOrder_?wkbNDR:wkbXDR;
87
void read_multi(Feature & feature)
90
void read_multi(Feature & feature)
89
92
int type=read_integer();
96
read_linestring(feature);
99
read_polygon(feature);
102
read_multipoint(feature);
104
case wkbMultiLineString:
105
read_multilinestring(feature);
107
case wkbMultiPolygon:
108
read_multipolygon(feature);
110
case wkbGeometryCollection:
99
read_linestring(feature);
102
read_polygon(feature);
105
read_multipoint(feature);
107
case wkbMultiLineString:
108
read_multilinestring(feature);
110
case wkbMultiPolygon:
111
read_multipolygon(feature);
113
case wkbGeometryCollection:
117
void read(Feature & feature)
120
void read(Feature & feature)
119
122
int type=read_integer();
126
read_linestring(feature);
129
read_polygon(feature);
132
read_multipoint_2(feature);
134
case wkbMultiLineString:
135
read_multilinestring_2(feature);
137
case wkbMultiPolygon:
138
read_multipolygon_2(feature);
140
case wkbGeometryCollection:
129
read_linestring(feature);
132
read_polygon(feature);
135
read_multipoint_2(feature);
137
case wkbMultiLineString:
138
read_multilinestring_2(feature);
140
case wkbMultiPolygon:
141
read_multipolygon_2(feature);
143
case wkbGeometryCollection:
148
wkb_reader(const wkb_reader&);
149
wkb_reader& operator=(const wkb_reader&);
157
memcpy(&n,wkb_+pos_,4);
157
read_int32_xdr(wkb_+pos_,n);
161
const char* b=wkb_+pos_;
162
n = (b[3]&0xff) | ((b[2]&0xff)<<8) | ((b[1]&0xff)<<16) | ((b[0]&0xff)<<24);
161
read_int32_ndr(wkb_+pos_,n);
175
memcpy(&d,wkb_+pos_,8);
173
read_double_xdr(wkb_ + pos_, d);
179
// we rely on the fact that "long long" is in C standard,
180
// but not in C++ yet
181
// this is not quite portable
182
const char* b= wkb_+pos_;
183
long long n = ((long long)b[7]&0xff) |
184
(((long long)b[6]&0xff)<<8) |
185
(((long long)b[5]&0xff)<<16) |
186
(((long long)b[4]&0xff)<<24) |
187
(((long long)b[3]&0xff)<<32) |
188
(((long long)b[2]&0xff)<<40) |
189
(((long long)b[1]&0xff)<<48) |
190
(((long long)b[0]&0xff)<<56);
177
read_double_ndr(wkb_ + pos_, d);
198
void read_coords(CoordinateArray& ar)
184
void read_coords(CoordinateArray& ar)
200
186
int size=sizeof(coord<double,2>)*ar.size();
203
std::memcpy(&ar[0],wkb_+pos_,size);
189
std::memcpy(&ar[0],wkb_+pos_,size);
208
for (unsigned i=0;i<ar.size();++i)
210
ar[i].x=read_double();
211
ar[i].y=read_double();
194
for (unsigned i=0;i<ar.size();++i)
196
read_double_xdr(wkb_ + pos_,ar[i].x);
197
read_double_xdr(wkb_ + pos_ + 8,ar[i].y);
217
void read_point(Feature & feature)
204
void read_point(Feature & feature)
219
206
geometry2d * pt = new point<vertex2d>;
220
207
double x = read_double();
221
208
double y = read_double();
222
209
pt->move_to(x,y);
223
210
feature.add_geometry(pt);
226
void read_multipoint(Feature & feature)
213
void read_multipoint(Feature & feature)
228
215
int num_points = read_integer();
229
216
for (int i=0;i<num_points;++i)
236
void read_multipoint_2(Feature & feature)
223
void read_multipoint_2(Feature & feature)
238
225
geometry2d * pt = new point<vertex2d>;
239
226
int num_points = read_integer();
240
227
for (int i=0;i<num_points;++i)
243
double x = read_double();
244
double y = read_double();
230
double x = read_double();
231
double y = read_double();
247
234
feature.add_geometry(pt);
250
void read_linestring(Feature & feature)
237
void read_linestring(Feature & feature)
252
239
geometry2d * line = new line_string<vertex2d>;
253
240
int num_points=read_integer();
254
241
CoordinateArray ar(num_points);
257
244
line->move_to(ar[0].x,ar[0].y);
258
245
for (int i=1;i<num_points;++i)
260
line->line_to(ar[i].x,ar[i].y);
247
line->line_to(ar[i].x,ar[i].y);
262
249
feature.add_geometry(line);
265
void read_multilinestring(Feature & feature)
252
void read_multilinestring(Feature & feature)
267
254
int num_lines=read_integer();
268
255
for (int i=0;i<num_lines;++i)
271
read_linestring(feature);
258
read_linestring(feature);
275
void read_multilinestring_2(Feature & feature)
262
void read_multilinestring_2(Feature & feature)
277
264
geometry2d * line = new line_string<vertex2d>;
278
265
int num_lines=read_integer();
279
266
unsigned capacity = 0;
280
267
for (int i=0;i<num_lines;++i)
283
int num_points=read_integer();
284
capacity+=num_points;
285
CoordinateArray ar(num_points);
287
line->set_capacity(capacity);
288
line->move_to(ar[0].x,ar[0].y);
289
for (int i=1;i<num_points;++i)
291
line->line_to(ar[i].x,ar[i].y);
270
int num_points=read_integer();
271
capacity+=num_points;
272
CoordinateArray ar(num_points);
274
line->set_capacity(capacity);
275
line->move_to(ar[0].x,ar[0].y);
276
for (int i=1;i<num_points;++i)
278
line->line_to(ar[i].x,ar[i].y);
294
281
feature.add_geometry(line);
297
void read_polygon(Feature & feature)
284
void read_polygon(Feature & feature)
299
286
geometry2d * poly = new polygon<vertex2d>;
300
287
int num_rings=read_integer();
301
288
unsigned capacity = 0;
302
289
for (int i=0;i<num_rings;++i)
304
int num_points=read_integer();
305
capacity+=num_points;
306
CoordinateArray ar(num_points);
308
poly->set_capacity(capacity);
309
poly->move_to(ar[0].x,ar[0].y);
310
for (int j=1;j<num_points;++j)
312
poly->line_to(ar[j].x,ar[j].y);
291
int num_points=read_integer();
292
capacity+=num_points;
293
CoordinateArray ar(num_points);
295
poly->set_capacity(capacity);
296
poly->move_to(ar[0].x,ar[0].y);
297
for (int j=1;j<num_points;++j)
299
poly->line_to(ar[j].x,ar[j].y);
315
302
feature.add_geometry(poly);
318
void read_multipolygon(Feature & feature)
305
void read_multipolygon(Feature & feature)
320
307
int num_polys=read_integer();
321
308
for (int i=0;i<num_polys;++i)
324
read_polygon(feature);
311
read_polygon(feature);
328
void read_multipolygon_2(Feature & feature)
315
void read_multipolygon_2(Feature & feature)
330
317
geometry2d * poly = new polygon<vertex2d>;
331
318
int num_polys=read_integer();
332
319
unsigned capacity = 0;
333
320
for (int i=0;i<num_polys;++i)
336
int num_rings=read_integer();
337
for (int i=0;i<num_rings;++i)
339
int num_points=read_integer();
340
capacity += num_points;
341
CoordinateArray ar(num_points);
343
poly->set_capacity(capacity);
344
poly->move_to(ar[0].x,ar[0].y);
323
int num_rings=read_integer();
324
for (int i=0;i<num_rings;++i)
326
int num_points=read_integer();
327
capacity += num_points;
328
CoordinateArray ar(num_points);
330
poly->set_capacity(capacity);
331
poly->move_to(ar[0].x,ar[0].y);
346
for (int j=1;j<num_points;++j)
348
poly->line_to(ar[j].x,ar[j].y);
350
poly->line_to(ar[0].x,ar[0].y);
333
for (int j=1;j<num_points;++j)
335
poly->line_to(ar[j].x,ar[j].y);
337
poly->line_to(ar[0].x,ar[0].y);
353
340
feature.add_geometry(poly);
357
void geometry_utils::from_wkb (Feature & feature,
344
void geometry_utils::from_wkb (Feature & feature,
360
347
bool multiple_geometries,
361
348
wkbFormat format)
363
wkb_reader reader(wkb,size,format);
364
if (multiple_geometries)
365
return reader.read_multi(feature);
367
return reader.read(feature);
350
wkb_reader reader(wkb,size,format);
351
if (multiple_geometries)
352
return reader.read_multi(feature);
354
return reader.read(feature);