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