gdal 多面转换和图层融合(dissolve)

        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);
            }
        }

参考:

https://www.cnpython.com/qa/148110

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值