Пример #1
0
        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);
        }
Пример #2
0
        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
            }));
        }