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