Пример #1
0
        static void FixMissingElevation(PoiList poiList, string tiffDir)
        {
            foreach (var groupLon in poiList.GroupBy(x => (int)x.Longitude))
            {
                //
                foreach (var groupLat in groupLon.GroupBy(x => (int)x.Latitude))
                {
                    //var _data = new List<GpsLocation>();
                    var    tiffFile = GetElevationFileName(groupLat.Key, groupLon.Key);
                    string filePath = $@"{tiffDir}{tiffFile}";

                    var ed = new ElevationTileConvertor(new GpsLocation(groupLon.Key, groupLat.Key, 0));
                    ed.ReadFromTiff(filePath);

                    {
                        foreach (var poi in groupLat)
                        {
                            var loc = new GpsLocation()
                            {
                                Latitude = poi.Latitude, Longitude = poi.Longitude
                            };
                            try
                            {
                                if (ed.IsLoaded())
                                {
                                    if (poi.Altitude < -0.0000001 || poi.Altitude > 0.0000001)
                                    {
                                        continue;
                                    }

                                    if (ed.TryGetElevation(loc, out var ele))
                                    {
                                        poi.Altitude = ele;
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine($"Exception thrown ({poi.Name}), Details: {ex.Message}");
                            }
                        }
                    }
                }
            }
        }
Пример #2
0
        private static void WriteToGpx(PoiList poiList, string outputFile, string category)
        {
            XmlWriter xmlWriter = XmlWriter.Create(outputFile);

            xmlWriter.WriteStartDocument();
            xmlWriter.WriteStartElement("gpx", "http://www.topografix.com/GPX/1/1");

            int errorNoName = 0;

            foreach (var item in poiList)
            {
                WriteWptElementToFile(item, xmlWriter, category, ref errorNoName);
            }

            xmlWriter.WriteEndElement();
            xmlWriter.WriteEndDocument();
            xmlWriter.Close();
        }
Пример #3
0
        // metric coordinates
        public static IFeatureSet ApplyBuffer(string filter, double distance, bool isMin, string workdir)
        {
            string      filename = PoiList.GetShapefile(filter);
            IFeatureSet fs       = FeatureSet.Open(CSV_FILE_DIR + '/' + filename);
            IFeatureSet bs       = fs.Buffer(distance, false);

            if (isMin)
            {
                bs = Complement(bs, workdir);
            }

            for (int i = 0; ; i++)
            {
                if (!File.Exists(WORKSPACE_DIR + workdir + "/buf" + i + ".shp"))
                {
                    bs.SaveAs(WORKSPACE_DIR + workdir + "/buf" + i + ".shp", true);
                    break;
                }
            }

            bs.SaveAs(WORKSPACE_DIR + workdir + "/buf.shp", true);
            return(bs);
        }
Пример #4
0
        static PoiList ReadFromOsm(string srcFile, bool excludeNoName, bool excludeNoElevation)
        {
            XmlDocument OSMDoc = new XmlDocument();

            OSMDoc.Load(srcFile);
            XmlNodeList nl               = OSMDoc.SelectNodes("/osm/node");
            int         totalRead        = 0;
            int         totalWritten     = 0;
            int         errorNoElevation = 0;
            int         errorNoName      = 0;

            var poiList = new PoiList();

            foreach (XmlElement xelement in nl)
            {
                totalRead++;

                var    lat       = xelement.Attributes.GetNamedItem("lat").Value;
                var    lon       = xelement.Attributes.GetNamedItem("lon").Value;
                string name      = "";
                string ele       = "";
                string wikipedia = "";
                string wikidata  = "";

                XmlNodeList tags = xelement.SelectNodes("tag");
                foreach (XmlElement nameElement in tags)
                {
                    if (nameElement.Attributes.GetNamedItem("k").Value == "name")
                    {
                        name = nameElement.Attributes.GetNamedItem("v").Value;
                    }

                    if (nameElement.Attributes.GetNamedItem("k").Value == "ele")
                    {
                        ele = nameElement.Attributes.GetNamedItem("v").Value;
                    }

                    if (nameElement.Attributes.GetNamedItem("k").Value == "wikidata")
                    {
                        wikidata = nameElement.Attributes.GetNamedItem("v").Value;
                    }

                    if (nameElement.Attributes.GetNamedItem("k").Value == "wikipedia")
                    {
                        wikipedia = nameElement.Attributes.GetNamedItem("v").Value;
                    }
                }

                if (String.IsNullOrEmpty(name))
                {
                    errorNoName++;
                    if (excludeNoName)
                    {
                        continue;
                    }
                }

                if (String.IsNullOrEmpty(ele) && excludeNoElevation)
                {
                    errorNoElevation++;
                    if (excludeNoElevation)
                    {
                        continue;
                    }
                }

                if (ele.EndsWith("m"))
                {
                    ele = ele.Remove(ele.Length - 1, 1);
                }

                try
                {
                    poiList.Add(
                        new Poi()
                    {
                        Latitude  = double.Parse(lat, CultureInfo.InvariantCulture),
                        Longitude = double.Parse(lon, CultureInfo.InvariantCulture),
                        Altitude  = string.IsNullOrEmpty(ele) ? 0 : double.Parse(ele, CultureInfo.InvariantCulture),
                        Wikidata  = wikidata,
                        Wikipedia = wikipedia,
                        Name      = name
                    });
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error:" + ex.Message);
                    Console.WriteLine($"    Name: {name}");
                    Console.WriteLine($"    Latitude: {lat}");
                    Console.WriteLine($"    Longitude: {lon}");
                    Console.WriteLine($"    Altitude: {ele}");
                }
            }

            WriteStatistics(totalRead, errorNoName, errorNoElevation);

            return(poiList);
        }
Пример #5
0
        static public PoiList Parse(string xml, PoiCategory category, PoiCountry country, Guid source, Action <int> OnStart = null, Action <int> OnProgress = null)
        {
            var lastNode = "";

            try
            {
                var listOfPoi = new PoiList();

                XmlDocument gpxDoc = new XmlDocument();
                gpxDoc.LoadXml(xml);
                XmlNamespaceManager nsmgr = new XmlNamespaceManager(gpxDoc.NameTable);
                nsmgr.AddNamespace("x", "http://www.topografix.com/GPX/1/1");
                nsmgr.AddNamespace("ogr", "http://osgeo.org/gdal");
                XmlNodeList nl = gpxDoc.SelectNodes("/x:gpx/x:wpt ", nsmgr);

                OnStart?.Invoke(nl == null ? 0 : nl.Count);

                int i = 0;
                foreach (XmlElement xelement in nl)
                {
                    OnProgress?.Invoke(i++);

                    var lat = xelement.Attributes.GetNamedItem("lat").Value;
                    var lon = xelement.Attributes.GetNamedItem("lon").Value;

                    var nameElement = xelement["name"];
                    var name        = nameElement == null ? "Unnamed" : nameElement.InnerText;

                    var eleElement = xelement["ele"];
                    var ele        = eleElement == null ? "0" : eleElement.InnerText;

                    var    wikidataElement = xelement["wikidata"];
                    string wikidata        = wikidataElement == null ? "" : wikidataElement.InnerText;

                    var    wikipediaElement = xelement["wikipedia"];
                    string wikipedia        = wikipediaElement == null ? "" : wikipediaElement.InnerText;

                    Poi poi = new Poi
                    {
                        Name      = name,
                        Longitude = double.Parse(lon, CultureInfo.InvariantCulture),
                        Latitude  = double.Parse(lat, CultureInfo.InvariantCulture),
                        Altitude  = String.IsNullOrEmpty(ele) ? 0 : double.Parse(ele, CultureInfo.InvariantCulture),
                        Category  = category,
                        Country   = country,
                        Source    = source
                    };
                    if (!String.IsNullOrEmpty(wikipedia))
                    {
                        poi.Wikipedia = wikipedia;
                    }
                    if (!String.IsNullOrEmpty(wikidata))
                    {
                        poi.Wikidata = wikidata;
                    }

                    listOfPoi.Add(poi);

                    lastNode = name;
                }

                return(listOfPoi);
            }
            catch (Exception ex)
            {
                throw new Exception($"Error when parsing GPX file (last node:{lastNode})", ex);
            }
        }