private void multipolygon2polygon(Geometry geo, ref List<Geometry> polyList)
{
Geometry temGeo = null;
int iGeoCount = geo.GetGeometryCount();
for (int i = 0; i < iGeoCount; i++)
{
temGeo = geo.GetGeometryRef(i);
wkbGeometryType geoType = temGeo.GetGeometryType();
if (geoType == wkbGeometryType.wkbLineString)
{
polyList.Add(geo);
return;
}
if (geoType == wkbGeometryType.wkbMultiPolygon)
{
multipolygon2polygon(temGeo, ref polyList);
}
else
{
int iCount = temGeo.GetGeometryCount();
Geometry mzPoly = geo.Clone();
mzPoly.RemoveGeometry(0);
int iTempCount = mzPoly.GetGeometryCount();
while (iTempCount > 0)
{
mzPoly.RemoveGeometry(0);
iTempCount = mzPoly.GetGeometryCount();
}
mzPoly.AddGeometry(temGeo); ;
polyList.Add(mzPoly);
}
}
}
private void polygon2multipolygon(Geometry SingleGeo, ref Geometry MultiGeo)
{
MultiGeo = null;
MultiGeo = new Geometry(wkbGeometryType.wkbMultiPolygon);
MultiGeo.AddGeometry(SingleGeo);
}
/// <summary>
/// 图层融合
/// </summary>
/// <param name="input">输入图层</param>
/// <param name="dissolve">结果图层</param>
private void dissolve(Layer input, Layer dissolve)
{
try
{
FeatureDefn defn = dissolve.GetLayerDefn();
Geometry multi = new Geometry(wkbGeometryType.wkbMultiPolygon);
Feature inputFea = null;
while ((inputFea = input.GetNextFeature()) != null)
{
Geometry geo = inputFea.GetGeometryRef();
geo.CloseRings();
string wkt = "";
geo.ExportToWkt(out wkt);
multi.AddGeometryDirectly(Geometry.CreateFromWkt(wkt));
}
Geometry union = multi.UnionCascaded();
int iGeoCount = union.GetGeometryCount();
for (int i = 0; i < iGeoCount; i++)
{
string wkt = "";
//union.GetGeometryRef(i).ExportToWkb();
union.GetGeometryRef(i).ExportToWkt(out wkt);
Geometry poly = Geometry.CreateFromWkt(wkt);
Feature fea = new Feature(defn);
fea.SetGeometry(poly);
dissolve.CreateFeature(fea);
}
}
catch (Exception ex)
{
throw new Exception("图层融合异常" + ex.Message);
}
}
参考: