bool GeoParser::isGeoJSONPolygon(const BSONObj& obj) { BSONElement type = obj.getFieldDotted(GEOJSON_TYPE); if (type.eoo() || (String != type.type())) { return false; } if (GEOJSON_TYPE_POLYGON != type.String()) { return false; } if (!crsIsOK(obj)) { warning() << "Invalid CRS: " << obj.toString() << endl; return false; } BSONElement coordElt = obj.getFieldDotted(GEOJSON_COORDINATES); if (coordElt.eoo() || (Array != coordElt.type())) { return false; } const vector<BSONElement>& coordinates = coordElt.Array(); // Must be at least one element, the outer shell if (coordinates.empty()) { return false; } // Verify that the shell is a bunch'a coordinates. for (size_t i = 0; i < coordinates.size(); ++i) { if (Array != coordinates[i].type()) { return false; } const vector<BSONElement>& thisLoop = coordinates[i].Array(); // A triangle is the simplest 2d shape, and we repeat a vertex, so, 4. if (thisLoop.size() < 4) { return false; } if (!isArrayOfCoordinates(thisLoop)) { return false; } if (!isLoopClosed(thisLoop)) { return false; } } return true; }
static bool isValidLineString(const vector<BSONElement>& coordinateArray) { if (coordinateArray.size() < 2) { return false; } if (!isArrayOfCoordinates(coordinateArray)) { return false; } vector<S2Point> vertices; if (!parsePoints(coordinateArray, &vertices)) { return false; } eraseDuplicatePoints(&vertices); return S2Polyline::IsValid(vertices); }
static bool isGeoJSONPolygonCoordinates(const vector<BSONElement>& coordinates) { // Must be at least one element, the outer shell if (coordinates.empty()) { return false; } // Verify that the shell is a bunch'a coordinates. for (size_t i = 0; i < coordinates.size(); ++i) { if (Array != coordinates[i].type()) { return false; } const vector<BSONElement>& thisLoop = coordinates[i].Array(); // A triangle is the simplest 2d shape, and we repeat a vertex, so, 4. if (thisLoop.size() < 4) { return false; } if (!isArrayOfCoordinates(thisLoop)) { return false; } if (!isLoopClosed(thisLoop)) { return false; } } return true; }
bool GeoParser::isMultiPoint(const BSONObj &obj) { BSONElement type = obj.getFieldDotted(GEOJSON_TYPE); if (type.eoo() || (String != type.type())) { return false; } if (GEOJSON_TYPE_MULTI_POINT != type.String()) { return false; } if (!crsIsOK(obj)) { warning() << "Invalid CRS: " << obj.toString() << endl; return false; } BSONElement coordElt = obj.getFieldDotted(GEOJSON_COORDINATES); if (coordElt.eoo() || (Array != coordElt.type())) { return false; } const vector<BSONElement>& coordinates = coordElt.Array(); if (0 == coordinates.size()) { return false; } return isArrayOfCoordinates(coordinates); }
bool GeoParser::isGeoJSONLineString(const BSONObj& obj) { BSONElement type = obj.getFieldDotted(GEOJSON_TYPE); if (type.eoo() || (String != type.type())) { return false; } if (GEOJSON_TYPE_LINESTRING != type.String()) { return false; } if (!crsIsOK(obj)) { warning() << "Invalid CRS: " << obj.toString() << endl; return false; } BSONElement coordElt = obj.getFieldDotted(GEOJSON_COORDINATES); if (coordElt.eoo() || (Array != coordElt.type())) { return false; } const vector<BSONElement>& coordinateArray = coordElt.Array(); if (coordinateArray.size() < 2) { return false; } return isArrayOfCoordinates(coordinateArray); }
bool GeoParser::isGeoJSONLineString(const BSONObj& obj) { BSONElement type = obj.getFieldDotted(GEOJSON_TYPE); if (type.eoo() || (String != type.type())) { return false; } if (GEOJSON_TYPE_LINESTRING != type.String()) { return false; } if (!crsIsOK(obj)) { warning() << "Invalid CRS: " << obj.toString() << endl; return false; } BSONElement coordElt = obj.getFieldDotted(GEOJSON_COORDINATES); if (coordElt.eoo() || (Array != coordElt.type())) { return false; } const vector<BSONElement>& coordinateArray = coordElt.Array(); if (coordinateArray.size() < 2) { return false; } if (!isArrayOfCoordinates(coordinateArray)) { return false; } vector<S2Point> vertices; parsePoints(obj.getFieldDotted(GEOJSON_COORDINATES).Array(), &vertices); eraseDuplicatePoints(&vertices); return S2Polyline::IsValid(vertices); }