return ref_ptr<Feature> from datasource next() method
should play better with python
This commit is contained in:
parent
03467ac96e
commit
820b6bb23a
9 changed files with 98 additions and 89 deletions
|
@ -25,10 +25,10 @@
|
|||
#include <sstream>
|
||||
#include "connection_manager.hpp"
|
||||
|
||||
DATASOURCE_PLUGIN(PostgisDatasource);
|
||||
DATASOURCE_PLUGIN(postgis_datasource);
|
||||
|
||||
const std::string PostgisDatasource::GEOMETRY_COLUMNS="geometry_columns";
|
||||
const std::string PostgisDatasource::SPATIAL_REF_SYS="spatial_ref_system";
|
||||
const std::string postgis_datasource::GEOMETRY_COLUMNS="geometry_columns";
|
||||
const std::string postgis_datasource::SPATIAL_REF_SYS="spatial_ref_system";
|
||||
|
||||
using std::cerr;
|
||||
using std::cout;
|
||||
|
@ -37,7 +37,7 @@ using std::endl;
|
|||
using boost::lexical_cast;
|
||||
using boost::bad_lexical_cast;
|
||||
|
||||
PostgisDatasource::PostgisDatasource(const Parameters& params)
|
||||
postgis_datasource::postgis_datasource(const Parameters& params)
|
||||
: table_(params.get("table")),
|
||||
type_(datasource::Vector),
|
||||
desc_(params.get("name")),
|
||||
|
@ -142,24 +142,24 @@ PostgisDatasource::PostgisDatasource(const Parameters& params)
|
|||
}
|
||||
}
|
||||
|
||||
std::string PostgisDatasource::name_="postgis";
|
||||
std::string postgis_datasource::name_="postgis";
|
||||
|
||||
std::string PostgisDatasource::name()
|
||||
std::string postgis_datasource::name()
|
||||
{
|
||||
return name_;
|
||||
}
|
||||
|
||||
int PostgisDatasource::type() const
|
||||
int postgis_datasource::type() const
|
||||
{
|
||||
return type_;
|
||||
}
|
||||
|
||||
layer_descriptor const& PostgisDatasource::get_descriptor() const
|
||||
layer_descriptor const& postgis_datasource::get_descriptor() const
|
||||
{
|
||||
return desc_;
|
||||
}
|
||||
|
||||
std::string PostgisDatasource::table_from_sql(const std::string& sql)
|
||||
std::string postgis_datasource::table_from_sql(const std::string& sql)
|
||||
{
|
||||
std::string table_name(sql);
|
||||
transform(table_name.begin(),table_name.end(),table_name.begin(),tolower);
|
||||
|
@ -174,7 +174,7 @@ std::string PostgisDatasource::table_from_sql(const std::string& sql)
|
|||
return table_name;
|
||||
}
|
||||
|
||||
featureset_ptr PostgisDatasource::features(const query& q) const
|
||||
featureset_ptr postgis_datasource::features(const query& q) const
|
||||
{
|
||||
Featureset *fs=0;
|
||||
Envelope<double> const& box=q.get_bbox();
|
||||
|
@ -202,15 +202,15 @@ featureset_ptr PostgisDatasource::features(const query& q) const
|
|||
s << box.maxx() << " " << box.maxy() << ")'::box3d,"<<srid_<<")";
|
||||
cout << s.str() << endl;
|
||||
ref_ptr<ResultSet> rs=conn->executeQuery(s.str(),1);
|
||||
fs=new PostgisFeatureset(rs,props.size());
|
||||
fs=new postgis_featureset(rs,props.size());
|
||||
}
|
||||
}
|
||||
return featureset_ptr(fs);
|
||||
}
|
||||
|
||||
const Envelope<double>& PostgisDatasource::envelope() const
|
||||
const Envelope<double>& postgis_datasource::envelope() const
|
||||
{
|
||||
return extent_;
|
||||
}
|
||||
|
||||
PostgisDatasource::~PostgisDatasource() {}
|
||||
postgis_datasource::~postgis_datasource() {}
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
|
||||
using namespace mapnik;
|
||||
|
||||
class PostgisDatasource : public datasource
|
||||
class postgis_datasource : public datasource
|
||||
{
|
||||
static const std::string GEOMETRY_COLUMNS;
|
||||
static const std::string SPATIAL_REF_SYS;
|
||||
|
@ -54,15 +54,15 @@ public:
|
|||
featureset_ptr features(const query& q) const;
|
||||
mapnik::Envelope<double> const& envelope() const;
|
||||
layer_descriptor const& get_descriptor() const;
|
||||
PostgisDatasource(const Parameters ¶ms);
|
||||
~PostgisDatasource();
|
||||
postgis_datasource(const Parameters ¶ms);
|
||||
~postgis_datasource();
|
||||
private:
|
||||
static std::string table_from_sql(const std::string& sql);
|
||||
PostgisDatasource(const PostgisDatasource&);
|
||||
PostgisDatasource& operator=(const PostgisDatasource&);
|
||||
postgis_datasource(const postgis_datasource&);
|
||||
postgis_datasource& operator=(const postgis_datasource&);
|
||||
};
|
||||
|
||||
class PostgisFeatureset : public Featureset
|
||||
class postgis_featureset : public Featureset
|
||||
{
|
||||
private:
|
||||
ref_ptr<ResultSet> rs_;
|
||||
|
@ -70,13 +70,13 @@ private:
|
|||
mutable int totalGeomSize_;
|
||||
mutable int count_;
|
||||
public:
|
||||
PostgisFeatureset(const ref_ptr<ResultSet>& rs,unsigned num_attrs);
|
||||
postgis_featureset(const ref_ptr<ResultSet>& rs,unsigned num_attrs);
|
||||
void dispose();
|
||||
Feature* next();
|
||||
~PostgisFeatureset();
|
||||
feature_ptr next();
|
||||
~postgis_featureset();
|
||||
private:
|
||||
PostgisFeatureset(const PostgisFeatureset&);
|
||||
const PostgisFeatureset& operator=(const PostgisFeatureset&);
|
||||
postgis_featureset(const postgis_featureset&);
|
||||
const postgis_featureset& operator=(const postgis_featureset&);
|
||||
};
|
||||
|
||||
#endif //POSTGIS_HPP
|
||||
|
|
|
@ -27,21 +27,20 @@ using boost::lexical_cast;
|
|||
using boost::bad_lexical_cast;
|
||||
using std::string;
|
||||
|
||||
PostgisFeatureset::PostgisFeatureset(const ref_ptr<ResultSet>& rs,
|
||||
postgis_featureset::postgis_featureset(const ref_ptr<ResultSet>& rs,
|
||||
unsigned num_attrs=0)
|
||||
: rs_(rs),
|
||||
num_attrs_(num_attrs),
|
||||
totalGeomSize_(0),
|
||||
count_(0) {}
|
||||
|
||||
Feature* PostgisFeatureset::next()
|
||||
feature_ptr postgis_featureset::next()
|
||||
{
|
||||
Feature *feature=0;
|
||||
if (rs_->next())
|
||||
{
|
||||
const char* buf = rs_->getValue(0);
|
||||
int id = int4net(buf);
|
||||
|
||||
feature_ptr feature(new Feature(id));
|
||||
int size=rs_->getFieldLength(1);
|
||||
const char *data=rs_->getValue(1);
|
||||
geometry_ptr geom=geometry_utils::from_wkb(data,size,-1);
|
||||
|
@ -49,7 +48,7 @@ Feature* PostgisFeatureset::next()
|
|||
|
||||
if (geom)
|
||||
{
|
||||
feature=new Feature(id,geom);
|
||||
feature->set_geometry(geom);
|
||||
feature->reserve_props(num_attrs_);
|
||||
unsigned start=2;
|
||||
for (unsigned pos=0;pos<num_attrs_;++pos)
|
||||
|
@ -91,18 +90,19 @@ Feature* PostgisFeatureset::next()
|
|||
}
|
||||
++count_;
|
||||
}
|
||||
return feature;
|
||||
}
|
||||
else
|
||||
{
|
||||
rs_->close();
|
||||
std::cout << "totalGeomSize="<<totalGeomSize_<<" bytes"<<std::endl;
|
||||
std::cout << "count="<<count_<<std::endl;
|
||||
return feature_ptr(0);
|
||||
}
|
||||
return feature;
|
||||
}
|
||||
|
||||
|
||||
PostgisFeatureset::~PostgisFeatureset()
|
||||
postgis_featureset::~postgis_featureset()
|
||||
{
|
||||
rs_->close();
|
||||
}
|
||||
|
|
|
@ -50,23 +50,22 @@ shape_featureset<filterT>::shape_featureset(const filterT& filter,
|
|||
|
||||
|
||||
template <typename filterT>
|
||||
Feature* shape_featureset<filterT>::next()
|
||||
feature_ptr shape_featureset<filterT>::next()
|
||||
{
|
||||
Feature* feature=0;
|
||||
std::streampos pos=shape_.shp().pos();
|
||||
|
||||
if (pos < std::streampos(file_length_ * 2))
|
||||
{
|
||||
shape_.move_to(pos);
|
||||
int type=shape_.type();
|
||||
int id=shape_.id_;
|
||||
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=new Feature(id,point);
|
||||
feature->set_geometry(point);
|
||||
++count_;
|
||||
}
|
||||
else if (type == shape_io::shape_pointm)
|
||||
|
@ -76,7 +75,7 @@ Feature* shape_featureset<filterT>::next()
|
|||
shape_.shp().read_double();//m
|
||||
geometry_ptr point(new point_impl(-1));
|
||||
point->move_to(x,y);
|
||||
feature=new Feature(id,point);
|
||||
feature->set_geometry(point);
|
||||
++count_;
|
||||
}
|
||||
else if (type == shape_io::shape_pointz)
|
||||
|
@ -87,7 +86,7 @@ Feature* shape_featureset<filterT>::next()
|
|||
shape_.shp().read_double();//m
|
||||
geometry_ptr point(new point_impl(-1));
|
||||
point->move_to(x,y);
|
||||
feature=new Feature(id,point);
|
||||
feature->set_geometry(point);
|
||||
++count_;
|
||||
}
|
||||
else
|
||||
|
@ -97,7 +96,7 @@ Feature* shape_featureset<filterT>::next()
|
|||
unsigned reclen=shape_.reclength_;
|
||||
shape_.move_to(long(shape_.shp().pos()) + 2 * reclen - 36);
|
||||
if ((long)shape_.shp().pos() >= file_length_ * 2)
|
||||
return 0;
|
||||
return feature_ptr(0);
|
||||
}
|
||||
|
||||
switch (type)
|
||||
|
@ -106,47 +105,47 @@ Feature* shape_featureset<filterT>::next()
|
|||
case shape_io::shape_polyline:
|
||||
{
|
||||
geometry_ptr line = shape_.read_polyline();
|
||||
feature=new Feature(shape_.id_,line);
|
||||
feature->set_geometry(line);
|
||||
++count_;
|
||||
break;
|
||||
}
|
||||
case shape_io::shape_polylinem:
|
||||
{
|
||||
geometry_ptr line = shape_.read_polylinem();
|
||||
feature=new Feature(shape_.id_,line);
|
||||
feature->set_geometry(line);
|
||||
++count_;
|
||||
break;
|
||||
}
|
||||
case shape_io::shape_polylinez:
|
||||
{
|
||||
geometry_ptr line = shape_.read_polylinez();
|
||||
feature=new Feature(shape_.id_,line);
|
||||
feature->set_geometry(line);
|
||||
++count_;
|
||||
break;
|
||||
}
|
||||
case shape_io::shape_polygon:
|
||||
{
|
||||
geometry_ptr poly = shape_.read_polygon();
|
||||
feature=new Feature(shape_.id_,poly);
|
||||
feature->set_geometry(poly);
|
||||
++count_;
|
||||
break;
|
||||
}
|
||||
case shape_io::shape_polygonm:
|
||||
{
|
||||
geometry_ptr poly = shape_.read_polygonm();
|
||||
feature=new Feature(shape_.id_,poly);
|
||||
feature->set_geometry(poly);
|
||||
++count_;
|
||||
break;
|
||||
}
|
||||
case shape_io::shape_polygonz:
|
||||
{
|
||||
geometry_ptr poly = shape_.read_polygon();
|
||||
feature=new Feature(shape_.id_,poly);
|
||||
geometry_ptr poly = shape_.read_polygonz();
|
||||
feature->set_geometry(poly);
|
||||
++count_;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return 0;
|
||||
return feature_ptr(0);
|
||||
}
|
||||
|
||||
if (attr_ids_.size())
|
||||
|
@ -157,7 +156,7 @@ Feature* shape_featureset<filterT>::next()
|
|||
{
|
||||
try
|
||||
{
|
||||
shape_.dbf().add_attribute(*pos,feature);//TODO optimize!!!
|
||||
shape_.dbf().add_attribute(*pos,feature.get());//TODO optimize!!!
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
|
@ -167,10 +166,13 @@ Feature* shape_featureset<filterT>::next()
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!feature)
|
||||
std::cout<<" total shapes read="<<count_<<"\n";
|
||||
return feature;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout<<" total shapes read="<<count_<<"\n";
|
||||
return feature_ptr(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ public:
|
|||
shape_featureset(const filterT& filter, const std::string& shape_file,
|
||||
const std::set<std::string>& attribute_names,long file_length);
|
||||
virtual ~shape_featureset();
|
||||
Feature* next();
|
||||
feature_ptr next();
|
||||
private:
|
||||
shape_featureset(const shape_featureset&);
|
||||
const shape_featureset& operator=(const shape_featureset&);
|
||||
|
|
|
@ -58,21 +58,23 @@ shape_index_featureset<filterT>::shape_index_featureset(const filterT& filter,
|
|||
}
|
||||
|
||||
template <typename filterT>
|
||||
Feature* shape_index_featureset<filterT>::next()
|
||||
feature_ptr shape_index_featureset<filterT>::next()
|
||||
{
|
||||
Feature *f=0;
|
||||
|
||||
if (itr_!=ids_.end())
|
||||
{
|
||||
int pos=*itr_++;
|
||||
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);
|
||||
f=new Feature(shape_.id_,point);
|
||||
feature->set_geometry(point);
|
||||
++count_;
|
||||
}
|
||||
else if (type == shape_io::shape_pointm)
|
||||
|
@ -82,7 +84,7 @@ Feature* shape_index_featureset<filterT>::next()
|
|||
shape_.shp().read_double();// m
|
||||
geometry_ptr point(new point_impl(-1));
|
||||
point->move_to(x,y);
|
||||
f=new Feature(shape_.id_,point);
|
||||
feature->set_geometry(point);
|
||||
++count_;
|
||||
}
|
||||
else if (type == shape_io::shape_pointz)
|
||||
|
@ -93,7 +95,7 @@ Feature* shape_index_featureset<filterT>::next()
|
|||
shape_.shp().read_double();// m
|
||||
geometry_ptr point(new point_impl(-1));
|
||||
point->move_to(x,y);
|
||||
f=new Feature(shape_.id_,point);
|
||||
feature->set_geometry(point);
|
||||
++count_;
|
||||
}
|
||||
else
|
||||
|
@ -110,21 +112,21 @@ Feature* shape_index_featureset<filterT>::next()
|
|||
case shape_io::shape_polyline:
|
||||
{
|
||||
geometry_ptr line = shape_.read_polyline();
|
||||
f=new Feature(shape_.id_,line);
|
||||
feature->set_geometry(line);
|
||||
++count_;
|
||||
break;
|
||||
}
|
||||
case shape_io::shape_polylinem:
|
||||
{
|
||||
geometry_ptr line = shape_.read_polylinem();
|
||||
f=new Feature(shape_.id_,line);
|
||||
feature->set_geometry(line);
|
||||
++count_;
|
||||
break;
|
||||
}
|
||||
case shape_io::shape_polylinez:
|
||||
{
|
||||
geometry_ptr line = shape_.read_polylinez();
|
||||
f=new Feature(shape_.id_,line);
|
||||
feature->set_geometry(line);
|
||||
++count_;
|
||||
break;
|
||||
}
|
||||
|
@ -132,35 +134,35 @@ Feature* shape_index_featureset<filterT>::next()
|
|||
{
|
||||
|
||||
geometry_ptr poly = shape_.read_polygon();
|
||||
f=new Feature(shape_.id_,poly);
|
||||
feature->set_geometry(poly);
|
||||
++count_;
|
||||
break;
|
||||
}
|
||||
case shape_io::shape_polygonm:
|
||||
{
|
||||
geometry_ptr poly = shape_.read_polygonm();
|
||||
f=new Feature(shape_.id_,poly);
|
||||
feature->set_geometry(poly);
|
||||
++count_;
|
||||
break;
|
||||
}
|
||||
case shape_io::shape_polygonz:
|
||||
{
|
||||
geometry_ptr poly = shape_.read_polygonz();
|
||||
f=new Feature(shape_.id_,poly);
|
||||
feature->set_geometry(poly);
|
||||
++count_;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (attr_ids_.size())
|
||||
{
|
||||
f->reserve_props(attr_ids_.size());
|
||||
feature->reserve_props(attr_ids_.size());
|
||||
shape_.dbf().move_to(shape_.id_);
|
||||
std::vector<int>::const_iterator pos=attr_ids_.begin();
|
||||
while (pos!=attr_ids_.end())
|
||||
{
|
||||
try
|
||||
{
|
||||
shape_.dbf().add_attribute(*pos,f);
|
||||
shape_.dbf().add_attribute(*pos,feature.get());
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
|
@ -170,9 +172,13 @@ Feature* shape_index_featureset<filterT>::next()
|
|||
}
|
||||
}
|
||||
}
|
||||
return feature;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout<<count_<<" features\n";
|
||||
return feature_ptr(0);
|
||||
}
|
||||
if (!f) std::cout<<count_<<" features\n";
|
||||
return f;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ public:
|
|||
shape_index_featureset(const filterT& filter,const std::string& shape_file,
|
||||
const std::set<std::string>& attribute_names);
|
||||
virtual ~shape_index_featureset();
|
||||
Feature* next();
|
||||
feature_ptr next();
|
||||
private:
|
||||
//no copying
|
||||
shape_index_featureset(const shape_index_featureset&);
|
||||
|
|
|
@ -35,7 +35,7 @@ namespace mapnik
|
|||
typedef ref_ptr<Feature> feature_ptr;
|
||||
struct Featureset
|
||||
{
|
||||
virtual Feature* next()=0;
|
||||
virtual feature_ptr next()=0;
|
||||
virtual ~Featureset() {};
|
||||
};
|
||||
|
||||
|
|
|
@ -68,7 +68,7 @@ namespace mapnik
|
|||
std::vector<rule_type*> else_rules;
|
||||
|
||||
bool active_rules=false;
|
||||
const std::vector<rule_type>& rules=style.rules();
|
||||
const std::vector<rule_type>& rules=style.get_rules();
|
||||
std::vector<rule_type>::const_iterator ruleIter=rules.begin();
|
||||
|
||||
while (ruleIter!=rules.end())
|
||||
|
@ -104,7 +104,7 @@ namespace mapnik
|
|||
featureset_ptr fs=ds->features(q);
|
||||
if (fs)
|
||||
{
|
||||
Feature* feature=0;
|
||||
feature_ptr feature;
|
||||
while ((feature = fs->next()))
|
||||
{
|
||||
bool do_else=true;
|
||||
|
@ -148,30 +148,31 @@ namespace mapnik
|
|||
}
|
||||
}
|
||||
}
|
||||
delete feature;
|
||||
//delete feature;
|
||||
}
|
||||
}
|
||||
if (l.isSelectable() && l.selection().size()) //TODO !!!
|
||||
{
|
||||
|
||||
//if (l.isSelectable() && l.selection().size()) //TODO !!!
|
||||
//{
|
||||
//volatile style_cache* styles=style_cache::instance();
|
||||
const Style& style=style_cache::instance()->find(l.selection_style());
|
||||
// const Style& style=style_cache::instance()->find(l.selection_style());
|
||||
|
||||
std::vector<ref_ptr<Feature> >& selection=l.selection();
|
||||
// std::vector<ref_ptr<Feature> >& selection=l.selection();
|
||||
|
||||
Style::Iterator pos = style.begin();
|
||||
if (pos!=style.end()) {
|
||||
std::vector<ref_ptr<Feature> >::iterator itr=selection.begin();
|
||||
|
||||
while (itr!=selection.end())
|
||||
{
|
||||
geometry_ptr& geom=(*itr)->get_geometry();
|
||||
geom->transform(t);
|
||||
(*pos)->render(*geom,image);
|
||||
++itr;
|
||||
}
|
||||
}
|
||||
l.clear_selection();
|
||||
}
|
||||
// Style::Iterator pos = style.begin();
|
||||
// if (pos!=style.end()) {
|
||||
// std::vector<ref_ptr<Feature> >::iterator itr=selection.begin();
|
||||
//
|
||||
// while (itr!=selection.end())
|
||||
// {
|
||||
// geometry_ptr& geom=(*itr)->get_geometry();
|
||||
// geom->transform(t);
|
||||
// (*pos)->render(*geom,image);
|
||||
// ++itr;
|
||||
// }
|
||||
// }
|
||||
// l.clear_selection();
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue