我有一个包含数千个多边形的Shapefile。
我需要在C#中读取此文件并输出WKT formatted字符串列表。
我查看了DotSpatial和"CatFood" ESRI Shapefile Reader。我可以得到正好加载shapefile,但我无法弄清楚如何导出为WKT。
在DotSpatial中,我能找到的唯一示例使用WktWriter
,其中Geometry
。我无法弄清楚如何从Geometry
获取Shape
。
是否有更合适的库?
更新
感谢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()
的{{3}}。返回的不是Shape
,而是ShapeRange
,我无法将其转换为几何图形。
新问题
fs.IndexMode = true
吗?为什么或者为什么不?它似乎没有任何性能或结果影响。fs.GetShape()
采用名为getAttributes
的布尔值。我确实对我的形状有属性,并且它们似乎是通过设置是真还是假来实现的。同样,无论如何都没有明显的性能影响。这是预期的吗?非常感谢!
答案 0 :(得分: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);
}
修改强>
我只使用了圆形空间的东西进行投影,所以我无法真正帮助你。
1-2:不确定。如果您想查看并查看他们的操作,代码是开源的
3:WKT是几何体的人类可读文本表示。我会假设它与文件的值相同,但我不知道。再次..查看点空间源代码
4:prj文件告诉您几何体所处的投影。根据您要对其进行的操作,您可能需要重新投影它。例如,Bing Maps和Google Earth之类的东西使用墨卡托投影。点空间投影库很好,可以很容易地将几何体从一个投影转换为另一个投影。
我已经对shapefile做了很多工作..如果你有更多问题,请告诉我。
答案 1 :(得分: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);
}
答案 2 :(得分:1)
首先打开shapefile,然后获得它的特征基本几何.......
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));
}