/// 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);
      }
    }
  }
Exemple #2
0
    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;
    }