示例#1
0
 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);
     }
 }
示例#2
0
 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);
     }
 }
示例#3
0
        /// <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);
        }
示例#4
0
        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]);
                }
            }
        }
示例#5
0
        /// <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);
        }