+ implement missing support for :

multipoint
  multipointm
  multipointz
This commit is contained in:
Artem Pavlenko 2010-01-20 15:25:58 +00:00
parent 4732ace54b
commit 239c4045d2
2 changed files with 222 additions and 191 deletions

View file

@ -30,29 +30,29 @@ shape_featureset<filterT>::shape_featureset(const filterT& filter,
const std::set<std::string>& attribute_names, const std::set<std::string>& attribute_names,
std::string const& encoding, std::string const& encoding,
long file_length ) long file_length )
: filter_(filter), : filter_(filter),
shape_type_(shape_io::shape_null), shape_type_(shape_io::shape_null),
shape_(shape_file), shape_(shape_file),
query_ext_(), query_ext_(),
tr_(new transcoder(encoding)), tr_(new transcoder(encoding)),
file_length_(file_length), file_length_(file_length),
count_(0) count_(0)
{ {
shape_.shp().skip(100); shape_.shp().skip(100);
//attributes //attributes
typename std::set<std::string>::const_iterator pos=attribute_names.begin(); typename std::set<std::string>::const_iterator pos=attribute_names.begin();
while (pos!=attribute_names.end()) while (pos!=attribute_names.end())
{ {
for (int i=0;i<shape_.dbf().num_fields();++i) for (int i=0;i<shape_.dbf().num_fields();++i)
{ {
if (shape_.dbf().descriptor(i).name_ == *pos) if (shape_.dbf().descriptor(i).name_ == *pos)
{ {
attr_ids_.push_back(i); attr_ids_.push_back(i);
break; break;
} }
} }
++pos; ++pos;
} }
} }
@ -60,137 +60,153 @@ template <typename filterT>
feature_ptr shape_featureset<filterT>::next() feature_ptr shape_featureset<filterT>::next()
{ {
using mapnik::point_impl; using mapnik::point_impl;
std::streampos pos=shape_.shp().pos(); std::streampos pos=shape_.shp().pos();
if (pos < std::streampos(file_length_ * 2)) if (pos < std::streampos(file_length_ * 2))
{ {
shape_.move_to(pos); shape_.move_to(pos);
int type=shape_.type(); int type=shape_.type();
feature_ptr feature(new Feature(shape_.id_)); feature_ptr feature(new Feature(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();
double y=shape_.shp().read_double(); double y=shape_.shp().read_double();
geometry2d * point = new point_impl; geometry2d * point = new point_impl;
point->move_to(x,y); point->move_to(x,y);
feature->add_geometry(point); feature->add_geometry(point);
++count_; ++count_;
} }
else if (type == shape_io::shape_pointm) else if (type == shape_io::shape_pointm)
{ {
double x=shape_.shp().read_double(); double x=shape_.shp().read_double();
double y=shape_.shp().read_double(); double y=shape_.shp().read_double();
shape_.shp().read_double();//m shape_.shp().read_double();//m
geometry2d * point = new point_impl; geometry2d * point = new point_impl;
point->move_to(x,y); point->move_to(x,y);
feature->add_geometry(point); feature->add_geometry(point);
++count_; ++count_;
} }
else if (type == shape_io::shape_pointz) else if (type == shape_io::shape_pointz)
{ {
double x=shape_.shp().read_double(); double x=shape_.shp().read_double();
double y=shape_.shp().read_double(); double y=shape_.shp().read_double();
shape_.shp().read_double();//z shape_.shp().read_double();//z
shape_.shp().read_double();//m shape_.shp().read_double();//m
geometry2d * point=new point_impl; geometry2d * point=new point_impl;
point->move_to(x,y); point->move_to(x,y);
feature->add_geometry(point); feature->add_geometry(point);
++count_; ++count_;
} }
else else
{ {
while (!filter_.pass(shape_.current_extent())) while (!filter_.pass(shape_.current_extent()))
{ {
unsigned reclen=shape_.reclength_; unsigned reclen=shape_.reclength_;
if (!shape_.shp().is_eof()) if (!shape_.shp().is_eof())
{ {
long pos = shape_.shp().pos(); long pos = shape_.shp().pos();
shape_.move_to(pos + 2 * reclen - 36); shape_.move_to(pos + 2 * reclen - 36);
} }
else else
{ {
return feature_ptr(); return feature_ptr();
} }
} }
switch (type) switch (type)
{ {
case shape_io::shape_multipoint:
case shape_io::shape_polyline: case shape_io::shape_multipointm:
{ case shape_io::shape_multipointz:
geometry2d * line = shape_.read_polyline(); {
feature->add_geometry(line); int num_points = shape_.shp().read_ndr_integer();
++count_; for (int i=0; i< num_points;++i)
break; {
} double x=shape_.shp().read_double();
case shape_io::shape_polylinem: double y=shape_.shp().read_double();
{ geometry2d * point = new point_impl;
geometry2d * line = shape_.read_polylinem(); point->move_to(x,y);
feature->add_geometry(line); feature->add_geometry(point);
++count_; }
break; // ignore m and z for now
} ++count_;
case shape_io::shape_polylinez: break;
{ }
geometry2d * line = shape_.read_polylinez(); case shape_io::shape_polyline:
feature->add_geometry(line); {
++count_; geometry2d * line = shape_.read_polyline();
break; feature->add_geometry(line);
++count_;
break;
}
case shape_io::shape_polylinem:
{
geometry2d * line = shape_.read_polylinem();
feature->add_geometry(line);
++count_;
break;
}
case shape_io::shape_polylinez:
{
geometry2d * line = shape_.read_polylinez();
feature->add_geometry(line);
++count_;
break;
} }
case shape_io::shape_polygon: case shape_io::shape_polygon:
{ {
geometry2d * poly = shape_.read_polygon(); geometry2d * poly = shape_.read_polygon();
feature->add_geometry(poly); feature->add_geometry(poly);
++count_; ++count_;
break; break;
} }
case shape_io::shape_polygonm: case shape_io::shape_polygonm:
{ {
geometry2d * poly = shape_.read_polygonm(); geometry2d * poly = shape_.read_polygonm();
feature->add_geometry(poly); feature->add_geometry(poly);
++count_; ++count_;
break; break;
} }
case shape_io::shape_polygonz: case shape_io::shape_polygonz:
{ {
geometry2d * poly = shape_.read_polygonz(); geometry2d * poly = shape_.read_polygonz();
feature->add_geometry(poly); feature->add_geometry(poly);
++count_; ++count_;
break; break;
} }
} }
} }
if (attr_ids_.size()) if (attr_ids_.size())
{ {
shape_.dbf().move_to(shape_.id_); shape_.dbf().move_to(shape_.id_);
std::vector<int>::const_iterator pos=attr_ids_.begin(); std::vector<int>::const_iterator pos=attr_ids_.begin();
std::vector<int>::const_iterator end=attr_ids_.end(); std::vector<int>::const_iterator end=attr_ids_.end();
while (pos!=end) while (pos!=end)
{ {
try try
{ {
shape_.dbf().add_attribute(*pos,*tr_,*feature);//TODO optimize!!! shape_.dbf().add_attribute(*pos,*tr_,*feature);//TODO optimize!!!
} }
catch (...) catch (...)
{ {
std::clog << "error processing attributes " << std::endl; std::clog << "error processing attributes " << std::endl;
} }
++pos; ++pos;
} }
} }
return feature; return feature;
} }
else else
{ {
#ifdef MAPNIK_DEBUG #ifdef MAPNIK_DEBUG
std::clog<<" total shapes read="<<count_<<"\n"; std::clog<<" total shapes read="<<count_<<"\n";
#endif #endif
return feature_ptr(); return feature_ptr();
} }
} }

View file

@ -48,8 +48,8 @@ shape_index_featureset<filterT>::shape_index_featureset(const filterT& filter,
stream<mapped_file_source> file(shape_file + ".index"); stream<mapped_file_source> file(shape_file + ".index");
if (file) if (file)
{ {
shp_index<filterT,stream<mapped_file_source> >::query(filter,file,ids_); shp_index<filterT,stream<mapped_file_source> >::query(filter,file,ids_);
file.close(); file.close();
} }
std::sort(ids_.begin(),ids_.end()); std::sort(ids_.begin(),ids_.end());
@ -78,18 +78,17 @@ shape_index_featureset<filterT>::shape_index_featureset(const filterT& filter,
template <typename filterT> template <typename filterT>
feature_ptr shape_index_featureset<filterT>::next() feature_ptr shape_index_featureset<filterT>::next()
{ {
using mapnik::feature_factory; using mapnik::feature_factory;
using mapnik::point_impl; using mapnik::point_impl;
if (itr_!=ids_.end()) if (itr_!=ids_.end())
{ {
int pos=*itr_++; int pos=*itr_++;
shape_.move_to(pos); 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();
double y=shape_.shp().read_double(); double y=shape_.shp().read_double();
geometry2d * point = new point_impl; geometry2d * point = new point_impl;
@ -97,11 +96,12 @@ feature_ptr shape_index_featureset<filterT>::next()
feature->add_geometry(point); feature->add_geometry(point);
++count_; ++count_;
} }
else if (type == shape_io::shape_pointm) else if (type == shape_io::shape_pointm)
{ {
double x=shape_.shp().read_double(); double x=shape_.shp().read_double();
double y=shape_.shp().read_double(); double y=shape_.shp().read_double();
shape_.shp().read_double();// m shape_.shp().skip(8);// skip m
geometry2d * point = new point_impl; geometry2d * point = new point_impl;
point->move_to(x,y); point->move_to(x,y);
feature->add_geometry(point); feature->add_geometry(point);
@ -111,8 +111,7 @@ feature_ptr shape_index_featureset<filterT>::next()
{ {
double x=shape_.shp().read_double(); double x=shape_.shp().read_double();
double y=shape_.shp().read_double(); double y=shape_.shp().read_double();
shape_.shp().read_double();// z shape_.shp().skip(8*2); // skip m,z
shape_.shp().read_double();// m
geometry2d * point = new point_impl; geometry2d * point = new point_impl;
point->move_to(x,y); point->move_to(x,y);
feature->add_geometry(point); feature->add_geometry(point);
@ -121,7 +120,7 @@ feature_ptr shape_index_featureset<filterT>::next()
else else
{ {
while(!filter_.pass(shape_.current_extent()) && while(!filter_.pass(shape_.current_extent()) &&
itr_!=ids_.end()) itr_!=ids_.end())
{ {
pos=*itr_++; pos=*itr_++;
shape_.move_to(pos); shape_.move_to(pos);
@ -129,49 +128,65 @@ feature_ptr shape_index_featureset<filterT>::next()
switch (type) switch (type)
{ {
case shape_io::shape_polyline: case shape_io::shape_multipoint:
{ case shape_io::shape_multipointm:
geometry2d * line = shape_.read_polyline(); case shape_io::shape_multipointz:
feature->add_geometry(line); {
++count_; int num_points = shape_.shp().read_ndr_integer();
break; for (int i=0; i< num_points;++i)
} {
case shape_io::shape_polylinem: double x=shape_.shp().read_double();
{ double y=shape_.shp().read_double();
geometry2d * line = shape_.read_polylinem(); geometry2d * point = new point_impl;
feature->add_geometry(line); point->move_to(x,y);
++count_; feature->add_geometry(point);
break; }
} // ignore m and z for now
case shape_io::shape_polylinez: ++count_;
{ break;
geometry2d * line = shape_.read_polylinez(); }
feature->add_geometry(line); case shape_io::shape_polyline:
++count_; {
break; geometry2d * line = shape_.read_polyline();
} feature->add_geometry(line);
case shape_io::shape_polygon: ++count_;
{ break;
}
geometry2d * poly = shape_.read_polygon(); case shape_io::shape_polylinem:
feature->add_geometry(poly); {
++count_; geometry2d * line = shape_.read_polylinem();
break; feature->add_geometry(line);
} ++count_;
case shape_io::shape_polygonm: break;
{ }
geometry2d * poly = shape_.read_polygonm(); case shape_io::shape_polylinez:
feature->add_geometry(poly); {
++count_; geometry2d * line = shape_.read_polylinez();
break; feature->add_geometry(line);
} ++count_;
case shape_io::shape_polygonz: break;
{ }
geometry2d * poly = shape_.read_polygonz(); case shape_io::shape_polygon:
feature->add_geometry(poly); {
++count_; geometry2d * poly = shape_.read_polygon();
break; feature->add_geometry(poly);
} ++count_;
break;
}
case shape_io::shape_polygonm:
{
geometry2d * poly = shape_.read_polygonm();
feature->add_geometry(poly);
++count_;
break;
}
case shape_io::shape_polygonz:
{
geometry2d * poly = shape_.read_polygonz();
feature->add_geometry(poly);
++count_;
break;
}
} }
} }
if (attr_ids_.size()) if (attr_ids_.size())