- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要上传一个 shapefile 并将所有形状存储在数据库中。我花了两天时间找到了一个好的图书馆,但到目前为止我还没有找到任何完整的解决方案。
我尝试使用“Catfood.Shapefile”库解析该文件,但除了我没有的 .shp 文件之外,它还需要另外两个文件。
我设法用 Java 实现了一段代码,但现在我需要用 C# 重新实现它。
请给我一些建议!
最佳答案
好的,Shp文件是一个很好的设计文件,你可以看到描述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);
}
}
关于c# - 解析没有 shx 和 dbf 文件的 shapefile(shp 文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35180349/
我想将我的表导出为 DBF 格式,所以我想知道是否可以将多个表导出到一个 DBF 文件中。据我所知,一个 DBF 文件可以包含在表中。 最佳答案 一个dbf 文件包含一个表。同样,一个备忘录文件包含一
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
关于 .DBF 文件的第一个字节以及如何检测使用的 xbase 版本(即文件其余部分的格式),我能编译的最全面的列表是: 字节 0 ------------ x xxx x 001 = 0x?1 未使
我的目录中有很多文件,例如 ['FredrikstadAvst1.dbf', 'FredrikstadAvst2.dbf', ...]。我想编写一个 Python 脚本将这些文件连接到一个新的 "*.
首先,dbf 模块很棒。我一直在使用它并取得了巨大的成功。 我正在尝试在网络共享上打开一个 dbf 文件,它是一个只读文件系统。当我尝试像这样打开它时,我收到一条错误消息,指出 .dbf 文件是只读的
我被赋予了一项模棱两可的任务,即从各种 Visual FoxPro 表格中自动提取数据。 有几对.DBF 和.CDX 文件。使用 Python dbf包,我似乎可以和他们一起工作。我有两个文件,ABC
在Delphi for Win32中,如何在没有BDE的情况下以 native 方式读写dbf文件?我知道网络上有一些可用的组件,但我从未使用过其中任何一个,所以我不知道该选择哪个(如果有的话)。 最
我试图使用 jdbc 在 dbf 表上进行插入,但每次执行系统时都会出现此错误: Exception in thread "main" java.sql.SQLException: [Microsof
同事(真的!)试图在主 prod DG 实例上创建 dbf。这有效(虽然文件随后被删除),但 db_file_convert 没有设置文件位置辅助,因此创建失败并且在 $OH/dbs 中创建“丢失”d
我已经尝试了两个模块来读取工作正常的 dbf 文件(dbf 和 dbfpy),但我必须逐条记录地读取数据库以查找内容。这对于大型数据库来说真的很慢。是否有任何模块可以处理查询表或使用 CDX 索引?
我正在将 dbf 文件批量导入到 sqlite。我使用 dbf 模块在 python 中编写了一个简单的脚本 http://dbfpy.sourceforge.net/ 。除了少数情况外,它工作正常并
我知道 .dbf 数据库在单独的 .dbt 文件中保存大于 254 个字符的(文本)字段,将它们与 M 备注字段链接。 我有一个遗留数据库,我可以清楚地看到它包含一个规定(最大)长度为 255 个字符
我想自动检测DBF的编码,但是DBF文件的结构不包含DBF文件头中的任何信息。我曾经使用 DBF 查看器,它以正确的编码信息打开。所以我不确定他们是如何实现的。 我研究了 DBF 文件的结构并且有一个
我从 DBF 文件中获取数据并将其放入数据表中,问题是我只想获取不同的数据,例如: Column1 a b c b a DataTable 应该只填充: Column1 a
我从 DBF 文件中获取数据并将其放入数据表中,问题是我只想获取不同的数据,例如: Column1 a b c b a DataTable 应该只填充: Column1 a
今天早上我到达办公室时,我们的 Oracle 10.2 服务器磁盘空间不足。仔细检查后,我发现每分钟生成一次大约 1 到 4 个或更多 .dbf 文件(例如 1_1278092_658232789.d
我使用dbf 0.95.004 ,我需要从表中选择一个字段。 Example , docs import dbf table = dbf.Table('my.dbf').open() records
代码: #!/usr/bin/python db = dbf.Dbf("MEST2.DBF") #LINE TO UPDATE: rec = db[0] #PROEST IS A field of m
我现在使用 ESRI shapefile 格式,但在更改/编辑数据库字段大小时遇到了一些问题。我创建了一个 200 长度/大小的字段,现在我希望它只有 80 长度/大小(空间和其他改进)。 但是我
我有这样的事情: from dbfpy import dbf import random db = dbf.Dbf('DMWWGS84/DMAWGS84.dbf',new=False) db.addF
我是一名优秀的程序员,十分优秀!