private static void TestValid(Geometry geom) { if (!geom.IsValid) { var ivop = new NetTopologySuite.Operation.Valid.IsValidOp(geom); if (!ivop.IsValid) { Console.WriteLine(geom.AsText()); Console.Write(ivop.ValidationError); } Assert.True(false); } }
private static void TestValid(IGeometry geom) { if (!geom.IsValid) { var ivop = new NetTopologySuite.Operation.Valid.IsValidOp(geom); if (!ivop.IsValid) { Console.WriteLine(geom.AsText()); Console.Write(ivop.ValidationError); } Assert.True(false); } }
/// <inheritdoc /> public Dictionary <string, List <Feature> > Preprocess(Dictionary <string, List <ICompleteOsmGeo> > osmNamesDictionary) { _logger.LogInformation("Preprocessing OSM data to GeoJson, total distict names: " + osmNamesDictionary.Keys.Count); var geoJsonNamesDictionary = new Dictionary <string, List <Feature> >(); foreach (var pair in osmNamesDictionary) { var osmList = MergeOsmElements(pair.Value) .Select(e => _osmGeoJsonConverter.ToGeoJson(e)) .Where(f => f != null) .ToList(); if (osmList.Any()) { geoJsonNamesDictionary[pair.Key] = osmList; } } geoJsonNamesDictionary.Values.SelectMany(v => v).ToList().ForEach(g => { var isValidOp = new NetTopologySuite.Operation.Valid.IsValidOp(g.Geometry); if (!isValidOp.IsValid) { _logger.LogError($"{g.Geometry.GeometryType} with ID: {g.Attributes[FeatureAttributes.ID]} {isValidOp.ValidationError.Message} ({isValidOp.ValidationError.Coordinate.X},{isValidOp.ValidationError.Coordinate.Y})"); } }); _logger.LogInformation("Finished converting OSM data to GeoJson, Starting GeoJson preprocessing"); var containers = geoJsonNamesDictionary.Values.SelectMany(v => v).Where(f => !(f.Geometry is MultiLineString) && !(f.Geometry is LineString) && !(f.Geometry is MultiPoint) && !(f.Geometry is Point)).ToList(); _logger.LogInformation("Total possible containers: " + containers.Count); var counter = 0; foreach (var features in geoJsonNamesDictionary.Values) { PreprocessGeoJson(features, containers); counter++; if (counter % 5000 == 0) { _logger.LogInformation($"Finished processing {counter} names of {geoJsonNamesDictionary.Values.Count}"); } } _logger.LogInformation("Finished GeoJson preprocessing"); return(geoJsonNamesDictionary); }
private void AddAddressField(Feature feature, List <Feature> containers) { if (!(feature.Geometry is Point) && !(feature.Geometry is LineString)) { return; } Feature invalidFeature = null; var containingGeoJson = containers.FirstOrDefault(f => { try { return(f != feature && f.Geometry.Contains(feature.Geometry)); } catch (Exception) { var isValidOp = new NetTopologySuite.Operation.Valid.IsValidOp(f.Geometry); if (!isValidOp.IsValid) { _logger.LogError($"Issue with contains test for: {f.Geometry.GeometryType}_{f.Attributes[FeatureAttributes.ID]}: feature.Geometry is not valid: {isValidOp.ValidationError.Message} at: ({isValidOp.ValidationError.Coordinate.X},{isValidOp.ValidationError.Coordinate.Y})"); } invalidFeature = f; return(false); } }); if (invalidFeature != null) { containers.Remove(invalidFeature); } if (containingGeoJson == null) { return; } foreach (var attributeName in containingGeoJson.Attributes.GetNames().Where(n => n.StartsWith("name"))) { var addressName = attributeName.Replace("name", "address"); if (feature.Attributes.Exists(addressName)) { feature.Attributes[addressName] = containingGeoJson.Attributes[attributeName]; } else { feature.Attributes.AddAttribute(addressName, containingGeoJson.Attributes[attributeName]); } } }
/// <inheritdoc /> public List <Feature> Preprocess(Dictionary <string, List <ICompleteOsmGeo> > osmNamesDictionary) { _logger.LogInformation("Preprocessing OSM data to GeoJson, total distinct names: " + osmNamesDictionary.Keys.Count); var geoJsonNamesDictionary = new Dictionary <string, List <Feature> >(); foreach (var pair in osmNamesDictionary) { var features = MergeOsmElements(pair.Value) .Select(e => _osmGeoJsonConverter.ToGeoJson(e)) .Where(f => f != null) .ToList(); if (!features.Any()) { continue; } AddAttributes(features); geoJsonNamesDictionary[pair.Key] = features; } geoJsonNamesDictionary.Values.SelectMany(v => v).ToList().ForEach(g => { var isValidOp = new NetTopologySuite.Operation.Valid.IsValidOp(g.Geometry); if (!isValidOp.IsValid) { _logger.LogError($"{g.Geometry.GeometryType} with ID: {g.Attributes[FeatureAttributes.ID]} {isValidOp.ValidationError.Message} ({isValidOp.ValidationError.Coordinate.X},{isValidOp.ValidationError.Coordinate.Y})"); } if (g.Geometry.IsEmpty) { _logger.LogError($"{g.Geometry.GeometryType} with ID: {g.Attributes[FeatureAttributes.ID]} is an empty geometry - check for non-closed relations."); } }); _logger.LogInformation("Finished GeoJson conversion"); var featuresToReturn = geoJsonNamesDictionary.SelectMany(v => v.Value).ToList(); ChangeLwnHikingRoutesToNoneCategory(featuresToReturn); return(featuresToReturn); }