几何验证

Aspose.GIS API 使您可以针对许多操作验证几何对象。它为您提供了验证几何对象规则以及地理空间文件格式规范的能力。

检查几何对象的有效性

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
LinearRing linearRing = new LinearRing();
linearRing.AddPoint(0, 0);
linearRing.AddPoint(0, 1);
linearRing.AddPoint(1, 0);
bool valid = linearRing.IsValid; // valid == false
linearRing.AddPoint(0, 0);
valid = linearRing.IsValid; // valid == true

检查几何对象的简单性

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
LineString lineString = new LineString();
bool simple = lineString.IsSimple; // simple == true
lineString.AddPoint(0, 0);
lineString.AddPoint(1, 0);
simple = lineString.IsSimple; // simple == true
lineString.AddPoint(0.5, 0);
simple = lineString.IsSimple; // simple == false (line string crosses itself)

在写入时验证几何对象

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
var exteriorRing = new LinearRing();
exteriorRing.AddPoint(0, 0);
exteriorRing.AddPoint(0, 1);
exteriorRing.AddPoint(1, 1);
exteriorRing.AddPoint(1, 0);
exteriorRing.AddPoint(0, 0);
var interiorRing = new LinearRing();
interiorRing.AddPoint(0.5, 0.5);
interiorRing.AddPoint(1, 0.5);
interiorRing.AddPoint(1, 1);
interiorRing.AddPoint(0.5, 1);
interiorRing.AddPoint(0.5, 0.5);
var invalidPolygon = new Polygon();
invalidPolygon.ExteriorRing = exteriorRing;
invalidPolygon.AddInteriorRing(interiorRing);
// invalidPolygon.IsValid == false, since polygon rings share segments (have infinite number of intersection points)
GeoJsonOptions options = new GeoJsonOptions();
options.ValidateGeometriesOnWrite = false; // false is default
File.Delete(dataDir + "not_validated_data_out.shp");
using (var nonValidatingLayer = Drivers.GeoJson.CreateLayer(dataDir + "not_validated_data_out.shp", options))
{
Feature feature = nonValidatingLayer.ConstructFeature();
feature.Geometry = invalidPolygon;
// no exception is thrown, since ValidateGeometriesOnWrite == false, and GeoJson specification doesn't say that rings of polygon can't share segments.
nonValidatingLayer.Add(feature);
}
options.ValidateGeometriesOnWrite = true;
File.Delete(dataDir + "validated_data_out.shp");
using (var validatingLayer = Drivers.GeoJson.CreateLayer(dataDir + "validated_data_out.shp", options))
{
Feature feature = validatingLayer.ConstructFeature();
feature.Geometry = invalidPolygon;
try
{
validatingLayer.Add(feature); // GisException is thrown, since polygon is not valid
}
catch (GisException e)
{
Console.WriteLine(e.Message);
}
}

在写入时验证几何对象并遵守规范

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
LineString lineStrinWithOnePoint = new LineString();
lineStrinWithOnePoint.AddPoint(0, 0);
GeoJsonOptions options = new GeoJsonOptions();
options.ValidateGeometriesOnWrite = false;
using (var layer = Drivers.GeoJson.CreateLayer(dataDir + "ValidateOnWriteObeyingSpecifications_out.json", options))
{
Feature feature = layer.ConstructFeature();
// GeoJSON specification says that line string must have at least two coordinates.
feature.Geometry = lineStrinWithOnePoint;
try
{
// Geometry of feature doesn't match data format specification, so exception is thrown
// regardless what ValidateGeometriesOnWrite option is.
layer.Add(feature);
}
catch (GisException e)
{
Console.WriteLine(e.Message);
}
}