private static ColumnScale <string> SpatialIndexAdvanced(string dataSetPath) { ColumnScale <string> columnScale = new ColumnScale <string>(); Driver fileGdbDriver = Ogr.GetDriverByName("OpenFileGDB"); DataSource dataSource = fileGdbDriver.Open(dataSetPath, 0); Layer layer = dataSource.GetLayerByIndex(0); Feature feature = layer.GetNextFeature(); while (feature != null) { string classification = feature.GetFieldAsString("CODE2012"); Geometry geometry = feature.GetGeometryRef(); double size = geometry.Area(); columnScale.AddFeature(classification, new FeatureScale() { FeatureId = (int)feature.GetFID(), Size = size }); feature = layer.GetNextFeature(); } columnScale.CalculateProbabilities(); foreach ((string classification, ColumnValueScale columnValueScale) in columnScale.ColumnValueScales) { Console.WriteLine( $"Classification {classification} has an aggregated scale limit of {columnValueScale.ProbabilityLimit,8:P}."); } return(columnScale); }
private static void SelectRandomFeatureWeighted(string dataSetPath, int sampleSize) { ColumnScale <string> columnScale = Program.SpatialIndexAdvanced(dataSetPath); List <dynamic> result = new List <dynamic>(); Driver fileGdbDriver = Ogr.GetDriverByName("OpenFileGDB"); DataSource dataSource = fileGdbDriver.Open(dataSetPath, 0); Layer layer = dataSource.GetLayerByIndex(0); SpatialReference spatialReference = layer.GetSpatialRef(); List <int> featureIds = new List <int>(); Random random = new Random(); for (int i = 0; i < sampleSize; i++) { double randomValue = random.NextDouble(); KeyValuePair <string, ColumnValueScale> columnValueScale = columnScale.ColumnValueScales .Where(x => x.Value.ProbabilityLimit > randomValue) .Where(x => x.Value.Features.Any(y => !featureIds.Contains(y.FeatureId))) .OrderBy(x => x.Value.ProbabilityLimit) .FirstOrDefault(); if (columnValueScale.Value != null) { FeatureScale featureScale; do { randomValue = random.NextDouble(); featureScale = columnValueScale.Value.Features.Where(x => x.ProbabilityLimit > randomValue) .Where(x => !featureIds.Contains(x.FeatureId)) .OrderBy(x => x.ProbabilityLimit) .FirstOrDefault(); }while (featureScale != null && featureIds.Contains(featureScale.FeatureId)); Feature feature = layer.GetFeature(featureScale.FeatureId); featureIds.Add(featureScale.FeatureId); result.Add(new { FeatureId = feature.GetFID(), Classification = feature.GetFieldAsString("CODE2012"), FeatureGeometry = Tools.GetSampleItemGeometriesPolygon(feature, spatialReference), }); } } Console.WriteLine(JsonSerializer.Serialize(result, new JsonSerializerOptions { WriteIndented = true })); }