- BD上的代码:
public static FeatureCollection ReadShapeFile(string pathName)
{
FeatureCollection featureCollection = new FeatureCollection();
GeometryFactory gfactory = GeometryFactory.Default;
ShapefileDataReader dataReader = new ShapefileDataReader(pathName, gfactory);
while (dataReader.Read())
{
Feature feature = new Feature { Geometry = dataReader.Geometry };
int length = dataReader.DbaseHeader.NumFields;
var keys = new string[length];
for (var i = 0; i < length; i++)
{
keys[i] = dataReader.DbaseHeader.Fields[i].Name;
}
feature.Attributes = new AttributesTable();
for (var i = 0; i < length; i++)
{
var val = dataReader.GetValue(i);
string value = val.ToString();
feature.Attributes.Add(keys[i], value);
}
featureCollection.Add(feature);
}
return featureCollection;
}
- 问题:
代码中显示有三个字段
从零开始就会获取到Geometry字段
- 修改方法:
通过dataReader.GetOrdinal(key)获取某一个字段的下标精准获取该字段的值
- 改进后的代码:
/// <summary>
/// NTS读取Shapefile
/// </summary>
/// <param name="pathName"></param>
/// <returns></returns>
public static FeatureCollection ReadShapeFile(string pathName)
{
FeatureCollection featureCollection = new FeatureCollection();
GeometryFactory gfactory = GeometryFactory.Default;
ShapefileDataReader dataReader = new ShapefileDataReader(pathName, gfactory);
while (dataReader.Read())
{
Feature feature = new Feature { Geometry = dataReader.Geometry };
int length = dataReader.DbaseHeader.NumFields;
var keys = new string[length];
for (var i = 0; i < length; i++)
{
keys[i] = dataReader.DbaseHeader.Fields[i].Name;
}
feature.Attributes = new AttributesTable();
foreach (var key in keys)
{
var index=dataReader.GetOrdinal(key);
var val = dataReader.GetValue(index);
string value = val.ToString();
feature.Attributes.Add(key, value);
}
featureCollection.Add(feature);
}
return featureCollection;
}