2013-02-21 6 views
5

मेरे पास Shapefile है जिसमें कई हजार बहुभुज हैं।सी # में एक आकार से WKT निर्यात करने के लिए कैसे?

मुझे इस फ़ाइल से सी # में पढ़ने और WKT formatted तारों की एक सूची आउटपुट करने की आवश्यकता है।

मैंने DotSpatial और "CatFood" ESRI Shapefile Reader पर देखा। मैं या तो आकारफाइल को ठीक से लोड करने के लिए प्राप्त कर सकता हूं, लेकिन मैं यह नहीं समझ सकता कि WKT के रूप में निर्यात कैसे करें।

डॉटस्पाटियल में, केवल एक उदाहरण जो मुझे मिल सकता है WktWriter जो Geometry लेता है। मैं Shape से Geometry प्राप्त करने का तरीका नहीं समझ सका।

क्या ऐसी कोई पुस्तकालय है जो इसके लिए अधिक उपयुक्त है?

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

कारण मैं यह मूल रूप से याद किया है, क्योंकि मैं this sample पीछा कर रहा था, जो fs.ShapeIndicesfs.GetShape() के बजाय का उपयोग करता है:

अद्यतन

mdm20 के जवाब के लिए धन्यवाद, मैं निम्नलिखित लिखने में सक्षम था । यह Shape नहीं है, लेकिन ShapeRange है, जिसे मैं ज्यामिति में परिवर्तित नहीं कर सका।

नए सवाल

  1. मैं fs.IndexMode = true की स्थापना किया जाना चाहिए? क्यों या क्यों नहीं? ऐसा कोई प्रदर्शन या परिणाम प्रभाव प्रतीत नहीं होता है।
  2. fs.GetShape()getAttributes नामक एक बूलियन लेता है। मेरे पास मेरे आकृतियों पर गुण हैं, और ऐसा लगता है कि यह सच या गलत है या नहीं। फिर, किसी भी तरह का प्रदर्शन प्रदर्शन प्रभाव नहीं है। क्या यह उम्मीद है?
  3. उन्हें इस तरह से प्राप्त करके, क्या डब्लूकेटी आकारफाइल में संग्रहीत वास्तविक मूल्यों का प्रतिनिधित्व करता है? या वे किसी भी तरह से बदल रहे हैं? क्या यह dotSpatial से खाते में कोई डिफ़ॉल्ट सेटिंग्स ले रहा है, और क्या मुझे उन्हें बदलने के बारे में चिंतित होना चाहिए?
  4. मैं जिस आकार का आयात कर रहा हूं वह world timezone map है। इसमें एक .prj फ़ाइल होती है। क्या dotSpatial इसे ध्यान में रखता है, और यदि नहीं - क्या मुझे कुछ अतिरिक्त करने की आवश्यकता है?

बहुत धन्यवाद!

उत्तर

4

डॉट्सपेटियल में, आकार वर्ग में टोगोमेट्री विधि है।

/// <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: डब्लूकेटी ज्यामिति का मानव पठनीय पाठ प्रतिनिधित्व है। मुझे लगता है कि यह फ़ाइल के समान मूल्य है, लेकिन मुझे नहीं पता। फिर..डॉट्सपेटियल स्रोत कोड

4: prj फ़ाइल आपको बताती है कि ज्यामिति किस प्रक्षेपण में है। इस पर निर्भर करते हुए कि आप इसके साथ क्या करना चाहते हैं, आपको इसे फिर से प्रोजेक्ट करना पड़ सकता है। बिंग मैप्स और Google धरती जैसी चीजें उदाहरण के लिए एक मर्केटर प्रक्षेपण का उपयोग करती हैं। डॉट्सपेटियल अनुमान पुस्तकालय अच्छा है और ज्यामिति को एक प्रक्षेपण से दूसरे में बदलने में आसान बनाता है।

मैंने आकारफाइल के साथ काफी काम किया है .. यदि आपके पास और प्रश्न हैं तो मुझे बताएं।

+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

यह वाकई अच्छा जवाब है :) मैं थोड़ी देर के लिए इस समाधान की तलाश में था। कुछ मामलों में डॉटस्पाटियल का उपयोग करना बहुत उपयोगी है लेकिन कभी-कभी थोड़ा मुश्किल होता है। क्या आप मुख्य पृष्ठ के अलावा अच्छे डॉटस्पैटियल ट्यूटोरियल वाले किसी भी वेबसाइट को जानते हैं? – Losbaltica

संबंधित मुद्दे

 संबंधित मुद्दे