@@ -207,15 +207,19 @@ class make_ewkb_visitor
207207
208208 std::string operator ()(geom::point_t const &geom) const
209209 {
210- // 9 byte header plus one set of coordinates
211- constexpr const std::size_t size = 9 + 2 * 8 ;
212-
213210 std::string data;
214211
215- data.reserve (size);
216- write_point (&data, geom, m_srid);
217-
218- assert (data.size () == size);
212+ if (m_ensure_multi) {
213+ write_header (&data, wkb_multi_point, m_srid);
214+ write_length (&data, 1 );
215+ write_point (&data, geom);
216+ } else {
217+ // 9 byte header plus one set of coordinates
218+ constexpr const std::size_t size = 9 + 2 * 8 ;
219+ data.reserve (size);
220+ write_point (&data, geom, m_srid);
221+ assert (data.size () == size);
222+ }
219223
220224 return data;
221225 }
@@ -317,7 +321,7 @@ class ewkb_parser_t
317321 parse_polygon (&geom.set <geom::polygon_t >());
318322 break ;
319323 case geometry_type::wkb_multi_point:
320- // XXX not implemented yet
324+ parse_multi_point (&geom);
321325 break ;
322326 case geometry_type::wkb_multi_line:
323327 parse_multi_linestring (&geom);
@@ -448,6 +452,28 @@ class ewkb_parser_t
448452 }
449453 }
450454
455+ void parse_multi_point (geom::geometry_t *geom)
456+ {
457+ auto &multipoint = geom->set <geom::multipoint_t >();
458+ auto const num_geoms = parse_length ();
459+ if (num_geoms == 0 ) {
460+ throw std::runtime_error{
461+ " Invalid WKB geometry: Multipoint without points" };
462+ }
463+
464+ multipoint.reserve (num_geoms);
465+ for (uint32_t i = 0 ; i < num_geoms; ++i) {
466+ auto &point = multipoint.emplace_back ();
467+ uint32_t const type = parse_header ();
468+ if (type != geometry_type::wkb_point) {
469+ throw std::runtime_error{
470+ " Invalid WKB geometry: Multipoint containing"
471+ " something other than point: {}" _format (type)};
472+ }
473+ parse_point (&point);
474+ }
475+ }
476+
451477 void parse_multi_linestring (geom::geometry_t *geom)
452478 {
453479 auto &multilinestring = geom->set <geom::multilinestring_t >();
0 commit comments