6

数千のポリゴンを含むシェープファイルがあります。

このファイルからC#で読み取り、WKT形式の文字列のリストを出力する必要があります。

DotSpatial「CatFood」ESRIシェープファイルリーダーを見ました。シェープファイルを正常にロードすることはできますが、WKTとしてエクスポートする方法がわかりません。

DotSpatialでは、私が見つけた唯一の例は、WktWriterをとるaを使用しています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.ShapeIndicesfs.GetShape()ShapeShapeRange

新しい質問

  1. 設定する必要がありますfs.IndexMode = trueか?なぜまたはなぜそうではないのですか?パフォーマンスや結果に影響はないようです。
  2. fs.GetShape()と呼ばれるブール値を取りますgetAttributes。私は自分の形に属性を持っています、そしてそれらはこれが真であるか偽であるかを通り抜けているようです。繰り返しますが、どちらの方法でも顕著なパフォーマンスへの影響はありません。それは期待されていますか?
  3. このように取得することで、WKTはシェープファイルに保存されている実際の値を表しますか?それとも、何らかの形で変化していますか?dotSpatialのデフォルト設定を考慮に入れていますか?それらの変更について心配する必要がありますか?
  4. インポートしているシェープファイルは、ワールドタイムゾーンマップです。.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は、人間が読める形式のジオメトリのテキスト表現です。ファイルと同じ値だと思いますが、わかりません。もう一度..dotspatialソースコードをチェックしてください

4:prjファイルは、ジオメトリがどの投影にあるかを示します。ジオメトリで何をしたいかによっては、再投影が必要になる場合があります。たとえば、BingMapsやGoogleEarthのようなものはメルカトル図法を使用します。ドット空間プロジェクションライブラリは優れており、ジオメトリをあるプロジェクションから別のプロジェクションに簡単に変換できます。

シェープファイルでかなりの作業を行いました。他にご不明な点がありましたらお知らせください。

于 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

最初にシェープファイルを開き、次にその機能の基本的なジオメトリを取得します。

        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 に答える