public class clsSimplyfyPolygon
{
//对指定图元,按指定buffer距离做抽稀
public IPolygon doPolygonSimpled(IGeometry pGeometry, double dblDistance, int maxPointCount)
{
IPolygon pPolygon;
ISegmentCollection pSegCol;
IGeometryCollection pGeoCol;
IPointCollection pntDoneCol = new MultipointClass();
// pGeometry = polygonFeature.Shape;
pPolygon = (IPolygon)pGeometry;
pSegCol = (ISegmentCollection)pPolygon;
pGeoCol = (IGeometryCollection)pPolygon;
for (int i = 0; i < pGeoCol.GeometryCount; i++)
{
IGeometry subGeometry;
IPointCollection subPointCol;
subGeometry = pGeoCol.get_Geometry(i);
subPointCol = (IPointCollection)subGeometry;
pntDoneCol.AddPointCollection(doSimpledPointCollection(ref subPointCol, dblDistance, maxPointCount));
}
return pPolygon;
}
//循环抽稀,ipointCollection
public IPointCollection doSimpledPointCollection(ref IPointCollection pntCol, double dblDistance, int maxCount)
{
if (pntCol.PointCount > maxCount)
{
IPoint pntStart;
IPoint pntMid;
IPoint pntEnd;
ArrayList arryDelIndexs = new ArrayList();
arryDelIndexs.Clear();
int modby3 = pntCol.PointCount % 3;
int maxPointCount = pntCol.PointCount - modby3;
for (int i = 0; i < maxPointCount; i = i + 3)
{
if ((i + 2) < pntCol.PointCount)
{
pntStart = pntCol.get_Point(i);
pntMid = pntCol.get_Point(i + 1);
pntEnd = pntCol.get_Point(i + 2);
if (getMidDistanceFromThreePoints(pntStart, pntMid, pntEnd) < dblDistance)
{
arryDelIndexs.Add(i + 1);
//pntCol.RemovePoints(i + 1, 1);
//doSimpledPointCollection(ref pntCol, dblDistance, maxCount);
}
}
}
if (arryDelIndexs.Count != 0)
{
for (int j = 0; j < arryDelIndexs.Count; j++)
{
pntCol.RemovePoints(Convert.ToInt32(arryDelIndexs[j]) - j, 1);
}
doSimpledPointCollection(ref pntCol, dblDistance, maxCount);
}
if (pntCol.PointCount > maxCount)
{
doSimpledPointCollection(ref pntCol, dblDistance + dblDistance, maxCount);
}
}
return pntCol;
}
//计算三点中,中间点到另外两点的直线距离
public double getMidDistanceFromThreePoints(IPoint pntStart, IPoint pntMid, IPoint pntEnd)
{
double A = pntStart.Y - pntEnd.Y;
double B = pntEnd.X - pntStart.X;
double C = pntStart.X * pntEnd.Y - pntEnd.X * pntStart.Y;
double distance = Math.Abs(A * pntMid.X + B * pntMid.Y + C) / Math.Sqrt(A * A + B * B);
return distance;
}
}
}