+ implement missing support for :
multipoint multipointm multipointz
This commit is contained in:
parent
8a5e1ea736
commit
8d7ad5b190
2 changed files with 222 additions and 191 deletions
|
@ -30,29 +30,29 @@ shape_featureset<filterT>::shape_featureset(const filterT& filter,
|
|||
const std::set<std::string>& attribute_names,
|
||||
std::string const& encoding,
|
||||
long file_length )
|
||||
: filter_(filter),
|
||||
shape_type_(shape_io::shape_null),
|
||||
shape_(shape_file),
|
||||
query_ext_(),
|
||||
tr_(new transcoder(encoding)),
|
||||
file_length_(file_length),
|
||||
count_(0)
|
||||
: filter_(filter),
|
||||
shape_type_(shape_io::shape_null),
|
||||
shape_(shape_file),
|
||||
query_ext_(),
|
||||
tr_(new transcoder(encoding)),
|
||||
file_length_(file_length),
|
||||
count_(0)
|
||||
{
|
||||
shape_.shp().skip(100);
|
||||
//attributes
|
||||
typename std::set<std::string>::const_iterator pos=attribute_names.begin();
|
||||
while (pos!=attribute_names.end())
|
||||
{
|
||||
for (int i=0;i<shape_.dbf().num_fields();++i)
|
||||
{
|
||||
if (shape_.dbf().descriptor(i).name_ == *pos)
|
||||
{
|
||||
attr_ids_.push_back(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
++pos;
|
||||
}
|
||||
shape_.shp().skip(100);
|
||||
//attributes
|
||||
typename std::set<std::string>::const_iterator pos=attribute_names.begin();
|
||||
while (pos!=attribute_names.end())
|
||||
{
|
||||
for (int i=0;i<shape_.dbf().num_fields();++i)
|
||||
{
|
||||
if (shape_.dbf().descriptor(i).name_ == *pos)
|
||||
{
|
||||
attr_ids_.push_back(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
++pos;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -60,137 +60,153 @@ template <typename filterT>
|
|||
feature_ptr shape_featureset<filterT>::next()
|
||||
{
|
||||
|
||||
using mapnik::point_impl;
|
||||
std::streampos pos=shape_.shp().pos();
|
||||
using mapnik::point_impl;
|
||||
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();
|
||||
geometry2d * point = new point_impl;
|
||||
point->move_to(x,y);
|
||||
feature->add_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
|
||||
geometry2d * point = new point_impl;
|
||||
point->move_to(x,y);
|
||||
feature->add_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
|
||||
geometry2d * point=new point_impl;
|
||||
point->move_to(x,y);
|
||||
feature->add_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();
|
||||
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();
|
||||
geometry2d * point = new point_impl;
|
||||
point->move_to(x,y);
|
||||
feature->add_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
|
||||
geometry2d * point = new point_impl;
|
||||
point->move_to(x,y);
|
||||
feature->add_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
|
||||
geometry2d * point=new point_impl;
|
||||
point->move_to(x,y);
|
||||
feature->add_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:
|
||||
{
|
||||
geometry2d * line = shape_.read_polyline();
|
||||
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;
|
||||
switch (type)
|
||||
{
|
||||
case shape_io::shape_multipoint:
|
||||
case shape_io::shape_multipointm:
|
||||
case shape_io::shape_multipointz:
|
||||
{
|
||||
int num_points = shape_.shp().read_ndr_integer();
|
||||
for (int i=0; i< num_points;++i)
|
||||
{
|
||||
double x=shape_.shp().read_double();
|
||||
double y=shape_.shp().read_double();
|
||||
geometry2d * point = new point_impl;
|
||||
point->move_to(x,y);
|
||||
feature->add_geometry(point);
|
||||
}
|
||||
// ignore m and z for now
|
||||
++count_;
|
||||
break;
|
||||
}
|
||||
case shape_io::shape_polyline:
|
||||
{
|
||||
geometry2d * line = shape_.read_polyline();
|
||||
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:
|
||||
{
|
||||
geometry2d * poly = shape_.read_polygon();
|
||||
feature->add_geometry(poly);
|
||||
++count_;
|
||||
break;
|
||||
geometry2d * poly = shape_.read_polygon();
|
||||
feature->add_geometry(poly);
|
||||
++count_;
|
||||
break;
|
||||
}
|
||||
case shape_io::shape_polygonm:
|
||||
{
|
||||
geometry2d * poly = shape_.read_polygonm();
|
||||
feature->add_geometry(poly);
|
||||
++count_;
|
||||
break;
|
||||
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;
|
||||
geometry2d * poly = shape_.read_polygonz();
|
||||
feature->add_geometry(poly);
|
||||
++count_;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
if (attr_ids_.size())
|
||||
{
|
||||
shape_.dbf().move_to(shape_.id_);
|
||||
std::vector<int>::const_iterator pos=attr_ids_.begin();
|
||||
std::vector<int>::const_iterator end=attr_ids_.end();
|
||||
}
|
||||
}
|
||||
if (attr_ids_.size())
|
||||
{
|
||||
shape_.dbf().move_to(shape_.id_);
|
||||
std::vector<int>::const_iterator pos=attr_ids_.begin();
|
||||
std::vector<int>::const_iterator end=attr_ids_.end();
|
||||
|
||||
while (pos!=end)
|
||||
{
|
||||
try
|
||||
{
|
||||
shape_.dbf().add_attribute(*pos,*tr_,*feature);//TODO optimize!!!
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
std::clog << "error processing attributes " << std::endl;
|
||||
}
|
||||
++pos;
|
||||
}
|
||||
}
|
||||
return feature;
|
||||
}
|
||||
else
|
||||
{
|
||||
while (pos!=end)
|
||||
{
|
||||
try
|
||||
{
|
||||
shape_.dbf().add_attribute(*pos,*tr_,*feature);//TODO optimize!!!
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
std::clog << "error processing attributes " << std::endl;
|
||||
}
|
||||
++pos;
|
||||
}
|
||||
}
|
||||
return feature;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef MAPNIK_DEBUG
|
||||
std::clog<<" total shapes read="<<count_<<"\n";
|
||||
std::clog<<" total shapes read="<<count_<<"\n";
|
||||
#endif
|
||||
return feature_ptr();
|
||||
}
|
||||
return feature_ptr();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -48,8 +48,8 @@ shape_index_featureset<filterT>::shape_index_featureset(const filterT& filter,
|
|||
stream<mapped_file_source> file(shape_file + ".index");
|
||||
if (file)
|
||||
{
|
||||
shp_index<filterT,stream<mapped_file_source> >::query(filter,file,ids_);
|
||||
file.close();
|
||||
shp_index<filterT,stream<mapped_file_source> >::query(filter,file,ids_);
|
||||
file.close();
|
||||
}
|
||||
std::sort(ids_.begin(),ids_.end());
|
||||
|
||||
|
@ -78,18 +78,17 @@ shape_index_featureset<filterT>::shape_index_featureset(const filterT& filter,
|
|||
template <typename filterT>
|
||||
feature_ptr shape_index_featureset<filterT>::next()
|
||||
{
|
||||
using mapnik::feature_factory;
|
||||
using mapnik::point_impl;
|
||||
if (itr_!=ids_.end())
|
||||
using mapnik::feature_factory;
|
||||
using mapnik::point_impl;
|
||||
if (itr_!=ids_.end())
|
||||
{
|
||||
int pos=*itr_++;
|
||||
shape_.move_to(pos);
|
||||
int type=shape_.type();
|
||||
|
||||
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 y=shape_.shp().read_double();
|
||||
geometry2d * point = new point_impl;
|
||||
|
@ -97,11 +96,12 @@ feature_ptr shape_index_featureset<filterT>::next()
|
|||
feature->add_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
|
||||
shape_.shp().skip(8);// skip m
|
||||
geometry2d * point = new point_impl;
|
||||
point->move_to(x,y);
|
||||
feature->add_geometry(point);
|
||||
|
@ -111,8 +111,7 @@ feature_ptr shape_index_featureset<filterT>::next()
|
|||
{
|
||||
double x=shape_.shp().read_double();
|
||||
double y=shape_.shp().read_double();
|
||||
shape_.shp().read_double();// z
|
||||
shape_.shp().read_double();// m
|
||||
shape_.shp().skip(8*2); // skip m,z
|
||||
geometry2d * point = new point_impl;
|
||||
point->move_to(x,y);
|
||||
feature->add_geometry(point);
|
||||
|
@ -121,7 +120,7 @@ feature_ptr shape_index_featureset<filterT>::next()
|
|||
else
|
||||
{
|
||||
while(!filter_.pass(shape_.current_extent()) &&
|
||||
itr_!=ids_.end())
|
||||
itr_!=ids_.end())
|
||||
{
|
||||
pos=*itr_++;
|
||||
shape_.move_to(pos);
|
||||
|
@ -129,49 +128,65 @@ feature_ptr shape_index_featureset<filterT>::next()
|
|||
|
||||
switch (type)
|
||||
{
|
||||
case shape_io::shape_polyline:
|
||||
{
|
||||
geometry2d * line = shape_.read_polyline();
|
||||
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:
|
||||
{
|
||||
|
||||
geometry2d * poly = shape_.read_polygon();
|
||||
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;
|
||||
}
|
||||
case shape_io::shape_multipoint:
|
||||
case shape_io::shape_multipointm:
|
||||
case shape_io::shape_multipointz:
|
||||
{
|
||||
int num_points = shape_.shp().read_ndr_integer();
|
||||
for (int i=0; i< num_points;++i)
|
||||
{
|
||||
double x=shape_.shp().read_double();
|
||||
double y=shape_.shp().read_double();
|
||||
geometry2d * point = new point_impl;
|
||||
point->move_to(x,y);
|
||||
feature->add_geometry(point);
|
||||
}
|
||||
// ignore m and z for now
|
||||
++count_;
|
||||
break;
|
||||
}
|
||||
case shape_io::shape_polyline:
|
||||
{
|
||||
geometry2d * line = shape_.read_polyline();
|
||||
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:
|
||||
{
|
||||
geometry2d * poly = shape_.read_polygon();
|
||||
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())
|
||||
|
|
Loading…
Reference in a new issue