C# Dilinde GIS Vektör Katmanlarını Filtreleme ve Dizinleme

Aspose.GIS for .NET ile katmanları öznitelik değerlerine veya mekansal sınırlara göre filtreleyebilirsiniz. Ayrıca, filtrelemeyi ve mekansal sorguları hızlandırmak için dizinleri kullanabilirsiniz.

Öznitelik indeksi

İndeks Olmadan Filtreleme

Bir katmanı bir özniteliğin değerlerine göre nasıl filtreleyeceğiniz aşağıda açıklanmıştır:

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
using (var layer = VectorLayer.Open(citiesPath, Drivers.GeoJson))
{
// Select features based on values of the attribute. This code enumerates all features in the layer
// and selects all features that match a condition.
var features = layer.WhereGreaterOrEqual("population", 2000).WhereSmaller("population", 5000);
// Print results.
Console.WriteLine("Cities where population >= 2000 and population < 5000:");
foreach (var feature in features)
{
var name = feature.GetValue<string>("name");
var population = feature.GetValue<int>("population");
Console.WriteLine(name + ", " + population);
}
Console.WriteLine();
}

İndeksle Filtreleme

Yukarıdaki kod, katman yalnızca bir kez filtrelendiği sürece iyidir. Ancak, katmanın birden çok kez sorgulanması olasıysa, öznitelik indekslerinden faydalanabiliriz. Öznitelik indeksi oluşturmak biraz zaman alır, ancak filtrelemeyi hızlandırmak için birçok kez yeniden kullanılabilir.

Aşağıdaki örnek, bir öznitelik indeksi dosyası kullanarak katman filtrelemesini özniteliğin değerlerine göre hızlandırır:

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
using (var layer = VectorLayer.Open(citiesPath, Drivers.GeoJson))
{
// Use attribute index to speed up search by 'population' attribute.
// Aspose.GIS builds a new index if it doesn't exist, otherwise existing index is reused.
// Any path can be used.
var attributeIndexPath = Path.ChangeExtension(citiesPath, "population_out.ix");
layer.UseAttributesIndex(attributeIndexPath, "population");
// Select features based on values of the attribute. Since we use attribute index it is not necessary to
// test all features of the layer and filtering time is reduced significantly.
var towns = layer.WhereGreaterOrEqual("population", 2000).WhereSmaller("population", 5000);
// Print results.
Console.WriteLine("Cities where population >= 2000 and population < 5000:");
foreach (var town in towns)
{
var name = town.GetValue<string>("name");
var population = town.GetValue<int>("population");
Console.WriteLine(name + ", " + population);
}
Console.WriteLine();
}

Filtrelenmiş Öznitelikleri Kaydetme

Filtrelenmiş öznitelikler katmanlara kaydedilebilir:

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
using (var layer = VectorLayer.Open(citiesPath, Drivers.GeoJson))
{
// Use attribute index to speed up search by 'population' attribute.
var attributeIndexPath = Path.ChangeExtension(citiesPath, "population_out.ix");
layer.UseAttributesIndex(attributeIndexPath, "population");
// Save all features with population between 2000 and 5000 to the output file.
layer.WhereGreaterOrEqual("population", 2000)
.WhereSmaller("population", 5000)
.SaveTo(DataDir + "towns_out.shp", Drivers.Shapefile);
}

Filtrelenmiş Öznitelikleri Görüntüleme

Filtrelenmiş öznitelikleri görüntülemek de mümkündür. Aşağıdaki örnekler, öznitelik indeksini kullanarak 2000’den büyük nüfusa sahip tüm öznitelikleri hızlı bir şekilde seçer ve bunları haritaya ekler:

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
using (var map = new Map(600, 400))
using (var cities = VectorLayer.Open(citiesPath, Drivers.GeoJson))
{
map.Padding = 20;
// Use attribute index to speed up search by 'population' attribute.
var attributeIndexPath = Path.ChangeExtension(citiesPath, "population_out.ix");
cities.UseAttributesIndex(attributeIndexPath, "population");
// Render all cities with population greater than 2000.
map.Add(cities.WhereGreater("population", 2000), new SimpleMarker { FillColor = Color.Red });
map.Render(outputPath, Renderers.Svg);
}

Mekansal İndeks

Mekansal indeksler, mekansal sorguları hızlandırmak için kullanılır. Öznitelik indeksleri gibi, mekansal indeksler de oluşturulduktan sonra yeniden kullanılır.

Noktaya En Yakın Öznitelikleri Bulma

Mekansal indeksi kullanarak belirli bir noktaya en yakın özniteliği arama işlemini hızlandırmanın yolu aşağıda açıklanmıştır:

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
using (var layer = VectorLayer.Open(path, Drivers.GeoJson))
{
// Use spatial index to speed up spatial queries.
// Aspose.GIS builds a new index if it doesn't exist, otherwise existing index is reused.
// Any path can be used.
var spatialIndexPath = Path.ChangeExtension(path, ".spatial_out.ix");
layer.UseSpatialIndex(spatialIndexPath);
var point = new Point(12.30, 50.33);
// Since we use spatial index, nearest-to finds the closest feature much faster.
var nearest = layer.NearestTo(point);
Console.WriteLine("City nearest to (12.30 50.33) is " + nearest.GetValue<string>("name"));
Console.WriteLine();
}

Geometriyle Kesişen Öznitelikleri Seçme

Aşağıdaki örnekler, geometriyle kesişen özniteliklerin seçimini hızlandırmak için mekansal indeksi kullanır:

// For complete examples and data files, please go to https://github.com/aspose-gis/Aspose.GIS-for-.NET
using (var layer = VectorLayer.Open(path, Drivers.GeoJson))
{
// Use spatial index to speed up 'WhereIntersects'.
var spatialIndexPath = Path.ChangeExtension(path, ".spatial_out.ix");
layer.UseSpatialIndex(spatialIndexPath);
var polygon = Geometry.FromText("Polygon((12.30 50.33, 22.49 54.87, 21.92 42.53, 12.30 50.33))");
var intersecting = layer.WhereIntersects(polygon);
Console.WriteLine("Cities within " + polygon.AsText() + ":");
foreach (var feature in intersecting)
{
var name = feature.GetValue<string>("name");
var location = (IPoint) feature.Geometry;
Console.WriteLine($"{name} at ({location.X}, {location.Y})");
}
Console.WriteLine();
}