2013-02-21 9 views
5

私は数千のポリゴンを含むShapefileを持っています。C#でShapefileからWKTをエクスポートするには?

私はこのファイルをC#で読み込み、WKT formatted文字列のリストを出力する必要があります。

私はDotSpatial"CatFood" ESRI Shapefile Readerを見ました。シェイプファイルをロードすることもできますが、WKTとしてエクスポートする方法を理解することはできません。

DotSpatialでは、唯一の例としてWktWriterが使用され、Geometryになります。 ShapeからGeometryを取得する方法がわかりませんでした。

もっと適切なライブラリがありますか?

更新 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()を使用している、私はthis sampleに従っていましたので、それはもともと逃した理由。それはShapeではなく、ShapeRangeです。これは幾何学に変換できませんでした。

新しい質問

  1. 私はfs.IndexMode = trueを設定すべきか?なぜ、なぜそうではないのですか?パフォーマンスや結果に影響がないようです。
  2. fs.GetShape()は、getAttributesというブール値をとります。私は自分の形に属性を持っています、そして、それは真実か偽であるかにかかわらず出てくるようです。ここでも、いずれの方法でも目に見えるパフォーマンスの影響はありません。それは期待されていますか?
  3. このようにして、WKTはシェイプファイルに格納されている実際の値を表しますか?あるいは、彼らは何らかの形で変身していますか?それはdotSpatialからのデフォルト設定を考慮に入れていますか?それらを変更することに心配すべきですか?
  4. インポートするシェイプファイルはworld timezone mapです。これには.prjファイルが含まれています。 dotSpatialはこれを考慮に入れていますか?もしそうでなければ、余分なことをする必要がありますか?

多くのありがとうございます!

答えて

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); 
} 

編集

私は唯一の予測のためのdotspatialのものを使用しましたので、私は本当にあなたがあまりにも助けることができません。

1-2:わかりません。彼らが何をするかを見たい場合には、オープンソースです。

3:WKTは人間が読める形式のジオメトリです。私はそれがファイルと同じ値だと思いますが、わかりません。再び..ドット空間のソースコードを確認してください

4:prjファイルは、ジオメトリがどのような投影になっているかを示しています。あなたが何をしたいかによって、再投影する必要があります。 Bing MapsやGoogle Earthのようなものは、例えば、mercator projectionを使用します。 dotspatial projectionsライブラリは優れており、ジオメトリをある投影から別の投影に簡単に変換できます。

私はシェープファイルを使用してかなりの作業をしました。あなたに質問がある場合はお知らせください。

+0

ありがとう!私の更新された質問を、より多くの質問でご覧ください。 :) –

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); 


    } 
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));   
     } 
+0

これは本当にいい答えです:)私はこの解決策をしばらく探していました。場合によってはDotSpatialを使用すると便利ですが、時には少し難しいです。メインページ以外のDotSpatialチュートリアルの良いウェブサイトを知っていますか? – Losbaltica

関連する問題