Beispiel #1
0
 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();
    }
}