/// Parses osm json data from stream calling visitor. void parse(std::istream &istream, Visitor &visitor) const { istream.unsetf(std::ios::skipws); ptree pt; read_json(istream, pt); for (const ptree::value_type &feature : pt) { std::string featureName = feature.first; std::uint32_t featureId = stringTable_.getId(featureName); for (const ptree::value_type &f : pt.get_child(featureName).get_child("features")) { const auto &type = f.second.get_child("geometry.type").data(); if (type=="Point") parsePoint(visitor, featureId, f.second); else if (type=="LineString") parseLineString(visitor, featureId, f.second); else if (type=="Polygon") parsePolygon(visitor, featureId, f.second); else if (type=="MultiLineString") parseMultiLineString(visitor, featureId, f.second); else if (type=="MultiPolygon") parseMultiPolygon(visitor, featureId, f.second); else throw std::invalid_argument(std::string("Unknown geometry type:") + type); } } }
bool GeoParser::parseGeometryCollection(const BSONObj &obj, GeometryCollection *out) { BSONElement coordElt = obj.getFieldDotted(GEOJSON_GEOMETRIES); const vector<BSONElement>& geometries = coordElt.Array(); for (size_t i = 0; i < geometries.size(); ++i) { const BSONObj& geoObj = geometries[i].Obj(); if (isGeoJSONPoint(geoObj)) { PointWithCRS point; if (!parsePoint(geoObj, &point)) { return false; } out->points.push_back(point); } else if (isLine(geoObj)) { out->lines.mutableVector().push_back(new LineWithCRS()); if (!parseLine(geoObj, out->lines.vector().back())) { return false; } } else if (isGeoJSONPolygon(geoObj)) { out->polygons.mutableVector().push_back(new PolygonWithCRS()); if (!parsePolygon(geoObj, out->polygons.vector().back())) { return false; } } else if (isMultiPoint(geoObj)) { out->multiPoints.mutableVector().push_back(new MultiPointWithCRS()); if (!parseMultiPoint(geoObj, out->multiPoints.mutableVector().back())) { return false; } } else if (isMultiPolygon(geoObj)) { out->multiPolygons.mutableVector().push_back(new MultiPolygonWithCRS()); if (!parseMultiPolygon(geoObj, out->multiPolygons.mutableVector().back())) { return false; } } else { verify(isMultiLine(geoObj)); out->multiLines.mutableVector().push_back(new MultiLineWithCRS()); if (!parseMultiLine(geoObj, out->multiLines.mutableVector().back())) { return false; } } } return true; }