Arbeiten mit dem Esri Gdb-Dateiformat in C#

ESRI File GeoDatabases (FileGDB)

ESRI File GeoDatabases (FileGDB) sind eines der am weitesten verbreiteten nativen Formate unter GIS Software. Aspose.GIS ermöglicht es Ihnen, mit den Dateiformaten FileGDB zu arbeiten und seine Features zu durchlaufen.

Iterieren über Layer in einer FileGDB-Datei

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
//File GDB is a multi layer format. This example shows how to open File GDB as a dataset (collection of layers) and access layers in it.
using (var dataset = Dataset.Open(dataDir + "ThreeLayers.gdb", Drivers.FileGdb))
{
Console.WriteLine("FileGDB has {0} layers", dataset.LayersCount);
for (int i = 0; i < dataset.LayersCount; ++i)
{
Console.WriteLine("Layer {0} name: {1}", i, dataset.GetLayerName(i));
using (var layer = dataset.OpenLayerAt(i))
{
Console.WriteLine("Layer has {0} features", layer.Count);
foreach (var feature in layer)
{
Console.WriteLine(feature.Geometry.AsText());
}
}
Console.WriteLine("");
}
}

Konvertieren von FileGDB nach GeoJSON

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
//This will convert FileGDB dataset with three layers into single layered GeoJSON.
VectorLayer.Convert(dataDir + "ThreeLayers.gdb", Drivers.FileGdb, dataDir + "ThreeLayers_out.json", Drivers.GeoJson);

Lesen von FileGDB als Layer

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
//FileGDB can still be opened as a single layer. In this case, the opened layer will merge all layers inside FileGDB.
using (var layer = VectorLayer.Open(dataDir + "ThreeLayers.gdb", Drivers.FileGdb))
{
Console.WriteLine("All layers in FileGDB has {0} features", layer.Count);
foreach (var feature in layer)
{
Console.WriteLine(feature.Geometry.AsText());
}
}

Öffnen von ShapeFile als Dataset

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
//FileGDB can still be opened as a single layer. In this case, the opened layer will merge all layers inside FileGDB.
using (var layer = VectorLayer.Open(dataDir + "ThreeLayers.gdb", Drivers.FileGdb))
{
Console.WriteLine("All layers in FileGDB has {0} features", layer.Count);
foreach (var feature in layer)
{
Console.WriteLine(feature.Geometry.AsText());
}
}

Hinzufügen eines Layers zum FileGDB Dataset

Öffnen Sie ein vorhandenes FileGDB Dataset und fügen Sie neue Layer hinzu.

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
// -- copy test dataset, to avoid modification of test data.
var path = RunExamples.GetDataDir() + "ThreeLayers.gdb";
var datasetPath = RunExamples.GetDataDir() + "AddLayerToFileGdbDataset_out.gdb";
RunExamples.CopyDirectory(path, datasetPath);
// --
using (var dataset = Dataset.Open(datasetPath, Drivers.FileGdb))
{
Console.WriteLine(dataset.CanCreateLayers); // True
using (var layer = dataset.CreateLayer("data", SpatialReferenceSystem.Wgs84))
{
layer.Attributes.Add(new FeatureAttribute("Name", AttributeDataType.String));
var feature = layer.ConstructFeature();
feature.SetValue("Name", "Name_1");
feature.Geometry = new Point(12.21, 23.123, 20, -200);
layer.Add(feature);
}
using (var layer = dataset.OpenLayer("data"))
{
Console.WriteLine(layer.Count); // 1
Console.WriteLine(layer[0].GetValue<string>("Name")); // "Name_1"
}
}

Entfernen eines Layers aus dem FileGDB Dataset

Öffnen Sie ein vorhandenes FileGDB Dataset und entfernen Sie Layer daraus.

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
// -- copy test dataset, to avoid modification of test data.
//var datasetPath = GetOutputPath(".gdb");
var path = RunExamples.GetDataDir() + "ThreeLayers.gdb";
var datasetPath = RunExamples.GetDataDir() + "RemoveLayersFromFileGdbDataset_out.gdb";
RunExamples.CopyDirectory(path, datasetPath);
// --
using (var dataset = Dataset.Open(datasetPath, Drivers.FileGdb))
{
Console.WriteLine(dataset.CanRemoveLayers); // True
Console.WriteLine(dataset.LayersCount); // 3
// remove layer by index
dataset.RemoveLayerAt(2);
Console.WriteLine(dataset.LayersCount); // 2
// remove layer by name
dataset.RemoveLayer("layer1");
Console.WriteLine(dataset.LayersCount); // 1
}

Erstellen eines FileGDB Datasets

Erstellt ein neues FileGDB Dataset und fügt Layer hinzu.

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
Console.WriteLine(Drivers.FileGdb.CanCreateDatasets); // True
var path = RunExamples.GetDataDir() + "CreateFileGdbDataset_out.gdb";
using (var dataset = Dataset.Create(path, Drivers.FileGdb))
{
Console.WriteLine(dataset.LayersCount); // 0
using (var layer = dataset.CreateLayer("layer_1"))
{
layer.Attributes.Add(new FeatureAttribute("value", AttributeDataType.Integer));
for (int i = 0; i < 10; ++i)
{
var feature = layer.ConstructFeature();
feature.SetValue("value", i);
feature.Geometry = new Point(i, i);
layer.Add(feature);
}
}
using (var layer = dataset.CreateLayer("layer_2"))
{
var feature = layer.ConstructFeature();
feature.Geometry = new LineString(new[]
{
new Point(1, 2),
new Point(3, 4),
});
layer.Add(feature);
}
Console.WriteLine(dataset.LayersCount); // 2
}

Erstellen eines FileGDB Datasets mit einem Layer unter Verwendung der VectorLayer API

Dieses Beispiel erstellt ein FileGDB Dataset mit einem Layer unter Verwendung der VectorLayer API.

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
var path = RunExamples.GetDataDir() + "CreateFileGdbDatasetWithSingleLayer_out.gdb";
var options = new FileGdbOptions();
using (var layer = VectorLayer.Create(path, Drivers.FileGdb, options, SpatialReferenceSystem.Wgs84))
// this 'using' is equivalent to
// using (var dataset = Dataset.Create(path, Drivers.FileGdb))
// using (var layer = Dataset.CreateLayer("layer"))
{
var feature = layer.ConstructFeature();
feature.Geometry = new LineString(new[]
{
new Point(1, 2),
new Point(3, 4),
});
layer.Add(feature);
}
using (var dataset = Dataset.Open(path, Drivers.FileGdb))
using (var layer = dataset.OpenLayer("layer"))
{
Console.WriteLine("Features count: {0}", layer.Count); // 1
}

Konvertieren eines GeoJSON Layers in einen FileGDB Dataset Layer

Erstellen Sie einen neuen Layer in FileGDB und fügen Sie Daten aus dem GeoJSON Layer hinzu.

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
var geoJsonPath = RunExamples.GetDataDir() + "ConvertGeoJsonLayerToLayerInFileGdbDataset_out.json";
using (VectorLayer layer = VectorLayer.Create(geoJsonPath, Drivers.GeoJson))
{
layer.Attributes.Add(new FeatureAttribute("name", AttributeDataType.String));
layer.Attributes.Add(new FeatureAttribute("age", AttributeDataType.Integer));
Feature firstFeature = layer.ConstructFeature();
firstFeature.Geometry = new Point(33.97, -118.25);
firstFeature.SetValue("name", "John");
firstFeature.SetValue("age", 23);
layer.Add(firstFeature);
Feature secondFeature = layer.ConstructFeature();
secondFeature.Geometry = new Point(35.81, -96.28);
secondFeature.SetValue("name", "Mary");
secondFeature.SetValue("age", 54);
layer.Add(secondFeature);
}
// --
// -- copy test dataset, to avoid modification of test data.
var sourceFile = RunExamples.GetDataDir() + "ThreeLayers.gdb";
var destinationFile = RunExamples.GetDataDir() + "ThreeLayersCopy_out.gdb";
RunExamples.CopyDirectory(sourceFile, destinationFile);
// --
using (var geoJsonLayer = VectorLayer.Open(geoJsonPath, Drivers.GeoJson))
{
using (var fileGdbDataset = Dataset.Open(destinationFile, Drivers.FileGdb))
using (var fileGdbLayer = fileGdbDataset.CreateLayer("new_layer", SpatialReferenceSystem.Wgs84))
{
fileGdbLayer.CopyAttributes(geoJsonLayer);
foreach (var feature in geoJsonLayer)
{
fileGdbLayer.Add(feature);
}
}
}

Lesen von OBJECTID aus einem FileGDB Dataset Layer

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
using (var dataset = Dataset.Open(path, Drivers.FileGdb))
using (var layer = dataset.OpenLayer("layer"))
{
foreach (var feature in layer)
{
Console.WriteLine(feature.GetValue<int>("OBJECTID"));
}
}

Spezifizieren eines Präzisionsrasters für einen FileGDB Layer

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
var path = RunExamples.GetDataDir() + "PrecisionGrid_out.gdb";
using (var dataset = Dataset.Create(path, Drivers.FileGdb))
{
var options = new FileGdbOptions
{
// specify coordinate precision grid parameters (origins and scales for coordinates)
CoordinatePrecisionGrid = new FileGdbCoordinatePrecisionGrid
{
// all our coordinates must be more than (-400, -400) point
XOrigin = -400,
YOrigin = -400,
// the write precision is 10 digits after the decimal point
XYScale = 1e10,
// M values are started at 0 and precision is 4 digits after the decimal point
MOrigin = 0,
MScale = 1e4,
},
// throw whenever an attempt to write coordinate that does not fit precision grid is detected
EnsureValidCoordinatesRange = true,
};
using (var layer = dataset.CreateLayer("layer_name", options, SpatialReferenceSystem.Wgs84))
{
var feature = layer.ConstructFeature();
feature.Geometry = new Point(10, 20) { M = 10.1282 };
layer.Add(feature);
feature = layer.ConstructFeature();
// X == -410 is less than XOrigin, so an exception is thrown
feature.Geometry = new Point(-410, 0) { M = 20.2343 };
try
{
layer.Add(feature);
}
catch (GisException e)
{
Console.WriteLine(e.Message); // X value -410 is out of valid range.
}
}
}

Spezifizieren von Toleranzen für einen FileGDB Layer

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
var path = RunExamples.GetDataDir() + "TolerancesForFileGdbLayer_out.gdb";
using (var dataset = Dataset.Create(path, Drivers.FileGdb))
{
var options = new FileGdbOptions
{
XYTolerance = 0.001,
ZTolerance = 0.1,
MTolerance = 0.1,
};
using (var layer = dataset.CreateLayer("layer_name", options))
{
// layer is created with the provided tolerances and some ArcGIS features/tools will use it
}
}

Spezifizieren der Namen der ObjectId- und Geometriefelder

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
var path = RunExamples.GetDataDir() + "NamesOfObjectIdAndGeometryFields_out.gdb";
using (var dataset = Dataset.Create(path, Drivers.FileGdb))
{
var options = new FileGdbOptions
{
// name object ID field 'OID' rather than the default 'OBJECTID'.
ObjectIdFieldName = "OID",
// name geometry field 'POINT' rather than the default 'SHAPE'.
GeometryFieldName = "POINT",
};
using (var layer = dataset.CreateLayer("layer_name", options, SpatialReferenceSystem.Wgs84))
{
var feature = layer.ConstructFeature();
feature.Geometry = new Point(12.32, 34.21);
layer.Add(feature);
}
using (var layer = dataset.OpenLayer("layer_name"))
{
var feature = layer[0];
Console.WriteLine(feature.GetValue<int>("OID")); // 1
}
}