arcgis engine 缓冲区

三调的项目中,由于二调时调查的各种地物为线状,而在实际生产生活中(包括自然资源的调查过程中)都会有弊端,因而三调过程中要求将曾经的线状地物扩展为面状区域,一般来说手动矢量化可以最大的程度上保证精度但却浪费人力,简单的处理方法就是对线状地物进行缓冲区分析。使用arcgis engine中的gp工具在缓冲分析的过程中,设置缓冲区 的end_type为flat时程序老是闪退,因而自己根据arcobjects的文档中,利用IBufferConstruct接口,照着arcmap中的gp工具重写了一下,代码如下:

private List<IGeometry> CreateBuffer(IFeatureLayer bufferLayer)
{

//基本逻辑:
//首先创建与输入图层具有相同空间参考的shp文件
//通过IBufferConstruction接口来实现平头缓冲区、按字段设置缓冲距离
//QI获取图层内所有要素,遍历要素放入GeometryCollection(容器)中,bufferConstruction实现接口中的相应方法
//使用IBufferConstruction中的ConstructBuffersByDistances2 方法对要素逐个创建缓冲区
//要素缓冲完之后,将要素写入shp文件中

 
 

IBufferConstruction bufferConstruct = new BufferConstructionClass();
IBufferConstructionProperties bufferProper = bufferConstruct as IBufferConstructionProperties;

 
 


//获取要素图层中的所有要素
IFeatureClass pFeatureClass = bufferLayer.FeatureClass;
//QI获取Geometry
IQueryFilter filter = new QueryFilterClass();
filter.WhereClause = "";
IFeatureCursor pFeatureCursor = pFeatureClass.Search(filter, false);
IFeature pFeature = pFeatureCursor.NextFeature();
IEnumGeometry originalGeometryEnum;
IEnumGeometry resultGeometryEnum;
//缓冲区输出要素,并使用List泛型,将几何要素放入list中
IGeometry resultSingleGeo = null;
List<IGeometry> resultGeoList = new List<IGeometry>();

 
 

IGeometryCollection originalGeometryBag = new GeometryBagClass();
IGeometryCollection outBufferGeometryBag = new GeometryBagClass();
string fieldName = cboBufferField.SelectedItem.ToString();
int fieldIndex = pFeatureClass.FindField(fieldName);
//存放字段值的IDoubleArray
IDoubleArray fieldValue = new DoubleArray();
while (pFeature != null)
{
//将要素放入容器内,获取要素的某个字段所有值,放入doublearray容器中
IGeometry polyline = pFeature.ShapeCopy;
originalGeometryBag.AddGeometry(polyline);
double fieldSingleValue = (double)pFeature.get_Value(fieldIndex);

 
 

Console.WriteLine(fieldSingleValue); //测试使用
fieldValue.Add(fieldSingleValue);
//循环将要素的属性值加入IDoubleArray中
pFeature = pFeatureCursor.NextFeature();
}

 
 

originalGeometryEnum = originalGeometryBag as IEnumGeometry;
if (originalGeometryEnum != null)
{
//设置缓冲选项
//设置平头缓冲
bufferProper.EndOption = esriBufferConstructionEndEnum.esriBufferFlat;
//缓冲区是否保留重叠
bufferProper.UnionOverlappingBuffers = true;
bufferConstruct.ConstructBuffersByDistances2(originalGeometryEnum, fieldValue, outBufferGeometryBag);
if (outBufferGeometryBag != null)
{
resultGeometryEnum = outBufferGeometryBag as IEnumGeometry;
if (resultGeometryEnum != null)
resultSingleGeo = resultGeometryEnum.Next();
//开始单个要素写入
while (resultSingleGeo != null)
{
resultGeoList.Add(resultSingleGeo);
resultSingleGeo = resultGeometryEnum.Next();
}

}
return resultGeoList;
}
else
{
MessageBox.Show("程序错误!");
return null;
}

}

 

猜你喜欢

转载自www.cnblogs.com/mrmaisg/p/9032601.html
今日推荐