【问题标题】:Populate datatable in C# from GPX file从 GPX 文件填充 C# 中的数据表
【发布时间】:2016-10-20 21:57:50
【问题描述】:

如果有人告诉我是否有办法将 GPX 文件导入 C# 数据表,我将不胜感激。 我用谷歌搜索了很多次,但都是徒劳的。

【问题讨论】:

  • 您希望填充什么样的数据库,SQL?
  • 它不是数据库,我只是想填充一个数据表以便使用这些数据来创建一个shapefile

标签: c# datatable gpx


【解决方案1】:

解决此问题的一种方法是将 XML 反序列化为一个对象,然后您可以随意导航和使用该对象。

Garmin Oregon 400T 生成的 XML 数据为例:

<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" creator="Oregon 400t" version="1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd">
  <metadata>
    <link href="http://www.garmin.com">
      <text>Garmin International</text>
    </link>
    <time>2009-10-17T22:58:43Z</time>
  </metadata>
  <trk>
    <name>Example GPX Document</name>
    <trkseg>
      <trkpt lat="47.644548" lon="-122.326897">
        <ele>4.46</ele>
        <time>2009-10-17T18:37:26Z</time>
      </trkpt>
      <trkpt lat="47.644548" lon="-122.326897">
        <ele>4.94</ele>
        <time>2009-10-17T18:37:31Z</time>
      </trkpt>
      <trkpt lat="47.644548" lon="-122.326897">
        <ele>6.87</ele>
        <time>2009-10-17T18:37:34Z</time>
      </trkpt>
    </trkseg>
  </trk>
</gpx>

您可以创建一些可用于反序列化 XML 的自定义类:

[Serializable()]
[System.Xml.Serialization.XmlRoot("gpx")]
public class gpx {
    [System.Xml.Serialization.XmlElement("metadata")]
    public Metadata mData { get; set; }

    [System.Xml.Serialization.XmlElement("trk")]
    public TrackCollection tCollection { get; set; }
}

[Serializable()]
public class Metadata {
    /// Fill in metadata elements here
}

[Serializable()]
public class TrackCollection {
    [System.Xml.Serialization.XmlElement("name")]
    public string name { get; set; }

    [XmlArray("trkseg")]
    [XmlArrayItem("trkpt", typeof(TrackPart))]
    public TrackPart[] tPart { get; set; }
}

[Serializable()]
public class TrackPart {
    [System.Xml.Serialization.XmlElementAttribute("lat")]
    public double lattitude { get; set; }
    [System.Xml.Serialization.XmlElementAttribute("lon")]
    public double longitude { get; set; }

    [System.Xml.Serialization.XmlElement("ele")]
    public int elapsed { get; set; }

    [System.Xml.Serialization.XmlElement("time")]
    public DateTime dateTime { get; set; }
}

我没有仔细检查这个例子,所以请谨慎使用。您也可以使用 .NET XML Reader 库并手动设置每个对象属性。

您还可以阅读有关 XML 反序列化 herehere 的更多信息。

那么这只是使用您新创建的对象来填充您的DataTable 的情况。如何填充DataTable 由您决定,但您可以这样做:

gpx myObject = deserialseGPXFile(); // example
DataTable table = new DataTable();

table.Columns.Add("lat", typeof(double));
table.Columns.Add("lon", typeof(double)); 

foreach (TrackPart tPart in myObject.TrackCollection)
{
    table.Rows.Add(tPart.lattitude, tPart.longitude);
}

【讨论】:

  • 谢谢,但我仍然不明白如何使用提取的数据填充数据表。
  • 谢谢,我去测试一下
  • myObject的声明有问题:/
  • 恐怕您必须更具体一些,代码示例也会有所帮助。
  • gpx myObject = deserialseGPXFile(); 当前上下文中不存在名称“deserialseGPXFile”
【解决方案2】:

这个功能会帮助你。 您可以根据项目需要修改代码。

internal static DataTable ReadGpxFile(string gpxfile)
    {
        AFolderFiles.AFolderFilesPermission.AddFolderSecurity(gpxfile);
        DataTable table = new DataTable("gpxfile");
        table.Columns.Add("ident", typeof(string));
        table.Columns.Add("lat", typeof(string));
        table.Columns.Add("long", typeof(string));
        table.Columns.Add("time", typeof(string));
        XmlDocument gpxDoc = new XmlDocument();
        gpxDoc.Load(gpxfile);
        XmlNamespaceManager nsmgr = new XmlNamespaceManager(gpxDoc.NameTable);
        nsmgr.AddNamespace("x", "http://www.topografix.com/GPX/1/1");
        XmlNodeList nl = gpxDoc.SelectNodes("//x:trkpt", nsmgr);
        foreach (XmlElement xelement in nl)
        {
            DataRow dataRow = table.NewRow();
            dataRow[0] = string.IsNullOrEmpty(xelement.GetAttribute("ident")) == true ? "GPXFILE" : xelement.GetAttribute("ident");
            dataRow[1] = xelement.GetAttribute("lat");
            dataRow[2] = xelement.GetAttribute("lon");
            dataRow[3] = xelement.GetAttribute("time");
            table.Rows.Add(dataRow);
        }
        return table;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-11
    • 2018-12-28
    • 1970-01-01
    • 2015-04-26
    • 2015-06-20
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    相关资源
    最近更新 更多