2016-02-03 5 views
2

Мне нужно загрузить шейп-файл и сохранить все фигуры в базе данных. Я провел два дня, чтобы найти хорошую библиотеку, но до сих пор я не нашел полного решения.Parse shapefile (shp file) без файлов shx и dbf

Я пытаюсь проанализировать файл с помощью библиотеки «Catfood.Shapefile», но ему нужен еще два файла .shp-файла, которого у меня нет.

Мне удалось реализовать код на Java, но теперь мне нужно его повторно реализовать в C#.

, пожалуйста, дайте мне совет!

+0

Эти файлы * необходимы *. Файл формы не является автономным файлом. На самом деле это комбинация файлов формы, индекса и метаданных. Без них у вас есть только куча точек без значимых метаданных. Либо найдите отсутствующие файлы шейп-файла и добавьте их в ту же папку, либо проверьте, можете ли вы заставить библиотеку работать без них. Однако без метаданных, как вы собираетесь сопоставлять фигуры с любыми другими данными и использовать их? –

+0

, вы знаете, на Java У меня есть эта строка \t prefs = new ValidationPreferences(); \t \t \t int avl = fis.available(); \t \t \t prefs.setMaxNumberOfPointsPerShape (16650); \t \t \t shapeFileReader = новый ShapeFileReader (fis, prefs); и у меня есть эти два файла – Mahdi

+0

Тогда в чем вопрос? Почему бы вам не использовать эти файлы с кодом C#? –

ответ

0

Ok, Shp file - файл дизайна скважины, который вы можете увидеть описание here. shx и dbf добавляют некоторую помощь для разбора файла shp. Я добавляю класс в Catfood.Shapefile, его имя - ShpParser. Ввод этого класса - это только файл Shp. он не нуждается в файле shx и dbf для извлечения фигур в файле.

если метаданные пустые, два класса бросить исключение, убедитесь, что вы удалите исключение метаданных из следующего метода:

1- Формы конструктор 2- ShapeFactory.ParseShape

и здесь код ShpParser

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Data.OleDb; 
using System.IO; 
using System.Text; 

namespace Catfood.Shapefile 
{ 
/// <summary> 
/// 
/// </summary> 
public class ShpParser : IDisposable, IEnumerator<Shape>, IEnumerable<Shape> 
{ 
    private bool _disposed; 
    private bool _opened; 
    private int _currentIndex; 
    private int _count; 
    private RectangleD _boundingBox; 
    private ShapeType _type; 
    private int _currentPosition; 
    private FileStream _mainStream; 
    private Header _mainHeader; 

    /// <summary> 
    /// 
    /// </summary> 
    public ShpParser() 
    { 
     _currentIndex = -1; 
     _currentPosition = 0; 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="path"></param> 
    public ShpParser(string path) 
     : this() 
    { 
     Open(path); 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="path"></param> 
    private void Open(string path) 
    { 
     if (_disposed) 
     { 
      throw new ObjectDisposedException("ShpParser"); 
     } 

     if (string.IsNullOrEmpty(path)) 
     { 
      throw new ArgumentNullException("path"); 
     } 

     if (!File.Exists(path)) 
     { 
      throw new FileNotFoundException("shp file not found", path); 
     } 

     _mainStream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read); 

     if (_mainStream.Length < Header.HeaderLength) 
     { 
      throw new InvalidOperationException("Shapefile main file does not contain a valid header"); 
     } 

     // read in and parse the headers 
     var headerBytes = new byte[Header.HeaderLength]; 
     _mainStream.Read(headerBytes, 0, Header.HeaderLength); 
     _mainHeader = new Header(headerBytes); 
     _type = _mainHeader.ShapeType; 
     _boundingBox = new RectangleD(_mainHeader.XMin, _mainHeader.YMin, _mainHeader.XMax, _mainHeader.YMax); 

     _currentPosition = Header.HeaderLength; 

     _count = _mainHeader.FileLength * 2; // FileLength return the size of file in words (16 bytes) 
     _opened = true; 

    } 
    #region IDisposable Members 
    /// <summary> 
    /// Close the Shapefile. Equivalent to calling Dispose(). 
    /// </summary> 
    public void Close() 
    { 
     Dispose(); 
    } 



    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    private void Dispose(bool canDisposeManagedResources) 
    { 
     if (!_disposed) 
     { 
      if (canDisposeManagedResources) 
      { 
       if (_mainStream != null) 
       { 
        _mainStream.Close(); 
        _mainStream = null; 
       } 
      } 
      _disposed = true; 
      _opened = false; 
     } 
    } 
    #endregion 

    public bool MoveNext() 
    { 
     if (_disposed) throw new ObjectDisposedException("ShpParser"); 
     if (!_opened) throw new InvalidOperationException("ShpParser not open."); 

     if (_currentPosition < (_count - 1)) 
     { 
      // try to read the next database record 
      return true; 
     } 
     else 
     { 
      // reached the last shape 
      return false; 
     } 
    } 

    public void Reset() 
    { 
     if (_disposed) throw new ObjectDisposedException("ShpParser"); 
     if (!_opened) throw new InvalidOperationException("ShpParser not open."); 

     _currentIndex = -1; 
    } 

    public Shape Current 
    { 
     get 
     { 
      if (_disposed) throw new ObjectDisposedException("ShpParser"); 
      if (!_opened) throw new InvalidOperationException("ShpParser not open."); 


      //get recordheader; 
      var recordheader = new byte[8]; 


      _mainStream.Read(recordheader, 0, recordheader.Length); 


      int contentOffsetInWords = EndianBitConverter.ToInt32(recordheader, 0, ProvidedOrder.Big); 
      int contentLengthInWords = EndianBitConverter.ToInt32(recordheader, 4, ProvidedOrder.Big); 


      _mainStream.Seek(_currentPosition , SeekOrigin.Begin); // back to header of record 
      int bytesToRead = (contentLengthInWords * 2) + 8; 
      byte[] shapeData = new byte[bytesToRead]; 
      _currentPosition += bytesToRead; 
      _mainStream.Read(shapeData, 0, bytesToRead); 
      return ShapeFactory.ParseShape(shapeData , null); 
     // return null; 
     } 
    } 

    object IEnumerator.Current 
    { 
     get 
     { 
      if (_disposed) throw new ObjectDisposedException("ShpParser"); 
      if (!_opened) throw new InvalidOperationException("ShpParser not open."); 

      return this.Current; 
     } 
    } 

    public IEnumerator<Shape> GetEnumerator() 
    { 
     return (IEnumerator<Shape>)this; 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return (System.Collections.IEnumerator)this; 
    } 
} 

}

, как вы можете использовать ShpParser

using (var shapefile = new ShpParser("my.shp") 
{ 
    foreach (Shape shape in shapefile) 
    { 
     Console.WriteLine("ShapeType: {0}", shape.Type); 
    } 
}