การกรองและทำดัชนีชั้นเวกเตอร์ 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(); | |
} |