6

我有一个包含数千个多边形的Shapefile 。

我需要用 C# 读取这个文件并输出WKT 格式的字符串列表。

我查看了DotSpatial"CatFood" ESRI Shapefile Reader。我可以很好地加载 shapefile,但我不知道如何导出为 WKT。

在 DotSpatial 中,我能找到的唯一示例使用 a WktWriter,它采用Geometry. 我不知道如何GeometryShape.

有没有更适合这个的图书馆?

更新

感谢 mdm20 的回答,我能够写出以下内容:

using (var fs = FeatureSet.Open(path))
{
    var writer = new WktWriter();
    var numRows = fs.NumRows();
    for (int i = 0; i < numRows; i++)
    {
        var shape = fs.GetShape(i, true);                    
        var geometry = shape.ToGeometry();
        var wkt = writer.Write((Geometry) geometry);
        Debug.WriteLine(wkt);
    }
}

我最初错过它的原因是因为我正在关注这个示例,它使用fs.ShapeIndices而不是fs.GetShape(). 返回的不是 a Shape,而是 a ShapeRange,我无法将其转换为几何。

新问题

  1. 我应该设置fs.IndexMode = true吗?为什么或者为什么不?它似乎对性能或结果没有任何影响。
  2. fs.GetShape()接受一个名为getAttributes. 我的形状确实有属性,无论设置为真还是假,它们似乎都是通过的。同样,无论哪种方式都没有明显的性能影响。这是预期的吗?
  3. 通过这种方式获取它们,WKT 是否代表存储在 shapefile 中的实际值?或者他们是否以任何方式转变?它是否考虑了 dotSpatial 的任何默认设置,我是否应该担心更改它们?
  4. 我要导入的 shapefile 是世界时区地图。它确实包含一个 .prj 文件。dotSpatial 是否考虑到这一点,如果没有 - 我是否需要做任何额外的事情?

非常感谢!

4

3 回答 3

4

在 DotSpatial 中,Shape 类有一个 ToGeometry 方法。

/// <summary>
/// Converts this shape into a Geometry using the default factory.
/// </summary>
/// <returns>The geometry version of this shape.</returns>
public IGeometry ToGeometry()
{
    return ToGeometry(Geometry.DefaultFactory);
}

编辑

我只使用点空间的东西进行投影,所以我真的帮不了你太多。

1-2:不确定。如果你想看看他们做了什么,代码是开源的

3:WKT 是几何图形的人类可读文本表示。我会假设它与文件的值相同,但我不知道。再次..查看点空间源代码

4: prj 文件告诉你几何体的投影。根据你想用它做什么,你可能需要重新投影它。例如,必应地图和谷歌地球之类的东西使用墨卡托投影。点空间投影库很好,可以轻松地将几何图形从一个投影转换到另一个投影。

我对 shapefile 做了很多工作。如果您有更多问题,请告诉我。

于 2013-02-21T00:43:50.637 回答
1

尝试这个:

private void button1_Click(object sender, EventArgs e)
    {            
        String result = "";

        OpenFileDialog openfile = new OpenFileDialog();
        openfile.Filter = "Shapefile (*.shp)|*.shp|All files (*.*)|*.*";
        openfile.ShowDialog();
        String filePath = openfile.FileName.Replace(".shp", "").Replace(@"\", @"\\");
        String[] a = filePath.Split('\\');

        String shpName = a[a.Length-1];

        try
        {

            SQLiteConnection.CreateFile(openfile.FileName.Replace(".shp", "")+".sqlite");

            System.Data.SQLite.SQLiteConnection connection = new SQLiteConnection(@"Data Source=" + openfile.FileName.Replace(".shp", "") + ".sqlite");



            connection.Open();
            object returnvalue = new SQLiteCommand("SELECT load_extension('libspatialite-2.dll')", connection).ExecuteScalar();

            System.Data.SQLite.SQLiteCommand commande = new SQLiteCommand(connection);
            commande.CommandText = "CREATE virtual TABLE "+shpName+"VT USING VirtualShape('" + filePath + "', 'CP1252', 4326);";

            commande.ExecuteScalar();

            commande.CommandText = "CREATE TABLE geom AS SELECT * FROM " + shpName + "VT;";
            commande.ExecuteScalar();

            commande.CommandText = "drop table " + shpName + "VT";
            commande.ExecuteScalar();


            commande.CommandText = "ALTER TABLE geom ADD COLUMN WKT TEXT;";
            commande.ExecuteScalar();

            commande.CommandText = " UPDATE  geom set WKT= ST_AsText(Geometry);";
            commande.ExecuteScalar();


           // the test commande

            commande.CommandText = "SELECT WKT FROM geom;";

            result = (string)commande.ExecuteScalar();





        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);

        }
        MessageBox.Show(result);


    }
于 2013-10-21T08:42:32.380 回答
1

首先打开shapefile,然后得到它的特征基本几何......

        IFeatureSet fb = FeatureSet.Open("F:\\Test_value\\test.shp");
        List<string> str = new List<string>();
        foreach (IFeature ff in fb.Features)
        {
            Geometry geometry = ff.BasicGeometry as Geometry;
            WktWriter wktWriter = new WktWriter();
            str.Add(wktWriter.Write(geometry));          
        }
于 2016-03-15T05:54:08.130 回答