源起
數據處理過程中,發現圓頭的緩衝區會多出來一截,如果用線的緩衝區和另外一條線求交點,那麼求出的交點會跑到線的外側與實際不否,以下代碼是生成平頭緩衝區的代碼。
解決方案
實現平頭緩衝區主要使用IBufferConstruction
接口實現,以下代碼是我的解決思路,供大家參考,如果好用記得給我點贊哈
public static IGeometry buffer(IGeometry pGeometry, double dis)
{
ITopologicalOperator5 topolOperator = pGeometry as ITopologicalOperator5;
topolOperator.Simplify();
//這塊我是地理座標系,輸入的緩衝區距離是10米,需要轉換到度
double distance = ConvertUnit(dis, esriUnits.esriMeters, esriUnits.esriDecimalDegrees);
IGeometry bufferGeometry = FlatBuffer(pGeometry as IPolyline, distance);
return bufferGeometry;
}
private static IGeometry FlatBuffer(IGeometry pGeometry, double dis)
{
IPolyline5 polyline = pGeometry as IPolyline5;
IGeometryBag geoBag = new GeometryBagClass();
geoBag.SpatialReference = pGeometry.SpatialReference;
IGeometryCollection geometryCollection = geoBag as IGeometryCollection;
geometryCollection.AddGeometry(polyline);
IEnumGeometry pInputGeometrys = geometryCollection as IEnumGeometry;
IBufferConstruction pBufferConstruction = new BufferConstructionClass();
IBufferConstructionProperties2 pBufferProps = pBufferConstruction as IBufferConstructionProperties2;
pBufferProps.SideOption = esriBufferConstructionSideEnum.esriBufferFull;
pBufferProps.EndOption = esriBufferConstructionEndEnum.esriBufferFlat;
pBufferProps.UnionOverlappingBuffers = true;
pBufferProps.GenerateCurves = false;
IGeometryCollection outputBuffers = new GeometryBagClass();
pBufferConstruction.ConstructBuffers(pInputGeometrys, dis, outputBuffers);
IPolygon pResultPolygon = new PolygonClass();
ITopologicalOperator2 pTopoOp = pResultPolygon as ITopologicalOperator2;
IEnumGeometry pOutputGeometrys = outputBuffers as IEnumGeometry;
pTopoOp.ConstructUnion(pOutputGeometrys);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pInputGeometrys);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pOutputGeometrys);
return pResultPolygon;
}
附一張效果圖:
可能會遇到的問題
直接引用參考資料1中的代碼,大數據量下可能會遇到如下問題an error occurred during the buffer operation
,這塊我個人認爲產生此問題的原因可能是代碼的寫法不對以及內存沒有及時的釋放造成的,建議參考我上面代碼的寫法。
參考資料: