booleanValid function
booleanValid checks if the geometry is a valid according to the OGC Simple Feature Specification. Take a Feature or a GeometryType example
var line = LineString(coordinates:[Position.of([1, 1]), Position.of([1, 2]),
Position.of([1, 3]), Position.of([1, 4])]);
booleanValid(line); // => true
booleanValid({foo: "bar"}); // => false
Implementation
bool booleanValid(GeoJSONObject feature) {
// Parse GeoJSON
if (feature is FeatureCollection<GeometryObject>) {
for (Feature f in feature.features) {
if (!booleanValid(f)) {
return false;
}
}
} else if (feature is GeometryCollection) {
for (GeometryObject g in feature.geometries) {
if (!booleanValid(g)) {
return false;
}
}
} else {
var geom = getGeom(feature);
if (geom is Point) {
if (!(geom.coordinates.length >= 2 && geom.coordinates.length <= 3)) {
return false;
}
} else if (geom is MultiPoint) {
if (geom.coordinates.length < 2) {
return false;
}
for (Position p in geom.coordinates) {
if (!booleanValid(Point(coordinates: p))) return false;
}
} else if (geom is LineString) {
if (geom.coordinates.length < 2) return false;
for (Position p in geom.coordinates) {
if (!booleanValid(Point(coordinates: p))) return false;
}
} else if (geom is MultiLineString) {
if (geom.coordinates.length < 2) return false;
for (var i = 0; i < geom.coordinates.length; i++) {
if (!booleanValid(LineString(coordinates: geom.coordinates[i]))) {
return false;
}
}
} else if (geom is Polygon) {
var valid = true;
geom.coordEach((Position? cCoord, _, __, ___, ____) {
valid = booleanValid(Point(coordinates: cCoord!));
});
if (!valid) return false;
for (var i = 0; i < geom.coordinates.length; i++) {
if (geom.coordinates[i].length < 4) return false;
if (!_checkRingsClose(geom.coordinates[i])) return false;
if (_checkRingsForSpikesPunctures(geom.coordinates[i])) return false;
if (i > 0) {
if (lineIntersect(
Polygon(coordinates: [geom.coordinates[0]]),
Polygon(coordinates: [geom.coordinates[i]]),
).features.length >
1) {
return false;
}
}
}
} else if (geom is MultiPolygon) {
for (var i = 0; i < geom.coordinates.length; i++) {
var poly = geom.coordinates[i];
for (var ii = 0; ii < poly.length; ii++) {
if (poly[ii].length < 4) {
return false;
}
if (!_checkRingsClose(poly[ii])) {
return false;
}
if (_checkRingsForSpikesPunctures(poly[ii])) {
return false;
}
if (ii == 0) {
if (!_checkPolygonAgainstOthers(
Polygon(coordinates: poly), geom, i)) {
return false;
}
}
if (ii > 0) {
if (lineIntersect(Polygon(coordinates: [poly[0]]),
Polygon(coordinates: [poly[ii]])).features.length >
1) {
return false;
}
}
}
}
} else {
throw Exception('the type ${geom.type} is not supported');
}
}
return true;
}