2013-02-21 27 views
5

Tôi có một số Shapefile có chứa vài nghìn đa giác.Làm thế nào để xuất WKT từ một Shapefile trong C#?

Tôi cần đọc từ tệp này trong C# và xuất danh sách các chuỗi WKT formatted.

Tôi đã xem DotSpatial"CatFood" ESRI Shapefile Reader. Tôi có thể nhận được hoặc để tải shapefile tốt, nhưng tôi không thể tìm ra cách sau đó xuất khẩu như WKT.

Trong DotSpatial, các ví dụ duy nhất tôi có thể tìm thấy sử dụng số WktWriter chụp Geometry. Tôi không thể tìm ra cách để có được một Geometry từ một Shape.

Có thư viện nào phù hợp hơn cho điều này không?

Cập nhật

Nhờ câu trả lời mdm20, tôi đã có thể viết như sau:

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

Lý do tôi bỏ lỡ nó ban đầu là vì tôi đang theo dõi this sample, trong đó sử dụng fs.ShapeIndices thay vì fs.GetShape() . Điều đó trả về không phải là Shape, nhưng là ShapeRange, mà tôi không thể chuyển đổi thành hình học.

Câu hỏi mới

  1. Tôi có nên được thiết lập fs.IndexMode = true? Tại sao hay tại sao không? Nó dường như không có bất kỳ hiệu suất hoặc kết quả nào.
  2. fs.GetShape() có boolean được gọi là getAttributes. Tôi có các thuộc tính về hình dạng của tôi, và họ dường như đi qua cho dù điều này được đặt đúng hay sai. Một lần nữa, không có tác động hiệu suất đáng chú ý nào cả. Điều đó có được mong đợi không?
  3. Bằng cách nhận chúng theo cách này, WKT có đại diện cho các giá trị thực được lưu trữ trong shapefile không? Hay chúng được biến đổi theo bất kỳ cách nào? Có phải nó đang lấy bất kỳ cài đặt mặc định nào từ dotSpatial vào tài khoản và tôi có nên lo lắng về việc thay đổi chúng không?
  4. Shapefile tôi đang nhập là world timezone map. Nó chứa tệp .prj. DotSpatial có tính đến điều này, và nếu không - tôi có cần phải làm gì thêm không?

Rất cám ơn!

Trả lời

4

Trong DotSpatial, lớp Hình dạng có phương pháp 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); 
} 

Sửa

tôi đã chỉ được sử dụng các công cụ dotspatial cho dự báo, vì vậy tôi không thể thực sự giúp bạn quá nhiều.

1-2: Không chắc chắn. Mã nguồn là mã nguồn mở nếu bạn muốn xem và xem họ làm gì

3: WKT là biểu diễn văn bản có thể đọc được của con người. Tôi cho rằng nó có cùng giá trị với tập tin, nhưng tôi không biết. Lần nữa..kiểm tra mã nguồn dotspatial

4: Tệp prj cho bạn biết hình chiếu là gì. Tùy thuộc vào những gì bạn muốn làm với nó, bạn có thể phải dự án lại nó. Ví dụ như Bing Maps và Google Earth sử dụng phép chiếu mercator. Thư viện dự báo dotspatial là tốt và làm cho nó dễ dàng để chuyển đổi hình học từ một chiếu sang khác.

Tôi đã thực hiện khá nhiều công việc với shapefiles .. hãy cho tôi biết nếu bạn có thêm câu hỏi.

+0

Cảm ơn! Vui lòng xem câu hỏi được cập nhật của tôi ... với nhiều câu hỏi hơn. :) –

1

thử điều này:

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

Đầu tiên mở shapefile và sau đó nhận được tính năng của nó hình học cơ bản .......

 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

Đó là câu trả lời thực sự tốt đẹp :) Tôi đã tìm kiếm giải pháp này trong một thời gian. Trong một số trường hợp sử dụng DotSpatial rất hữu ích nhưng đôi khi hơi phức tạp một chút. Bạn có biết bất kỳ trang web nào có hướng dẫn DotSpatial tốt hơn trang chính không? – Losbaltica

Các vấn đề liên quan