private void EntityNumbers_Load(object sender, EventArgs e) { _baseEntity = GlobalData.CompleteGeocodeList(); _baseEntity.CalcOldGeocodesRecursive(); _baseEntity.PropagateObsoleteToSubEntities(); _allEntities = _baseEntity.FlatList()./*Where(x => !x.IsObsolete).*/ ToList(); var allLocalGovernmentParents = _allEntities.Where(x => x.type == EntityType.Tambon || x.type == EntityType.Changwat).ToList(); _localGovernments.AddRange(_allEntities.Where(x => x.type.IsLocalGovernment())); foreach (var tambon in allLocalGovernmentParents) { var localGovernmentEntity = tambon.CreateLocalGovernmentDummyEntity(); if (localGovernmentEntity != null) { _localGovernments.Add(localGovernmentEntity); _allEntities.Add(localGovernmentEntity); } } var entityTypes = new List <EntityType>() { EntityType.Changwat, EntityType.Amphoe, EntityType.KingAmphoe, EntityType.Khet, EntityType.Tambon, EntityType.Khwaeng, // EntityType.Muban, EntityType.Sukhaphiban, EntityType.ThesabanNakhon, EntityType.ThesabanMueang, EntityType.ThesabanTambon, // EntityType.TAO, }; _endYear = DateTime.Now.Year; foreach (var entityType in entityTypes) { _numberyByYear[entityType] = CalcEntityTypeByYear(entityType, _allEntities); var series = new Series(); series.LegendText = entityType.Translate(Language.English); series.Tag = entityType; foreach (var dataPoint in _numberyByYear[entityType]) { series.Points.Add(new DataPoint(dataPoint.Item1, dataPoint.Item2)); } series.ChartType = SeriesChartType.Line; chart.Series.Add(series); } edtYear.Maximum = _endYear; edtYear.Minimum = _startYear; edtYear.Value = _endYear; }
private void EntityBrowserForm_Load(object sender, EventArgs e) { _baseEntity = GlobalData.CompleteGeocodeList(); _baseEntity.CalcOldGeocodesRecursive(); _baseEntity.PropagatePostcodeRecursive(); _baseEntity.PropagateObsoleteToSubEntities(); _allEntities = _baseEntity.FlatList().Where(x => !x.IsObsolete).ToList(); var allLocalGovernmentParents = _allEntities.Where(x => x.type == EntityType.Tambon || x.type == EntityType.Changwat).ToList(); _localGovernments.AddRange(_allEntities.Where(x => x.type.IsLocalGovernment())); foreach ( var tambon in allLocalGovernmentParents ) { var localGovernmentEntity = tambon.CreateLocalGovernmentDummyEntity(); if ( localGovernmentEntity != null ) { _localGovernments.Add(localGovernmentEntity); _allEntities.Add(localGovernmentEntity); } } GlobalData.LoadPopulationData(PopulationDataSource, PopulationReferenceYear); CalculateLocalGovernmentPopulation(); PopulationDataToTreeView(); }
private Dictionary<EntityType, Int32> CountSubdivisionsWithoutLocation(Entity entity) { var toCount = _localGovernments.Where(x => x.parent.Contains(entity.geocode) || GeocodeHelper.IsBaseGeocode(entity.geocode, x.geocode)).ToList(); toCount.AddRange(entity.FlatList().Where(x => !x.type.IsLocalGovernment())); toCount.RemoveAll(x => x.type == EntityType.Unknown || x.IsObsolete); toCount.RemoveAll(x => x.office.Any(y => y.Point != null)); return CountSubdivisions(toCount); }
private Dictionary<EntityType, Int32> CountSubdivisions(Entity entity) { var toCount = _localGovernments.Where(x => x.parent.Contains(entity.geocode) || GeocodeHelper.IsBaseGeocode(entity.geocode, x.geocode)).SelectMany(x => x.FlatList()).ToList(); // Chumchon and local governments are already in list, so filter them out while adding the central government units toCount.AddRange(entity.FlatList().Where(x => !x.type.IsLocalGovernment() && x.type != EntityType.Chumchon)); toCount.RemoveAll(x => x.type == EntityType.Unknown || x.IsObsolete); return CountSubdivisions(toCount); }
private void CheckForErrors(Entity entity) { var text = String.Empty; var wrongGeocodes = entity.WrongGeocodes(); if ( wrongGeocodes.Any() ) { text += "Wrong geocodes:" + Environment.NewLine; foreach ( var code in wrongGeocodes ) { text += String.Format(" {0}", code) + Environment.NewLine; } text += Environment.NewLine; } var localGovernmentsInEntity = LocalGovernmentEntitiesOf(entity).ToList(); // var localGovernmentsInProvince = LocalGovernmentEntitiesOf(this.baseEntity.entity.First(x => x.geocode == GeocodeHelper.ProvinceCode(entity.geocode))).ToList(); var localEntitiesWithOffice = localGovernmentsInEntity.Where(x => x.Dola != null && !x.IsObsolete).ToList(); // Dola != null when there is a local government office // var localEntitiesInProvinceWithOffice = localGovernmentsInProvince.Where(x => x.Dola != null && !x.IsObsolete).ToList(); // Dola != null when there is a local government office if ( ShowDolaErrors ) { var entitiesWithDolaCode = localEntitiesWithOffice.Where(x => x.Dola.codeSpecified).ToList(); var allDolaCodes = entitiesWithDolaCode.Select(x => x.Dola.code).ToList(); var duplicateDolaCodes = allDolaCodes.GroupBy(s => s).SelectMany(grp => grp.Skip(1)).ToList(); if ( duplicateDolaCodes.Any() ) { text += "Duplicate DOLA codes:" + Environment.NewLine; foreach ( var code in duplicateDolaCodes ) { text += String.Format(" {0}", code) + Environment.NewLine; } text += Environment.NewLine; } var invalidDolaCodeEntities = entitiesWithDolaCode.Where(x => !x.DolaCodeValid()).ToList(); if ( invalidDolaCodeEntities.Any() ) { text += "Invalid DOLA codes:" + Environment.NewLine; foreach ( var dolaEntity in invalidDolaCodeEntities ) { text += String.Format(" {0} {1} ({2})", dolaEntity.Dola.code, dolaEntity.english, dolaEntity.type) + Environment.NewLine; } text += Environment.NewLine; } } var localEntitiesWithoutParent = localEntitiesWithOffice.Where(x => !x.parent.Any()); if ( localEntitiesWithoutParent.Any() ) { text += "Local governments without parent:" + Environment.NewLine; foreach ( var subEntity in localEntitiesWithoutParent ) { text += String.Format(" {0} {1}", subEntity.geocode, subEntity.english) + Environment.NewLine; } text += Environment.NewLine; } var allTambon = entity.FlatList().Where(x => x.type == EntityType.Tambon && !x.IsObsolete).ToList(); var localGovernmentCoverages = new List<LocalGovernmentCoverageEntity>(); foreach ( var item in localEntitiesWithOffice ) { localGovernmentCoverages.AddRange(item.LocalGovernmentAreaCoverage); } var localGovernmentCoveragesByTambon = localGovernmentCoverages.GroupBy(s => s.geocode); var tambonWithMoreThanOneCoverage = localGovernmentCoveragesByTambon.Where(x => x.Count() > 1); var duplicateCompletelyCoveredTambon = tambonWithMoreThanOneCoverage.Where(x => x.Any(y => y.coverage == CoverageType.completely)).Select(x => x.Key); var invalidLocalGovernmentCoverages = localGovernmentCoveragesByTambon.Where(x => !allTambon.Any(y => y.geocode == x.Key)); // var tambonWithMoreThanOneCoverage = localGovernmentCoveragesByTambon.SelectMany(grp => grp.Skip(1)).ToList(); // var duplicateCompletelyCoveredTambon = tambonWithMoreThanOneCoverage.Where(x => x.coverage == CoverageType.completely); if ( invalidLocalGovernmentCoverages.Any() ) { text += "Invalid Tambon references by areacoverage:" + Environment.NewLine; foreach ( var code in invalidLocalGovernmentCoverages ) { text += String.Format(" {0}", code.Key) + Environment.NewLine; } text += Environment.NewLine; } if ( duplicateCompletelyCoveredTambon.Any() ) { text += "Tambon covered completely more than once:" + Environment.NewLine; foreach ( var code in duplicateCompletelyCoveredTambon ) { text += String.Format(" {0}", code) + Environment.NewLine; } text += Environment.NewLine; } var partialLocalGovernmentCoverages = localGovernmentCoverages.Where(x => x.coverage == CoverageType.partially); var partiallyCoveredTambon = partialLocalGovernmentCoverages.GroupBy(s => s.geocode); var onlyOnePartialCoverage = partiallyCoveredTambon.Select(group => new { code = group.Key, count = group.Count() }).Where(x => x.count == 1).Select(y => y.code); if ( onlyOnePartialCoverage.Any() ) { text += "Tambon covered partially only once:" + Environment.NewLine; foreach ( var code in onlyOnePartialCoverage ) { text += String.Format(" {0}", code) + Environment.NewLine; } text += Environment.NewLine; } var tambonWithoutCoverage = allTambon.Where(x => !localGovernmentCoveragesByTambon.Any(y => y.Key == x.geocode)); if ( tambonWithoutCoverage.Any() ) { text += String.Format("Tambon without coverage ({0}):", tambonWithoutCoverage.Count()) + Environment.NewLine; foreach ( var tambon in tambonWithoutCoverage ) { text += String.Format(" {0}", tambon.geocode) + Environment.NewLine; } text += Environment.NewLine; } var localGovernmentWithoutCoverage = localEntitiesWithOffice.Where(x => x.type != EntityType.PAO && !x.LocalGovernmentAreaCoverage.Any()); if ( localGovernmentWithoutCoverage.Any() ) { text += String.Format("LAO without coverage ({0}):", localGovernmentWithoutCoverage.Count()) + Environment.NewLine; foreach ( var tambon in localGovernmentWithoutCoverage ) { text += String.Format(" {0}", tambon.geocode) + Environment.NewLine; } text += Environment.NewLine; } var tambonWithoutPostalCode = allTambon.Where(x => !x.codes.post.value.Any()); if ( tambonWithoutPostalCode.Any() ) { text += String.Format("Tambon without postal code ({0}):", tambonWithoutPostalCode.Count()) + Environment.NewLine; foreach ( var tambon in tambonWithoutPostalCode ) { text += String.Format(" {0}", tambon.geocode) + Environment.NewLine; } text += Environment.NewLine; } if ( GlobalData.AllGazetteAnnouncements.AllGazetteEntries.Any() ) { var tambonWithoutAreaDefinition = allTambon.Where(x => !x.entitycount.Any()); if ( tambonWithoutAreaDefinition.Any() ) { text += String.Format("Tambon without Royal Gazette area definition ({0}):", tambonWithoutAreaDefinition.Count()) + Environment.NewLine; foreach ( var tambon in tambonWithoutAreaDefinition ) { text += String.Format(" {0}", tambon.geocode) + Environment.NewLine; } text += Environment.NewLine; } } var unknownNeighbors = new List<UInt32>(); var onewayNeighbors = new List<UInt32>(); foreach ( var entityWithNeighbors in entity.FlatList().Where(x => x.area.bounding.Any()) ) { foreach ( var neighbor in entityWithNeighbors.area.bounding.Select(x => x.geocode) ) { var targetEntity = _allEntities.FirstOrDefault(x => x.geocode == neighbor); if ( targetEntity == null ) { unknownNeighbors.Add(neighbor); } else if ( targetEntity.area.bounding.Any() && !targetEntity.area.bounding.Any(x => x.geocode == entityWithNeighbors.geocode) ) { if ( !onewayNeighbors.Contains(entityWithNeighbors.geocode) ) { onewayNeighbors.Add(entityWithNeighbors.geocode); } } } } if ( unknownNeighbors.Any() ) { text += String.Format("Invalid neighboring entities ({0}):", unknownNeighbors.Count()) + Environment.NewLine; foreach ( var code in unknownNeighbors ) { text += String.Format(" {0}", code) + Environment.NewLine; } text += Environment.NewLine; } if ( onewayNeighbors.Any() ) { text += String.Format("Neighboring entities not found in both direction ({0}):", onewayNeighbors.Count()) + Environment.NewLine; foreach ( var code in onewayNeighbors ) { text += String.Format(" {0}", code) + Environment.NewLine; } text += Environment.NewLine; } text += CheckCode(entity, new List<EntityType>() { EntityType.Changwat }, "FIPS10", (Entity x) => x.codes.fips10.value, "TH\\d\\d"); text += CheckCode(entity, new List<EntityType>() { EntityType.Changwat }, "ISO3166", (Entity x) => x.codes.iso3166.value, "TH-(\\d\\d|S)"); text += CheckCode(entity, new List<EntityType>() { EntityType.Changwat, EntityType.Amphoe }, "HASC", (Entity x) => x.codes.hasc.value, "TH(\\.[A-Z]{2}){1,2}"); text += CheckCode(entity, new List<EntityType>() { EntityType.Changwat, EntityType.Amphoe }, "SALB", (Entity x) => x.codes.salb.value, "THA[\\d{3}]{1,2}"); var entityWithoutSlogan = entity.FlatList().Where(x => !x.IsObsolete && (x.type.IsCompatibleEntityType(EntityType.Changwat) || x.type.IsCompatibleEntityType(EntityType.Amphoe)) && !x.symbols.slogan.Any()); if ( entityWithoutSlogan.Any() ) { text += String.Format("Province/District without slogan ({0}):", entityWithoutSlogan.Count()) + Environment.NewLine; foreach ( var item in entityWithoutSlogan ) { text += String.Format(" {0}: {1}", item.geocode, item.english) + Environment.NewLine; } text += Environment.NewLine; } // check areacoverages txtErrors.Text = text; }
private String CheckCode(Entity entity, IEnumerable<EntityType> entityTypes, String codeName, Func<Entity, String> selector, String format) { String text = String.Empty; var allEntites = entity.FlatList().Where(x => !x.IsObsolete); var allEntityOfFittingType = allEntites.Where(x => x.type.IsCompatibleEntityType(entityTypes)); var entitiesWithoutCode = allEntityOfFittingType.Where(x => String.IsNullOrEmpty(selector(x))); if ( entitiesWithoutCode.Any() ) { text += String.Format("Entity without {0} code ({1}):", codeName, entitiesWithoutCode.Count()) + Environment.NewLine; foreach ( var subEntity in entitiesWithoutCode ) { text += String.Format(" {0}", subEntity.geocode) + Environment.NewLine; } text += Environment.NewLine; } var allCodes = allEntites.Where(x => !String.IsNullOrEmpty(selector(x))).Select(y => selector(y)).ToList(); var duplicateCodes = allCodes.GroupBy(s => s).SelectMany(grp => grp.Skip(1)).ToList(); if ( duplicateCodes.Any() ) { text += String.Format("Duplicate {0} codes:", codeName) + Environment.NewLine; foreach ( var code in duplicateCodes ) { text += String.Format(" {0}", code) + Environment.NewLine; } text += Environment.NewLine; } var regex = new Regex(format); var invalidCodes = allCodes.Where(x => !regex.IsMatch(x)); if ( invalidCodes.Any() ) { text += String.Format("Invalid {0} codes:", codeName) + Environment.NewLine; foreach ( var code in invalidCodes ) { text += String.Format(" {0}", code) + Environment.NewLine; } text += Environment.NewLine; } return text; }
private void CalcMubanData(Entity entity) { String result = String.Empty; var allTambon = entity.FlatList().Where(x => !x.IsObsolete && x.type == EntityType.Tambon); var allMuban = entity.FlatList().Where(x => !x.IsObsolete && x.type == EntityType.Muban); var mubanNumbers = allTambon.GroupBy(x => x.entity.Count(y => !y.IsObsolete && y.type == EntityType.Muban)) .Select(g => g.Key).ToList(); mubanNumbers.Sort(); if ( allMuban.Count() == 0 ) { result = "No Muban" + Environment.NewLine; } else { result = String.Format("{0} Muban; Tambon have between {1} and {2} Muban" + Environment.NewLine, allMuban.Count(), mubanNumbers.First(), mubanNumbers.Last()); var counter = new FrequencyCounter(); foreach ( var tambon in allTambon ) { counter.IncrementForCount(tambon.entity.Count(x => x.type == EntityType.Muban && !x.IsObsolete), tambon.geocode); } result += String.Format("Most common Muban number: {0}", counter.MostCommonValue) + Environment.NewLine; result += String.Format("Median Muban number: {0:0.0}", counter.MeanValue) + Environment.NewLine; List<UInt32> tambonWithNoMuban = null; if ( counter.Data.TryGetValue(0, out tambonWithNoMuban) ) { result += String.Format("Tambon without Muban: {0}", tambonWithNoMuban.Count) + Environment.NewLine; } } // could add: Muban creations in last years var tambonWithInvalidMubanNumber = TambonWithInvalidMubanNumber(allTambon); if ( tambonWithInvalidMubanNumber.Any() ) { result += Environment.NewLine + String.Format("Muban inconsistent for {0} Muban:", tambonWithInvalidMubanNumber.Count()) + Environment.NewLine; foreach ( var tambon in tambonWithInvalidMubanNumber ) { result += String.Format("{0}: {1}", tambon.geocode, tambon.english) + Environment.NewLine; } } txtMuban.Text = result; }