From 8d7ad5b1908245af3f46d4846777bbbf14cb2182 Mon Sep 17 00:00:00 2001 From: Artem Pavlenko Date: Wed, 13 Jan 2010 17:18:01 +0000 Subject: [PATCH] + implement missing support for : multipoint multipointm multipointz --- plugins/input/shape/shape_featureset.cpp | 288 +++++++++--------- .../input/shape/shape_index_featureset.cpp | 125 ++++---- 2 files changed, 222 insertions(+), 191 deletions(-) diff --git a/plugins/input/shape/shape_featureset.cpp b/plugins/input/shape/shape_featureset.cpp index 1ffad0e58..9e107b3c3 100644 --- a/plugins/input/shape/shape_featureset.cpp +++ b/plugins/input/shape/shape_featureset.cpp @@ -30,29 +30,29 @@ shape_featureset::shape_featureset(const filterT& filter, const std::set& 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::const_iterator pos=attribute_names.begin(); - while (pos!=attribute_names.end()) - { - for (int i=0;i::const_iterator pos=attribute_names.begin(); + while (pos!=attribute_names.end()) + { + for (int i=0;i feature_ptr shape_featureset::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::const_iterator pos=attr_ids_.begin(); - std::vector::const_iterator end=attr_ids_.end(); + } + } + if (attr_ids_.size()) + { + shape_.dbf().move_to(shape_.id_); + std::vector::const_iterator pos=attr_ids_.begin(); + std::vector::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="<::shape_index_featureset(const filterT& filter, stream file(shape_file + ".index"); if (file) { - shp_index >::query(filter,file,ids_); - file.close(); + shp_index >::query(filter,file,ids_); + file.close(); } std::sort(ids_.begin(),ids_.end()); @@ -78,18 +78,17 @@ shape_index_featureset::shape_index_featureset(const filterT& filter, template feature_ptr shape_index_featureset::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::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::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::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::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())