feature_ptr next() { while (pos_ != end_) { if (!bbox_check_) { return *pos_++; } else { if (type_ == datasource::Raster) { raster_ptr const& source = (*pos_)->get_raster(); if (source && bbox_.intersects(source->ext_)) { return *pos_++; } } else { geometry::geometry<double> const& geom = (*pos_)->get_geometry(); if (bbox_.intersects(geometry::envelope(geom))) { return *pos_++; } } ++pos_; } } return feature_ptr(); }
feature_ptr next() { while (pos_ != end_) { if (!bbox_check_) { return *pos_++; } else { if (type_ == datasource::Raster) { raster_ptr const& source = (*pos_)->get_raster(); if (source && bbox_.intersects(source->ext_)) { return *pos_++; } } else { for (std::size_t i=0; i<(*pos_)->num_geometries();++i) { geometry_type & geom = (*pos_)->get_geometry(i); if (bbox_.intersects(geom.envelope())) { return *pos_++; } } } ++pos_; } } return feature_ptr(); }
feature_ptr next() { while (pos_ != end_) { geometry_ptr geom = (*pos_)->get_geometry(); if (geom && bbox_.intersects(geom->envelope())) { return *pos_++; } ++pos_; } return feature_ptr(); }
feature_ptr raster_featureset<LookupPolicy>::next() { if (curIter_!=endIter_) { feature_ptr feature(new Feature(+id_)); try { std::clog<<"raster_featureset "<<curIter_->format()<<" "<<curIter_->file()<<std::endl; std::auto_ptr<ImageReader> reader(get_image_reader(curIter_->format(),curIter_->file())); std::clog<<reader.get()<<std::endl; if (reader.get()) { int image_width=reader->width(); int image_height=reader->height(); if (image_width>0 && image_height>0) { CoordTransform t(image_width,image_height,curIter_->envelope()); Envelope<double> intersect=extent_.intersect(curIter_->envelope()); Envelope<double> ext=t.forward(intersect); Envelope<double> image_ext=t_.forward(intersect); ImageData32 image((int)ext.width(),(int)ext.height()); reader->read((int)ext.minx(),(int)ext.miny(),image); ImageData32 target((int)(image_ext.width()+0.5),(int)(image_ext.height()+0.5)); scale_image<ImageData32>(target,image); feature->set_raster(raster_ptr(new raster(int(image_ext.minx()+0.5),int(image_ext.miny()+0.5),target))); } } } catch (...) { } ++curIter_; return feature; } return feature_ptr(); }
feature_ptr shape_featureset<filterT>::next() { std::streampos pos=shape_.shp().pos(); if (pos < std::streampos(file_length_ * 2)) { shape_.move_to(pos); int type=shape_.type(); feature_ptr feature(new Feature(shape_.id_)); if (type == shape_io::shape_point) { double x=shape_.shp().read_double(); double y=shape_.shp().read_double(); geometry_ptr point(new point_impl(-1)); point->move_to(x,y); feature->set_geometry(point); ++count_; } else if (type == shape_io::shape_pointm) { double x=shape_.shp().read_double(); double y=shape_.shp().read_double(); shape_.shp().read_double();//m geometry_ptr point(new point_impl(-1)); point->move_to(x,y); feature->set_geometry(point); ++count_; } else if (type == shape_io::shape_pointz) { double x=shape_.shp().read_double(); double y=shape_.shp().read_double(); shape_.shp().read_double();//z shape_.shp().read_double();//m geometry_ptr point(new point_impl(-1)); point->move_to(x,y); feature->set_geometry(point); ++count_; } else { while (!filter_.pass(shape_.current_extent())) { unsigned reclen=shape_.reclength_; if (!shape_.shp().is_eof()) { long pos = shape_.shp().pos(); shape_.move_to(pos + 2 * reclen - 36); } else { return feature_ptr(); } } switch (type) { case shape_io::shape_polyline: { geometry_ptr line = shape_.read_polyline(); feature->set_geometry(line); ++count_; break; } case shape_io::shape_polylinem: { geometry_ptr line = shape_.read_polylinem(); feature->set_geometry(line); ++count_; break; } case shape_io::shape_polylinez: { geometry_ptr line = shape_.read_polylinez(); feature->set_geometry(line); ++count_; break; } case shape_io::shape_polygon: { geometry_ptr poly = shape_.read_polygon(); feature->set_geometry(poly); ++count_; break; } case shape_io::shape_polygonm: { geometry_ptr poly = shape_.read_polygonm(); feature->set_geometry(poly); ++count_; break; } case shape_io::shape_polygonz: { geometry_ptr poly = shape_.read_polygonz(); feature->set_geometry(poly); ++count_; break; } } } if (attr_ids_.size()) { shape_.dbf().move_to(shape_.id_); typename std::vector<int>::const_iterator pos=attr_ids_.begin(); while (pos!=attr_ids_.end()) { try { shape_.dbf().add_attribute(*pos,*feature);//TODO optimize!!! } catch (...) { std::clog << "error processing attributes " << std::endl; } ++pos; } } return feature; } else { std::clog<<" total shapes read="<<count_<<"\n"; return feature_ptr(); } }