+ skip null shapes

This commit is contained in:
Artem Pavlenko 2011-08-12 16:43:28 +00:00
parent 7a00511a56
commit 4b09f3d750

View file

@ -88,12 +88,22 @@ template <typename filterT>
feature_ptr shape_featureset<filterT>::next() feature_ptr shape_featureset<filterT>::next()
{ {
std::streampos pos=shape_.shp().pos(); std::streampos pos=shape_.shp().pos();
// skip null shapes
while (pos > 0 && pos < std::streampos(file_length_ * 2))
{
shape_.move_to(pos);
if (shape_.type() == shape_io::shape_null)
{
pos += std::streampos(12);
}
else break;
}
if (pos < std::streampos(file_length_ * 2)) if (pos < std::streampos(file_length_ * 2))
{ {
shape_.move_to(pos);
int type=shape_.type(); int type=shape_.type();
feature_ptr feature(feature_factory::create(shape_.id_)); feature_ptr feature(feature_factory::create(shape_.id_));
if (type == shape_io::shape_point) if (type == shape_io::shape_point)
{ {
double x=shape_.shp().read_double(); double x=shape_.shp().read_double();
@ -132,23 +142,26 @@ feature_ptr shape_featureset<filterT>::next()
} }
else else
{ {
while (!filter_.pass(shape_.current_extent())) // skip shapes
for (;;)
{ {
std::streampos pos = shape_.shp().pos(); std::streampos pos = shape_.shp().pos();
if (shape_.type() == shape_io::shape_null)
{
pos += std::streampos(12);
std::cerr << "NULL SHAPE len=" << shape_.reclength_ << std::endl;
}
else if (filter_.pass(shape_.current_extent())) break;
else pos += std::streampos(2 * shape_.reclength_ - 36);
if (pos > 0 && pos < std::streampos(file_length_ * 2)) if (pos > 0 && pos < std::streampos(file_length_ * 2))
{ {
if (shape_.type() != shape_io::shape_null)
{
pos += std::streampos(2 * shape_.reclength_ - 36);
}
else
{
pos += std::streampos(8 * 3);
}
shape_.move_to(pos); shape_.move_to(pos);
} }
else else
{ {
#ifdef MAPNIK_DEBUG
std::clog << "Shape Plugin: total shapes read=" << count_ << std::endl;
#endif
return feature_ptr(); return feature_ptr();
} }
} }