فیلتر کردن و فهرست‌بندی لایه‌های برداری GIS در C#

با Aspose.GIS for .NET می‌توانید لایه‌ها را بر اساس مقادیر ویژگی یا حدود مکانی فیلتر کنید. همچنین می‌توانید از فهرست‌ها برای سرعت بخشیدن به فیلتر کردن و پرس‌وجوهای مکانی استفاده کنید.

فهرست ویژگی

فیلتر بدون فهرست

در اینجا نحوه فیلتر کردن یک لایه بر اساس مقادیر یک ویژگی آمده است:

// 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();
}

فیلتر با فهرست

کد بالا تا زمانی که لایه فقط یک بار فیلتر شود خوب است. اما اگر احتمال دارد که لایه چندین بار پرس‌وجو شود، می‌توانیم از فهرست‌های ویژگی بهره ببریم. ایجاد فهرست ویژگی کمی زمان می‌برد، اما می‌توان آن را چندین بار برای سرعت بخشیدن به فیلتر کردن استفاده کرد.

مثال زیر از یک فایل فهرست ویژگی برای سرعت بخشیدن به فیلتر کردن لایه بر اساس مقادیر ویژگی استفاده می‌کند:

// 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();
}

ذخیره ویژگی‌های فیلتر شده

ویژگی‌های فیلتر شده را می‌توان در لایه‌ها ذخیره کرد:

// 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);
}

رندر ویژگی‌های فیلتر شده

همچنین می‌توان ویژگی‌های فیلتر شده را رندر کرد. مثال زیر از فهرست ویژگی برای انتخاب سریع تمام ویژگی‌هایی با جمعیت بیشتر از 2000 و افزودن آنها به نقشه استفاده می‌کند:

// 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);
}

فهرست مکانی

فهرست‌های مکانی برای سرعت بخشیدن به پرس‌وجوهای مکانی استفاده می‌شوند. درست مانند فهرست‌های ویژگی، فهرست‌های مکانی پس از ایجاد دوباره استفاده می‌شوند.

یافتن ویژگی‌های نزدیک‌ترین به نقطه

در اینجا نحوه استفاده از فهرست مکانی برای سرعت بخشیدن به یافتن ویژگی نزدیک‌ترین به یک نقطه آمده است:

// 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();
}

انتخاب ویژگی‌هایی که با هندسه تلاقی می‌کنند

مثال زیر از فهرست مکانی برای سرعت بخشیدن به انتخاب ویژگی‌هایی که با هندسه تلاقی می‌کنند استفاده می‌کند:

// 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();
}