C# GDAL检查shp的自重叠

1 篇文章 0 订阅
        /// <summary>
        /// 同一shp检查重叠
        /// </summary>
        /// <param name="file"></param>
        /// <param name="savePath"></param>
        ///如果文件名字符串结尾为奇数个中文字符会乱码,目前处理是CopyLayer到临时文件,传入临时文件名
        public static void ShpOverlap(string file, string savePath)
        {
            string tempPath1 = System.Windows.Forms.Application.StartupPath + @"\temp1.shp";//临时文件保存当前要素
            string tempPath2 = System.Windows.Forms.Application.StartupPath + @"\temp2.shp";//临时文件保存除当前要素外其他要素
            string suffix = savePath.Substring(savePath.LastIndexOf('.') + 1, savePath.Length - savePath.LastIndexOf('.') - 1);
            if (suffix != "shp")
            {
                savePath = savePath + ".shp";
            }
            string saveName = savePath.Substring(savePath.LastIndexOf('\\') + 1, savePath.LastIndexOf('.') - savePath.LastIndexOf('\\') - 1);
            OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "Yes");
            OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", "GBK");
            string pszDriverName = "ESRI Shapefile";
            OSGeo.OGR.Ogr.RegisterAll();

            OSGeo.OGR.Driver poDriverResult = OSGeo.OGR.Ogr.GetDriverByName(pszDriverName);
            if (poDriverResult == null)
                MessageBox.Show("Driver Error");
            OSGeo.OGR.DataSource poDSResult;
            if (File.Exists(savePath))
            {
                poDriverResult.DeleteDataSource(savePath);
            }
            poDSResult = poDriverResult.CreateDataSource(savePath, null);
            if (poDSResult == null)
                MessageBox.Show("DataSource Creation Error");

            //创建层Layer
            OSGeo.OGR.Layer poLayerResult = null;

            OSGeo.OGR.Driver poDriverTemp1 = OSGeo.OGR.Ogr.GetDriverByName(pszDriverName);
            if (poDriverTemp1 == null)
                MessageBox.Show("Driver Error");
            OSGeo.OGR.DataSource poDSTemp1;
            if (File.Exists(tempPath1))
            {
                poDriverTemp1.DeleteDataSource(tempPath1);
            }
            poDSTemp1 = poDriverTemp1.CreateDataSource(tempPath1, null);
            if (poDSTemp1 == null)
                MessageBox.Show("DataSource Creation Error");
            OSGeo.OGR.Layer poLayerTemp1 = null;

            OSGeo.OGR.Driver poDriverTemp2 = OSGeo.OGR.Ogr.GetDriverByName(pszDriverName);
            if (poDriverTemp2 == null)
                MessageBox.Show("Driver Error");
            OSGeo.OGR.DataSource poDSTemp2;
            if (File.Exists(tempPath2))
            {
                poDriverTemp2.DeleteDataSource(tempPath2);
            }
            poDSTemp2 = poDriverTemp2.CreateDataSource(tempPath2, null);
            if (poDSTemp2 == null)
                MessageBox.Show("DataSource Creation Error");
            OSGeo.OGR.Layer poLayerTemp2 = null;
            //ShpCopy(file1, tempPath);
            string filePath = file;
            int layerIndex = 0;
            OSGeo.OGR.Driver poDriverGetGeometry = null;
            DataSource poDSGetGeometry = null;
            OSGeo.OGR.Layer poLayerGetGeometry = null;
            poDriverGetGeometry = OSGeo.OGR.Ogr.GetDriverByName(pszDriverName);
            if (poDriverGetGeometry == null)
                MessageBox.Show("Driver Error");
            poDSGetGeometry = poDriverGetGeometry.Open(filePath, 1);
            poLayerGetGeometry = poDSGetGeometry.GetLayerByIndex(layerIndex);
            string poLayerGetGeometryName = poLayerGetGeometry.GetName();

            poLayerResult = poDSResult.CreateLayer(saveName, poLayerGetGeometry.GetSpatialRef(), poLayerGetGeometry.GetGeomType(), null);
            if (poLayerResult == null)
                MessageBox.Show("Layer Creation Failed");
            poLayerTemp1 = poDSTemp1.CreateLayer(tempPath1, poLayerGetGeometry.GetSpatialRef(), poLayerGetGeometry.GetGeomType(), null);
            if (poLayerTemp1 == null)
                MessageBox.Show("Layer Creation Failed");
            poLayerTemp2 = poDSTemp2.CreateLayer(tempPath2, poLayerGetGeometry.GetSpatialRef(), poLayerGetGeometry.GetGeomType(), null);
            if (poLayerTemp2 == null)
                MessageBox.Show("Layer Creation Failed");
            //poDSResult.Dispose();
            //poDSResult = poDriverResult.Open(savePath, 1);
            //poLayerResult = poDSResult.GetLayerByIndex(0);
            Feature poFeatureGetGeometry = null;
            string[] p = new string[4] { "SKIP_FAILURES=YES", "PROMOTE_TO_MULTI=YES", "INPUT_PREFIX=1", "METHOD_PREFIX=2" };
            while ((poFeatureGetGeometry = poLayerGetGeometry.GetNextFeature()) != null)
            {
                poLayerTemp1 = null; poLayerTemp2 = null;
                int poFidGetGeometryFid = (int)poFeatureGetGeometry.GetFID();
                //string sql = "SELECT * FROM \"" + poLayerGetGeometryName+"\"";
                string sql = "select * from \"" + poLayerGetGeometryName + "\" where FID =" + poFidGetGeometryFid;
                poLayerTemp1 = poDSGetGeometry.ExecuteSQL(sql, null, null); 
                long ss = poLayerGetGeometry.GetFeatureCount(0);
                poLayerTemp2 = poDSGetGeometry.ExecuteSQL("select * from \"" + poLayerGetGeometryName + "\" where NOT Fid =" + poFidGetGeometryFid, null, null);
                poLayerTemp1.Intersection(poLayerTemp2, poLayerResult, p, null, null); 
                //poLayerTemp = null; poLayerTemp2 = null;
                poDSGetGeometry.ReleaseResultSet(poLayerTemp1); poDSGetGeometry.ReleaseResultSet(poLayerTemp2);
                poLayerGetGeometry.SetNextByIndex(poFidGetGeometryFid+1);
            }

            poLayerTemp1.Dispose();
            poDSTemp1.Dispose();
            poDriverTemp1.Dispose();
            poLayerTemp2.Dispose();
            poDSTemp2.Dispose();
            poDriverTemp2.Dispose();

            poLayerResult.SyncToDisk();
            poLayerResult.Dispose();
            poDSResult.Dispose();
            poDriverResult.Dispose();

            poLayerGetGeometry.Dispose();
            poDSGetGeometry.Dispose();
            poDriverGetGeometry.Dispose();

        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值