admin管理员组文章数量:1666734
/// <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();
}
版权声明:本文标题:C# GDAL检查shp的自重叠 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1730076976a1221906.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论