@@ -52,15 +52,24 @@ inline Eigen::Map<RowVectors> as_row_vectors(mapbox::geojson::linear_ring &geom)
5252inline Eigen::Map<RowVectors>
5353as_row_vectors (mapbox::geojson::multi_line_string &geom)
5454{
55+ if (geom.empty ()) {
56+ return Eigen::Map<RowVectors>((double *)0 , 0 , 3 );
57+ }
5558 return as_row_vectors (geom[0 ]);
5659}
5760inline Eigen::Map<RowVectors> as_row_vectors (mapbox::geojson::polygon &geom)
5861{
62+ if (geom.empty () || geom.front ().empty ()) {
63+ return Eigen::Map<RowVectors>((double *)0 , 0 , 3 );
64+ }
5965 return as_row_vectors (&geom[0 ][0 ].x , geom[0 ].size ());
6066}
6167inline Eigen::Map<RowVectors>
6268as_row_vectors (mapbox::geojson::multi_polygon &geom)
6369{
70+ if (geom.empty ()) {
71+ return Eigen::Map<RowVectors>((double *)0 , 0 , 3 );
72+ }
6473 auto &shell = geom[0 ];
6574 return as_row_vectors (shell);
6675}
@@ -117,18 +126,27 @@ as_row_vectors(const mapbox::geojson::linear_ring &geom)
117126inline Eigen::Map<const RowVectors>
118127as_row_vectors (const mapbox::geojson::multi_line_string &geom)
119128{
129+ if (geom.empty ()) {
130+ return Eigen::Map<const RowVectors>((const double *)0 , 0 , 3 );
131+ }
120132 auto &ls = geom[0 ];
121133 return Eigen::Map<const RowVectors>(&ls[0 ].x , ls.size (), 3 );
122134}
123135inline Eigen::Map<const RowVectors>
124136as_row_vectors (const mapbox::geojson::polygon &geom)
125137{
138+ if (geom.empty () || geom.front ().empty ()) {
139+ return Eigen::Map<const RowVectors>((const double *)0 , 0 , 3 );
140+ }
126141 auto &shell = geom[0 ];
127142 return Eigen::Map<const RowVectors>(&shell[0 ].x , shell.size (), 3 );
128143}
129144inline Eigen::Map<const RowVectors>
130145as_row_vectors (const mapbox::geojson::multi_polygon &geom)
131146{
147+ if (geom.empty ()) {
148+ return Eigen::Map<const RowVectors>((const double *)0 , 0 , 3 );
149+ }
132150 auto &poly = geom[0 ];
133151 return as_row_vectors (poly);
134152}
@@ -293,6 +311,24 @@ inline void geometry_push_back(mapbox::geojson::geometry &self,
293311 geometry_push_back (self, eigen2geom (point));
294312}
295313
314+ inline void geometry_push_back (mapbox::geojson::geometry &self,
315+ const Eigen::Ref<const MatrixXdRowMajor> &points)
316+ {
317+ self.match (
318+ [&](mapbox::geojson::multi_line_string &g) {
319+ g.push_back ({});
320+ eigen2geom (points, g.back ());
321+ },
322+ [&](mapbox::geojson::polygon &g) {
323+ g.push_back ({});
324+ eigen2geom (points, g.back ());
325+ },
326+ [&](auto &g) {
327+ std::cerr << " geometry_push_back not handled for this type: "
328+ << geometry_type (g) << std::endl;
329+ });
330+ }
331+
296332inline void geometry_push_back (mapbox::geojson::geometry &self,
297333 const mapbox::geojson::geometry &geom)
298334{
0 commit comments