+ implement missing support for :
multipoint multipointm multipointz
This commit is contained in:
parent
4732ace54b
commit
239c4045d2
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,
|
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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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())
|
||||||
|
|
Loading…
Add table
Reference in a new issue