Example #1
0
        private static Collection <NatureArea> GenerateNatureAreasFromShapeFile(string shapeFilePath, int epsgCode, string knr, int startFeature, int featureCount)
        {
            var natureAreas = new Collection <NatureArea>();

            shapeFilePath = FileLocator.FindFileInTree(shapeFilePath);
            Shapefile shapeFile  = Shapefile.OpenFile(shapeFilePath);
            var       endFeature = startFeature + featureCount < shapeFile.Features.Count
                ? startFeature + featureCount
                : shapeFile.Features.Count;

            for (var number = startFeature; number < endFeature; number++)
            {
                var feature = shapeFile.Features[number];
                var area    = new NatureArea {
                    UniqueId = new Identification()
                };

                var numberString = number.ToString();
                var guid         = "00000000-0000-0000-" + knr + "-";

                for (int i = 0; i < 12 - numberString.Length; ++i)
                {
                    guid += "0";
                }

                area.UniqueId.LocalId = new Guid(guid + numberString);

                area.UniqueId.NameSpace = "NBIC";
                area.UniqueId.VersionId = "1.0";

                area.Version = "1";
                area.NivÄ    = Types.NatureLevel.Natursystem;

                area.Area = SqlGeometry.STGeomFromText(new SqlChars(feature.BasicGeometry.ToString()), epsgCode);

                var       natureAreaType = new NatureAreaType();
                const int rowOffset      = 0; // 1 for melhus
                natureAreaType.Code  = (string)feature.DataRow[rowOffset + 4];
                natureAreaType.Share = 1;
                if (feature.DataRow[rowOffset + 3] != DBNull.Value)
                {
                    var descriptionVariable      = new DescriptionVariable();
                    var descriptionVariableParts = ((string)feature.DataRow[rowOffset + 3]).Split('_');
                    descriptionVariable.Code  = descriptionVariableParts[0];
                    descriptionVariable.Value = descriptionVariableParts[1];
                    natureAreaType.AdditionalVariables.Add(descriptionVariable);
                }
                area.Parameters.Add(natureAreaType);

                area.Surveyed = DateTime.Parse(feature.DataRow[rowOffset + 5].ToString());
                area.Surveyer = new Contact {
                    Company = (string)feature.DataRow[rowOffset + 8]
                };
                natureAreas.Add(area);
            }
            return(natureAreas);
        }
Example #2
0
 public void Add(NatureAreaType natureAreaType, NatureArea natureArea)
 {
     if (!ContainsKey(natureAreaType.Code))
     {
         this[natureAreaType.Code] = new HashSet <int> {
             natureArea.Id
         }
     }
     ;
     else
     {
         this[natureAreaType.Code].Add(natureArea.Id);
     }
 }
Example #3
0
        private XElement NatureAreaTypeElement(XName elementName, NatureAreaType natureAreaType)
        {
            var e = new NinXElement(elementName);

            if (natureAreaType == null)
            {
                return(e);
            }

            e.Add(new NinXElement("kode", "natureAreaType.Code", natureAreaType.Code));
            e.Add(ContactElement("kartlegger", natureAreaType.Surveyer));
            e.Add(new NinXElement("kartlagtDato", "natureAreaType.Surveyed", natureAreaType.Surveyed));
            e.Add(new NinXElement("andel", "natureAreaType.Share", natureAreaType.Share));
            e.Add(CustomVariableElements(natureAreaType.CustomVariables));
            e.Add(AdditionalVariableElements(natureAreaType.AdditionalVariables));

            return(e);
        }
        public static async Task <List <NatureAreaType> > Load(string connectionString, Codes codes)
        {
            const string natureAreaTypeCodeSql =
                @"SELECT nat.geometry_id AS NatureAreaId, nat.code AS Code, nat.fraction AS Percentage
FROM data.codes_geometry nat
WHERE nat.code LIKE 'NA-%' and nat.code not LIKE 'NA-BS%' and nat.code not LIKE 'NA-LKM%'
GROUP BY nat.geometry_id, nat.code, nat.fraction";

            IEnumerable <NatureAreaTypeDto> dtos = null;

            using (var conn = new NpgsqlConnection(connectionString))
            {
                conn.Open();

                dtos = await conn.QueryAsync <NatureAreaTypeDto>(natureAreaTypeCodeSql);
            }

            var dict = new Dictionary <string, NatureAreaType>();
            var natureAreaPercentages = new Dictionary <(int, string), NatureAreaPercentage>();

            foreach (var dto in dtos)
            {
                if (!codes.Contains(dto.Code))
                {
                    continue;
                }

                if (!dict.TryGetValue(dto.Code, out var natureAreaType))
                {
                    natureAreaType = new NatureAreaType(dto.Code, codes.GetCode(dto.Code).Name);

                    dict.Add(dto.Code, natureAreaType);
                }

                var key = (dto.NatureAreaId, dto.Code);

                if (natureAreaPercentages.TryGetValue(key, out var natureArea))
                {
                    double newPercentage = natureArea.Percentage + (dto.Percentage / 10);

                    if (newPercentage > 1)
                    {
                        Console.WriteLine($"{key.Code} {key.NatureAreaId} exceeds 1 as percentage.");
                    }
                    else
                    {
                        natureArea.Percentage = newPercentage;
                    }
                }
                else
                {
                    var natureAreaPercentage = new NatureAreaPercentage {
                        NatureAreaId = dto.NatureAreaId, Percentage = dto.Percentage / 10
                    };
                    natureAreaType.NatureAreas.Add(natureAreaPercentage);
                    natureAreaPercentages.Add(key, natureAreaPercentage);
                }
            }

            return(dict.Values.ToList());
        }