如何从c#中的Shapefile导出WKT?

时间:2013-02-21 00:15:05

标签: c# geospatial shapefile wkt

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

我需要在C#中读取此文件并输出WKT formatted字符串列表。

我查看了DotSpatial"CatFood" ESRI Shapefile Reader。我可以得到正好加载shapefile,但我无法弄清楚如何导出为WKT。

在DotSpatial中,我能找到的唯一示例使用WktWriter,其中Geometry。我无法弄清楚如何从Geometry获取Shape

是否有更合适的库?

更新

感谢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()的{​​{3}}。返回的不是Shape,而是ShapeRange,我无法将其转换为几何图形。

新问题

  1. 我应该设置fs.IndexMode = true吗?为什么或者为什么不?它似乎没有任何性能或结果影响。
  2. fs.GetShape()采用名为getAttributes的布尔值。我确实对我的形状有属性,并且它们似乎是通过设置是真还是假来实现的。同样,无论如何都没有明显的性能影响。这是预期的吗?
  3. 通过这种方式获取它们,WKT是否代表存储在shapefile中的实际值?或者他们以任何方式改变?是否考虑了dotSpatial的任何默认设置,我应该关注更改它们吗?
  4. 我导入的shapefile是this sample。它确实包含.prj文件。 dotSpatial是否考虑到这一点,如果没有 - 我是否需要做额外的事情?
  5. 非常感谢!

3 个答案:

答案 0 :(得分: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文件告诉您几何体所处的投影。根据您要对其进行的操作,您可能需要重新投影它。例如,Bing Maps和Google Earth之类的东西使用墨卡托投影。点空间投影库很好,可以很容易地将几何体从一个投影转换为另一个投影。

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

答案 1 :(得分: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);


    }

答案 2 :(得分: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));          
        }