using ESRI.ArcGIS.Carto ;
using ESRI.ArcGIS.DataSourcesGDB ;
using ESRI.ArcGIS.esriSystem ;
using ESRI.ArcGIS.Geodatabase ;
using ESRI.ArcGIS.Geometry ;
using ESRI.ArcGIS.Geoprocessing ;
//using IDEParameter;
using KGIS.Framework.AE ;
using KGIS.Framework.AE.Enum ;
using KGIS.Framework.AE.GaussCalculate ;
using KGIS.Framework.AE.GPHelper ;
using KGIS.Framework.DBOperator ;
using KGIS.Framework.ThreadManager ;
using KGIS.Framework.Utils ;
using Kingo.PluginServiceInterface ;
using Kingo.PluginServiceInterface.Model ;
using System ;
using System.Collections.Generic ;
using System.Data ;
using System.IO ;
using System.Linq ;
using System.Runtime.InteropServices ;
namespace IDGForNDBG
{
public class DLTB_IDGForThreadHelper : BaseIDG
{
private IFeatureClass BGFeatureClass = null ;
private IFeatureLayer JCFeatureLayer = null ;
private string TempDbPath = string . Empty ;
IWorkspace pOutWork = null ;
private IDGParameter Parm = null ;
private List < string > DataPaths = new List < string > ( ) ;
public void ExecuteForThread ( IDGParameter pIdgParm )
{
Parm = pIdgParm ;
IFeature f = null ;
IFeatureCursor pCursor = null ;
IFeatureClassAPI fcAPI = null ;
GPParamClass paramClass = new GPParamClass ( ) ;
List < ThreadParam > _ threadList = new List < ThreadParam > ( ) ;
try
{
DateTime StartTime = DateTime . Now ;
Console . WriteLine ( $"Log:开始生成地类图斑更新数据..." ) ;
DLTB_IDGForThreadHelper2 helper = new DLTB_IDGForThreadHelper2 ( pIdgParm ) ;
DBLayerSourceHelper LaySourceHelper = helper . OpenDB ( pIdgParm . PrjInfo ) ;
#region 属性批量赋值
IDGForNDBG . Helper . AttributeBatchAssignmentHelper Attruhelper = new IDGForNDBG . Helper . AttributeBatchAssignmentHelper ( ) ;
Attruhelper . AttributeBatchAssignment ( LaySourceHelper . JcTbLayer , LaySourceHelper . BgTbLayer , pIdgParm . PrjInfo . CODE , pIdgParm . PrjInfo . ProjDir ) ;
# endregion
ITable dltbgxTb = LaySourceHelper . GxTbLayer . FeatureClass as ITable ;
IQueryFilter delFilter = new QueryFilterClass ( ) ;
delFilter . WhereClause = "1=1" ;
dltbgxTb . DeleteSearchedRows ( delFilter ) ;
ITable dltbgxgcTb = LaySourceHelper . GxgcTBLayer . FeatureClass as ITable ;
dltbgxgcTb . DeleteSearchedRows ( delFilter ) ;
string TempDir = CreateTempDB ( pIdgParm . PrjInfo . ProjDir + "\\DLTB" ) ;
//string TempDir = CreateTempDB($"{pIdgParm.PrjInfo.CODE}\\DLTB");
string _ TempDbPath = System . IO . Path . Combine ( TempDir , "TempGDB.gdb" ) ;
IQueryFilter filter = new QueryFilterClass ( ) ;
filter . SubFields = "ZLDWDM" ;
pCursor = LaySourceHelper . BgTbLayer . FeatureClass . Search ( filter , true ) ;
int idxZLDW = LaySourceHelper . BgTbLayer . FeatureClass . FindField ( "ZLDWDM" ) ;
List < string > XzqList = new List < string > ( ) ;
while ( ( f = pCursor . NextFeature ( ) ) ! = null )
{
string zl = f . Value [ idxZLDW ] . ToTrim ( ) ;
if ( zl . Length ! = 1 9 ) continue ;
string xzqdm = zl . Substring ( 0 , 9 ) ;
if ( ! XzqList . Contains ( xzqdm ) )
{
XzqList . Add ( xzqdm ) ;
}
}
LayerCfg layerInfo = null ;
if ( pIdgParm . PrjInfo ! = null & & ! string . IsNullOrWhiteSpace ( pIdgParm . PrjInfo . TempData ) )
{
byte [ ] contentArray = Convert . FromBase64String ( pIdgParm . PrjInfo . TempData ) ;
string LayerCfg = System . Text . Encoding . Default . GetString ( contentArray ) ;
layerInfo = KGIS . Framework . Utils . SerializeAPI . DeserializeToObject < LayerCfg > ( LayerCfg ) ;
}
ThreadParam para = new ThreadParam ( ) ;
//para.Layers = layerInfo.GetAllItem();
//para.Layers = new List<string>();
para . StrJcTbLayer = GeoDBAPI . SerialzedPersist ( LaySourceHelper . JcTbLayer ) ;
para . StrBgTbLayer = GeoDBAPI . SerialzedPersist ( LaySourceHelper . BgTbLayer ) ;
int ProNum = Environment . ProcessorCount - 3 ;
if ( ProNum < 1 )
ProNum = 1 ;
//ProNum = XzqList.Count;
ProNum = 1 ;
int ThreadNum = XzqList . Count / ProNum ;
if ( XzqList . Count < ProNum )
ThreadNum = 1 ;
for ( int i = 0 ; i < ProNum ; i + + )
{
List < string > tempBsmList = new List < string > ( ) ;
if ( i < ProNum - 1 )
{
tempBsmList = XzqList . GetRange ( i * ThreadNum , ThreadNum ) ;
}
else
{
tempBsmList = XzqList . GetRange ( i * ThreadNum , XzqList . Count - i * ThreadNum ) ;
}
string _ ThreadName = string . Empty ;
List < string > _ Codes = new List < string > ( ) ;
foreach ( var xzq in tempBsmList )
{
_ ThreadName + = xzq . Replace ( Parm . PrjInfo . CODE , "" ) ;
_ Codes . Add ( xzq ) ;
}
if ( ProNum = = 1 )
{
_ Codes . Clear ( ) ;
_ ThreadName = "ALL" ;
}
_ threadList . Add ( new ThreadParam ( )
{
ThreadName = _ ThreadName ,
Codes = _ Codes ,
ProjInfo = pIdgParm . PrjInfo ,
StrJcTbLayer = para . StrJcTbLayer ,
StrBgTbLayer = para . StrBgTbLayer ,
//Layers = para.Layers
} ) ;
}
foreach ( var itemThread in _ threadList )
{
DLTB_IDGForThreadHelper2 helper2 = new DLTB_IDGForThreadHelper2 ( pIdgParm ) ;
ThreadManager . Instance . QueueUserWorkItem ( new System . Threading . WaitCallback ( helper2 . Execute ) , itemThread ) ;
//break;
}
while ( ThreadManager . Instance . ActiveCount > 0 ) { }
//合库
foreach ( var itemThread in _ threadList )
{
//Directory.GetCurrentDirectory() + "\\Temp\\DLTB\\"
string gdbPath = System . IO . Path . Combine ( Parm . PrjInfo . ProjDir , "DLTB" , itemThread . ThreadName , "ZLDB.gdb" ) ;
if ( ! Directory . Exists ( gdbPath ) ) continue ;
IWorkspaceAPI wsAPI = null ;
IFeatureClassAPI GxFcAPI = null ;
IFeatureClassAPI GxgcFcAPI = null ;
try
{
string strFilter = string . Empty ;
if ( itemThread . Codes . Count > 0 )
{
foreach ( var xzq in itemThread . Codes )
{
strFilter + = string . Format ( " ZLDWDM like '{0}%' or" , xzq ) ;
}
strFilter = strFilter . TrimEnd ( 'r' ) . TrimEnd ( 'o' ) ;
}
IQueryFilter _F ilter = new QueryFilterClass ( ) ;
_F ilter . WhereClause = strFilter ;
wsAPI = new WorkspaceAPI ( gdbPath , WorkspaceTypeEnum . GDBFile ) ;
GxFcAPI = wsAPI . OpenFeatureClass ( "DLTBGX" ) ;
if ( GxFcAPI . FeatureClass = = null ) continue ;
GxFcAPI . FcToFc ( LaySourceHelper . GxTbLayer . FeatureClass , null , false ) ;
GxgcFcAPI = wsAPI . OpenFeatureClass ( "DLTBGXGC" ) ;
if ( GxgcFcAPI . FeatureClass = = null ) continue ;
_F ilter . WhereClause = _F ilter . WhereClause . Replace ( "ZLDWDM" , "BGHZLDWDM" ) ;
GxgcFcAPI . FcToFc ( LaySourceHelper . GxgcTBLayer . FeatureClass , null , false ) ;
}
catch ( Exception ex )
{
Console . WriteLine ( "Err:合并数据库异常:" + ex . Message ) ;
Console . WriteLine ( "Err:合并数据库异常:" + ex . StackTrace ) ;
break ;
}
finally
{
if ( GxFcAPI ! = null )
GxFcAPI . CloseFeatureClass ( ) ;
if ( GxgcFcAPI ! = null )
GxgcFcAPI . CloseFeatureClass ( ) ;
if ( wsAPI ! = null )
wsAPI . CloseWorkspace ( ) ;
}
}
Console . WriteLine ( "Msg:正在进行属性赋值..." ) ;
#region 更新层/更新过程层 标识码,图斑编号等赋值
string TempDbPath = System . IO . Path . Combine ( TempDir , "Temp" + ".sqlite" ) ;
IRDBHelper rdbHelper = RDBFactory . CreateDbHelper ( "Data Source=" + TempDbPath , DatabaseType . SQLite ) ;
IFeatureLayer Temp_DLTBGXGC = null ;
paramClass = new GPParamClass ( )
{
FirstFeatureLayer = LaySourceHelper . GxTbLayer ,
SecondFeatureLayer = LaySourceHelper . GxgcTBLayer ,
OutFeatureClassPath = $"{_TempDbPath}\\GX_GXGCUnion" ,
IsGetOutPutFeature = true ,
PreserveAttributes = "ALL" ,
GPType = EnumGPType . Union
} ;
GPHelper . Instance . ExeGPForProces ( paramClass , ref Temp_DLTBGXGC ) ;
IWorkspace ws = ( Temp_DLTBGXGC . FeatureClass as FeatureClass ) . Workspace ;
rdbHelper . ExecuteSQL ( " drop table GX_GXGCUnion " ) ;
IWorkspace pOutWork = CreateDBWorkspace ( TempDbPath ) ;
TableToTable ( ws as IFeatureWorkspace , pOutWork , "GX_GXGCUnion" ) ;
DataTable GX_GXGCUnion = rdbHelper . ExecuteDatatable ( "tab" , "select FID_DLTBGX,FID_DLTBGXGC,TBBGMJ,ZLDWDM,BGXW,BGHTBBH,BGHTBBSM,BGQZLDWDM,BGHZLDWDM from GX_GXGCUnion" , true ) ;
Dictionary < int , string [ ] > bsmDic = new Dictionary < int , string [ ] > ( ) ;
Dictionary < int , int > OIDdic = new Dictionary < int , int > ( ) ;
var strBSM = GetNewBSM ( new List < IFeatureClass > ( ) { LaySourceHelper . JcTbLayer . FeatureClass } ) ;
Dictionary < string , int > dicTBBH = new Dictionary < string , int > ( ) ;
GetMaxTBBH ( LaySourceHelper . JcTbLayer . FeatureClass , ref dicTBBH ) ;
List < int > DelGxOIDs = new List < int > ( ) ;
foreach ( DataRow item in GX_GXGCUnion . Rows )
{
int gxID = item [ "FID_DLTBGX" ] . ToInt ( ) ;
string zldwdm = item [ "ZLDWDM" ] . ToString ( ) ;
string bgxw = item [ "BGXW" ] . ToString ( ) ;
string TBBH = string . Empty ;
if ( ! bsmDic . ContainsKey ( gxID ) )
{
if ( bgxw = = "2" | | ( bgxw = = "1" & & item [ "BGQZLDWDM" ] . ToTrim ( ) ! = item [ "BGHZLDWDM" ] . ToTrim ( ) ) )
{
if ( bgxw = = "2" )
{
var strbsm = strBSM . Substring ( 0 , 1 0 ) ;
var Maxbsm = strBSM . Substring ( 1 0 ) . ToInt ( ) + 1 ;
strBSM = strbsm + Maxbsm . ToString ( ) . PadLeft ( 8 , '0' ) ; //最新标识码
}
if ( dicTBBH . ContainsKey ( zldwdm ) )
{
dicTBBH [ zldwdm ] = dicTBBH [ zldwdm ] + 1 ; //最大图斑编号-去最新值
TBBH = dicTBBH [ zldwdm ] . ToTrim ( ) ;
}
else
{
dicTBBH . Add ( zldwdm , 1 ) ;
TBBH = dicTBBH [ zldwdm ] . ToTrim ( ) ;
}
if ( bgxw = = "2" )
{
bsmDic . Add ( gxID , new string [ ] { strBSM , TBBH } ) ;
}
else
{
bsmDic . Add ( gxID , new string [ ] { item [ "BGHTBBSM" ] . ToString ( ) , TBBH } ) ;
}
}
else
{
bsmDic . Add ( gxID , new string [ ] { item [ "BGHTBBSM" ] . ToString ( ) , item [ "BGHTBBH" ] . ToString ( ) } ) ;
}
}
int gxgcID = item [ "FID_DLTBGXGC" ] . ToInt ( ) ;
if ( gxgcID = = - 1 )
{
DelGxOIDs . Add ( gxID ) ;
}
if ( ! OIDdic . ContainsKey ( gxgcID ) )
{
OIDdic . Add ( gxgcID , gxID ) ;
}
}
pCursor = LaySourceHelper . GxTbLayer . FeatureClass . Update ( null , true ) ;
var _ index_BSM = LaySourceHelper . GxTbLayer . FeatureClass . FindField ( "BSM" ) ;
var _ index_YSDM = LaySourceHelper . GxTbLayer . FeatureClass . FindField ( "YSDM" ) ; //2001010100
var _ index_TBBH = LaySourceHelper . GxTbLayer . FeatureClass . FindField ( "TBBH" ) ;
var _ index_TBMJ = LaySourceHelper . GxTbLayer . FeatureClass . FindField ( "TBMJ" ) ;
var _ index_KCXS = LaySourceHelper . GxTbLayer . FeatureClass . FindField ( "KCXS" ) ;
var _ index_KCMJ = LaySourceHelper . GxTbLayer . FeatureClass . FindField ( "KCMJ" ) ;
var _ index_TBDLMJ = LaySourceHelper . GxTbLayer . FeatureClass . FindField ( "TBDLMJ" ) ;
var igx_gxsj = LaySourceHelper . GxTbLayer . FeatureClass . FindField ( "GXSJ" ) ;
IFeature feature = null ;
while ( ( feature = pCursor . NextFeature ( ) ) ! = null )
{
int oid = feature . OID ;
if ( DelGxOIDs . Contains ( oid ) )
{
feature . Value [ _ index_BSM ] = "Del" ;
pCursor . UpdateFeature ( feature ) ;
continue ;
}
if ( bsmDic . ContainsKey ( oid ) )
{
string [ ] arr = bsmDic [ oid ] ;
feature . Value [ _ index_BSM ] = arr [ 0 ] ;
feature . Value [ _ index_TBBH ] = arr [ 1 ] ;
}
var kcxs = feature . Value [ _ index_KCXS ] . ToDouble ( ) ; //扣除系数
feature . Value [ _ index_YSDM ] = "2001010100" ; //要素代码
DataRow [ ] row = GX_GXGCUnion . Select ( $"FID_DLTBGX={feature.OID}" ) ;
double mj = 0.00 ;
if ( row . Length > 0 )
{
string gxgcid = string . Join ( " or " , row . Select ( r = > $"OBJECTID = {r[" FID_DLTBGXGC "].ToString()}" ) ) . ToString ( ) ;
mj = row . Select ( r = > r [ "TBBGMJ" ] . ToDouble ( ) ) . Sum ( ) . ToDouble ( 2 ) ;
}
feature . Value [ _ index_TBMJ ] = mj ;
feature . Value [ _ index_KCMJ ] = Math . Round ( mj * kcxs , 2 ) ;
feature . Value [ _ index_TBDLMJ ] = Math . Round ( mj - mj * kcxs , 2 ) ;
feature . Value [ igx_gxsj ] = new DateTime ( DateTime . Now . Year - 1 , 1 2 , 3 1 ) ;
pCursor . UpdateFeature ( feature ) ;
}
pCursor . Flush ( ) ;
Console . WriteLine ( "Warning:1地类图斑更新层:" + LaySourceHelper . GxTbLayer . FeatureClass . FeatureCount ( null ) ) ;
Console . WriteLine ( "Warning:1地类图斑更新过程层:" + LaySourceHelper . GxgcTBLayer . FeatureClass . FeatureCount ( null ) ) ;
( LaySourceHelper . GxTbLayer . FeatureClass as ITable ) . DeleteSearchedRows ( new QueryFilterClass ( ) { WhereClause = "BSM = 'Del'" } ) ;
string s = ( LaySourceHelper . GxgcTBLayer . FeatureClass as FeatureClass ) . Workspace . PathName ;
string s1 = ( LaySourceHelper . GxTbLayer . FeatureClass as FeatureClass ) . Workspace . PathName ;
Console . WriteLine ( "Warning:2地类图斑更新层:" + s1 + LaySourceHelper . GxTbLayer . FeatureClass . FeatureCount ( null ) ) ;
Console . WriteLine ( "Warning:2地类图斑更新过程层:" + s + LaySourceHelper . GxgcTBLayer . FeatureClass . FeatureCount ( null ) ) ;
pCursor = LaySourceHelper . GxgcTBLayer . FeatureClass . Update ( null , true ) ;
int iBGHTBBSM = LaySourceHelper . GxgcTBLayer . FeatureClass . FindField ( "BGHTBBSM" ) ;
int iBGHTBBH = LaySourceHelper . GxgcTBLayer . FeatureClass . FindField ( "BGHTBBH" ) ;
while ( ( feature = pCursor . NextFeature ( ) ) ! = null )
{
int oid = feature . OID ;
if ( OIDdic . ContainsKey ( oid ) )
{
int gxOID = OIDdic [ oid ] ;
if ( bsmDic . ContainsKey ( gxOID ) )
{
string [ ] arr = bsmDic [ gxOID ] ;
feature . Value [ iBGHTBBSM ] = arr [ 0 ] ;
feature . Value [ iBGHTBBH ] = arr [ 1 ] ;
}
}
pCursor . UpdateFeature ( feature ) ;
}
pCursor . Flush ( ) ;
# endregion
//GDPDExcute2(LaySourceHelper, _TempDbPath, pIdgParm);
rdbHelper . ExecuteSQL ( " drop table DLTBGXGC " ) ;
s = ( LaySourceHelper . GxgcTBLayer . FeatureClass as FeatureClass ) . Workspace . PathName ;
s1 = ( LaySourceHelper . GxTbLayer . FeatureClass as FeatureClass ) . Workspace . PathName ;
Console . WriteLine ( "Warning:3地类图斑更新层:" + s1 + LaySourceHelper . GxTbLayer . FeatureClass . FeatureCount ( null ) ) ;
Console . WriteLine ( "Warning:3地类图斑更新过程层:" + s + LaySourceHelper . GxgcTBLayer . FeatureClass . FeatureCount ( null ) ) ;
TableToTable ( ( LaySourceHelper . GxgcTBLayer . FeatureClass as FeatureClass ) . Workspace as IFeatureWorkspace , pOutWork , "DLTBGXGC" ) ;
DataTable DtDLTBGXGC = rdbHelper . ExecuteDatatable ( "tab" , @ "select BGHTBBSM from DLTBGXGC WHERE BGXW = 1 and (BGQZLDWDM != BGHZLDWDM or BGQZLDWMC!=BGHZLDWMC or BGQQSDWDM!=BGHQSDWDM or BGQQSDWMC!=BGHQSDWMC)
and TRIM ( IfNull ( BGQDLBM , ' ' ) ) = TRIM ( IfNull ( BGHDLBM , ' ' ) )
and TRIM ( IfNull ( BGQDLMC , ' ' ) ) = TRIM ( IfNull ( BGHDLMC , ' ' ) )
and TRIM ( IfNull ( BGQQSXZ , ' ' ) ) = TRIM ( IfNull ( BGHQSXZ , ' ' ) )
and TRIM ( IfNull ( BGQKCDLBM , ' ' ) ) = TRIM ( IfNull ( BGHKCDLBM , ' ' ) )
and TRIM ( IfNull ( BGQKCXS , ' ' ) ) = TRIM ( IfNull ( BGHKCXS , ' ' ) )
and TRIM ( IfNull ( BGQGDLX , ' ' ) ) = TRIM ( IfNull ( BGHGDLX , ' ' ) )
and TRIM ( IfNull ( BGQGDPDJB , ' ' ) ) = TRIM ( IfNull ( BGHGDPDJB , ' ' ) )
and TRIM ( IfNull ( BGQXZDWKD , ' ' ) ) = TRIM ( IfNull ( BGHXZDWKD , ' ' ) )
and TRIM ( IfNull ( BGQTBXHDM , ' ' ) ) = TRIM ( IfNull ( BGHTBXHDM , ' ' ) )
and TRIM ( IfNull ( BGQTBXHMC , ' ' ) ) = TRIM ( IfNull ( BGHTBXHMC , ' ' ) )
and TRIM ( IfNull ( BGQZZSXDM , ' ' ) ) = TRIM ( IfNull ( BGHZZSXDM , ' ' ) )
and TRIM ( IfNull ( BGQZZSXMC , ' ' ) ) = TRIM ( IfNull ( BGHZZSXMC , ' ' ) )
and TRIM ( IfNull ( BGQGDDB , ' ' ) ) = TRIM ( IfNull ( BGHGDDB , ' ' ) )
and TRIM ( IfNull ( BGQFRDBS , ' ' ) ) = TRIM ( IfNull ( BGHFRDBS , ' ' ) )
and TRIM ( IfNull ( BGQCZCSXM , ' ' ) ) = TRIM ( IfNull ( BGHCZCSXM , ' ' ) ) ", true);
if ( DtDLTBGXGC ! = null & & DtDLTBGXGC . Rows . Count > 0 )
{
List < string > bghbsm = DtDLTBGXGC . Rows . OfType < DataRow > ( ) . Select ( r = > $"{r[" BGHTBBSM "].ToString()}" ) . ToList ( ) ;
int ibghtbbsm = LaySourceHelper . GxgcTBLayer . FeatureClass . FindField ( "BGHTBBSM" ) ;
int ijczt = LaySourceHelper . GxgcTBLayer . FeatureClass . FindField ( "ONLYZLBG" ) ;
pCursor = LaySourceHelper . GxgcTBLayer . FeatureClass . Update ( null , true ) ;
while ( ( feature = pCursor . NextFeature ( ) ) ! = null )
{
string bghtbbsm = feature . Value [ ibghtbbsm ] . ToString ( ) ;
if ( bghbsm . Contains ( bghtbbsm ) )
{
feature . Value [ ijczt ] = "1" ;
pCursor . UpdateFeature ( feature ) ;
}
}
pCursor . Flush ( ) ;
pCursor = LaySourceHelper . GxTbLayer . FeatureClass . Update ( null , true ) ;
ijczt = LaySourceHelper . GxTbLayer . FeatureClass . FindField ( "ONLYZLBG" ) ;
int ibsm = LaySourceHelper . GxTbLayer . FeatureClass . FindField ( "BSM" ) ;
while ( ( feature = pCursor . NextFeature ( ) ) ! = null )
{
string bsm = feature . Value [ ibsm ] . ToString ( ) ;
if ( bghbsm . Contains ( bsm ) )
{
feature . Value [ ijczt ] = "1" ;
pCursor . UpdateFeature ( feature ) ;
}
}
pCursor . Flush ( ) ;
}
s = ( LaySourceHelper . GxgcTBLayer . FeatureClass as FeatureClass ) . Workspace . PathName ;
s1 = ( LaySourceHelper . GxTbLayer . FeatureClass as FeatureClass ) . Workspace . PathName ;
Console . WriteLine ( "Warning:4地类图斑更新层:" + s1 + LaySourceHelper . GxTbLayer . FeatureClass . FeatureCount ( null ) ) ;
Console . WriteLine ( "Warning:4地类图斑更新过程层:" + s + LaySourceHelper . GxgcTBLayer . FeatureClass . FeatureCount ( null ) ) ;
//Console.WriteLine("Msg:正在生成年末数据...");
//base.CreateNMK(LaySourceHelper);
Console . WriteLine ( $"Log:地类图斑数据提取完成。耗时:{GetTime(StartTime)}" ) ;
}
catch ( Exception ex )
{
Console . WriteLine ( $"Err:错误信息---" + ex . Message ) ;
Console . WriteLine ( $"Err:错误信息---" + ex . StackTrace ) ;
throw ex ;
}
finally
{
if ( pCursor ! = null )
Marshal . ReleaseComObject ( pCursor ) ;
}
}
/// <summary>
/// 耕地坡度级别赋值
/// </summary>
public void GDPDExcute2 ( DBLayerSourceHelper pLaySourceHelper , string pTempGDbPath , IDGParameter parameter )
{
IFeatureClassAPI GXAPI = null ;
IFeatureClassAPI GXGCAPI = null ;
IFeatureClassAPI pdtFcAPI = null ;
IFeatureLayer PDTLayer = null ;
IFeature feature = null ;
IFeature gxgcfeature = null ;
IFeatureCursor cursor = null ;
IWorkspaceFactory pFtWsFct = null ;
IWorkspaceName workspaceName = null ;
IFeatureLayer unionLayer = null ;
IFeatureClassAPI unionFcAPI = null ;
List < IFeature > unFcList = null ;
//IRDBHelper rdbHelper = null;
try
{
//ProgressHelper.ShowProcessBar("正在进行耕地坡度级别赋值,请稍后……");
//string dbPath = System.IO.Path.GetDirectoryName(Platform.Instance.MapsService.GetProjectInfo().GetProjDBPath()) + @"\BGTJ.sqlite";
//rdbHelper = RDBFactory.CreateDbHelper("Data Source=" + dbPath, Framework.DBOperator.DatabaseType.SQLite);
List < string > sqllist = new List < string > ( ) ;
//string MDBPath = Platform.Instance.MapsService.GetProjectInfo().GetProjDBPath();
#region 变更图斑层(GDB)
// 获取变更图斑
GXAPI = new FeatureClassAPI ( pLaySourceHelper . GxTbLayer . FeatureClass ) ;
if ( GXAPI = = null | | GXAPI . FeatureClass = = null )
{
//MessageHelper.ShowError("未获取到更新层图斑");
return ;
}
GXGCAPI = new FeatureClassAPI ( pLaySourceHelper . GxgcTBLayer . FeatureClass ) ;
if ( GXGCAPI = = null | | GXGCAPI . FeatureClass = = null )
{
//MessageHelper.ShowError("未获取到更新过程层图斑");
return ;
}
# endregion
#region 坡度图层(MDB)
// 获取坡度图
pdtFcAPI = new FeatureClassAPI ( pLaySourceHelper . GxPdtLayer . FeatureClass ) ;
if ( pdtFcAPI = = null | | pdtFcAPI . FeatureClass = = null )
{
//MessageHelper.ShowError("未获取到坡度图更新层图斑");
return ;
}
PDTLayer = pLaySourceHelper . GxPdtLayer ;
if ( pdtFcAPI . FeatureClass . FeatureCount ( null ) < = 0 )
{
pdtFcAPI = new FeatureClassAPI ( pLaySourceHelper . JcPdtLayer . FeatureClass ) ;
PDTLayer = pLaySourceHelper . JcPdtLayer ;
}
if ( pdtFcAPI . FeatureClass . FeatureCount ( null ) < = 0 )
{
//MessageHelper.ShowError("当前工程中未导入坡度数据!");
return ;
}
# endregion
//ProgressHelper.ShowProcessBar("正在处理数据……");
//准备临时文件
string Temp = Directory . GetCurrentDirectory ( ) + $"\\Temp\\{parameter.PrjInfo.CODE}\\TempBGFile" ;
if ( ! System . IO . Directory . Exists ( Temp ) )
{
System . IO . Directory . CreateDirectory ( Temp ) ;
}
string mdbFileName = Guid . NewGuid ( ) . ToString ( ) ;
string path = System . IO . Path . Combine ( Temp , mdbFileName ) ; //合并一个路径
pFtWsFct = new FileGDBWorkspaceFactory ( ) ;
workspaceName = pFtWsFct . Create ( path , "TempGDB" , null , 0 ) ;
string TempmdbPath = System . IO . Path . Combine ( path , "TempGDB.gdb" ) ;
IWorkspaceAPI psTempWorkspaceAPI = new WorkspaceAPI ( TempmdbPath , WorkspaceTypeEnum . GDBFile ) ;
IFeatureClassAPI tempdltbgxFeatureclassAPI = psTempWorkspaceAPI . CreateFeatureClass ( "TempDLTBGX" , ( GXAPI . FeatureClass as IGeoDataset ) . SpatialReference , GXAPI . FeatureClass . Fields ) ;
tempdltbgxFeatureclassAPI . AddField ( "OLDOBJECTID" , esriFieldType . esriFieldTypeInteger , "老OBJECTID" ) ;
IFeatureClass tempdltbgxFC = tempdltbgxFeatureclassAPI . FeatureClass ;
Dictionary < int , int > fieldsDic = new Dictionary < int , int > ( ) ;
for ( int i = 0 ; i < tempdltbgxFC . Fields . FieldCount ; i + + )
{
IField field = tempdltbgxFC . Fields . Field [ i ] ;
if ( field . Name = = tempdltbgxFC . ShapeFieldName | | field . Name . Contains ( tempdltbgxFC . ShapeFieldName ) | | field . Name = = tempdltbgxFC . OIDFieldName | | ! field . Editable ) continue ;
int index = - 1 ;
index = GXAPI . FeatureClass . Fields . FindField ( field . Name ) ;
if ( index = = - 1 )
index = GXAPI . FeatureClass . Fields . FindFieldByAliasName ( field . AliasName ) ;
if ( index = = - 1 )
continue ;
fieldsDic . Add ( i , index ) ;
}
if ( fieldsDic . Count = = 0 )
return ;
IFeatureBuffer buffer = tempdltbgxFC . CreateFeatureBuffer ( ) ;
IFeatureCursor tempgxCursor = tempdltbgxFC . Insert ( true ) ;
int oldOIDIndex = tempdltbgxFC . FindField ( "OLDOBJECTID" ) ;
if ( oldOIDIndex = = - 1 )
return ;
IQueryFilter queryfilter = new QueryFilterClass ( ) ;
queryfilter . WhereClause = string . Format ( "DLBM like '01%' " ) ;
int gdCount = GXAPI . FeatureClass . FeatureCount ( queryfilter ) ;
if ( gdCount = = 0 )
return ;
IFeature gxtbFeature = null ;
IFeatureCursor dltbgxCursor = GXAPI . FeatureClass . Search ( queryfilter , true ) ;
int OIDIndex = GXAPI . FeatureClass . FindField ( "OBJECTID" ) ;
int num = 0 ;
while ( ( gxtbFeature = dltbgxCursor . NextFeature ( ) ) ! = null )
{
num + + ;
buffer . Shape = gxtbFeature . ShapeCopy ;
foreach ( int item in fieldsDic . Keys )
{
if ( string . IsNullOrWhiteSpace ( gxtbFeature . Value [ fieldsDic [ item ] ] . ToTrim ( ) ) )
buffer . Value [ item ] = DBNull . Value ;
buffer . Value [ item ] = gxtbFeature . Value [ fieldsDic [ item ] ] ;
}
buffer . Value [ oldOIDIndex ] = gxtbFeature . Value [ OIDIndex ] ;
tempgxCursor . InsertFeature ( buffer ) ;
if ( num % 1 0 0 0 = = 0 )
{
tempgxCursor . Flush ( ) ;
}
Marshal . ReleaseComObject ( gxtbFeature ) ;
}
tempgxCursor . Flush ( ) ;
//DLTBGX与PDTGX 相交
GPParamClass gPParamClass = new GPParamClass ( ) ;
gPParamClass . FirstFeatureLayer = new FeatureLayerClass ( ) { FeatureClass = tempdltbgxFC } ; // pLaySourceHelper.BgTbLayer;
gPParamClass . SecondFeatureLayer = PDTLayer ;
gPParamClass . OutFeatureClassPath = pTempGDbPath + "\\TB_PD" ;
gPParamClass . IsGetOutPutFeature = true ;
gPParamClass . GPType = EnumGPType . Identify ;
GPHelper . Instance . ExeGPForProces ( gPParamClass , ref unionLayer ) ;
unionFcAPI = new FeatureClassAPI ( unionLayer . FeatureClass ) ;
cursor = unionFcAPI . FeatureClass . Search ( null , true ) ;
feature = null ;
Dictionary < int , string > DicPDJB = new Dictionary < int , string > ( ) ;
Dictionary < int , double > DicMJ = new Dictionary < int , double > ( ) ;
Dictionary < int , List < PDJBModel > > DicPDJB_MJ = new Dictionary < int , List < PDJBModel > > ( ) ;
int idxOID = unionFcAPI . FeatureClass . FindField ( "OLDOBJECTID" ) ;
if ( idxOID = = - 1 )
{
return ;
}
int idxArea = unionFcAPI . FeatureClass . FindField ( "SHAPE_AREA" ) ;
int idxPDJB = unionFcAPI . FeatureClass . FindField ( "PDJB" ) ;
while ( ( feature = cursor . NextFeature ( ) ) ! = null )
{
int oid = Convert . ToInt32 ( feature . Value [ idxOID ] . ToTrim ( ) ) ;
if ( oid = = 4 5 6 )
{
}
double area = feature . Value [ idxArea ] . ToDouble ( 2 ) ;
string pdjb = feature . Value [ idxPDJB ] . ToTrim ( ) ;
if ( ! DicPDJB_MJ . ContainsKey ( oid ) )
{
DicPDJB_MJ . Add ( oid , new List < PDJBModel > ( ) { new PDJBModel ( ) { PDJB = pdjb , MJ = area } } ) ;
}
else
{
List < PDJBModel > list = DicPDJB_MJ [ oid ] ;
PDJBModel pdjbMod = list . FirstOrDefault ( f = > f . PDJB = = pdjb ) ;
if ( pdjbMod = = null )
{
list . Add ( new PDJBModel ( ) { PDJB = pdjb , MJ = area } ) ;
}
else
{
pdjbMod . MJ + = area ;
}
DicPDJB_MJ [ oid ] = list ;
}
if ( ! DicMJ . ContainsKey ( oid ) )
{
DicMJ . Add ( oid , area ) ;
DicPDJB . Add ( oid , pdjb ) ;
}
else if ( DicMJ [ oid ] < area )
{
DicMJ [ oid ] = area ;
DicPDJB [ oid ] = pdjb ;
}
}
cursor = GXAPI . FeatureClass . Update ( new QueryFilter ( ) { WhereClause = "DLBM like '01%' " } , false ) ;
int Objectid_GX = GXAPI . FeatureClass . FindField ( "objectid" ) ;
int BSM_GX = GXAPI . FeatureClass . FindField ( "BSM" ) ;
int GDPDJB_GX = GXAPI . FeatureClass . FindField ( "GDPDJB" ) ;
int GDLX_GX = GXAPI . FeatureClass . FindField ( "GDLX" ) ;
int DLBM_GX = GXAPI . FeatureClass . FindField ( "DLBM" ) ;
int GDPDJB_GXGC = GXGCAPI . FeatureClass . FindField ( "BGHGDPDJB" ) ;
int GDLX_GXGC = GXGCAPI . FeatureClass . FindField ( "BGHGDLX" ) ;
int DLBM_GXGC = GXGCAPI . FeatureClass . FindField ( "BGHDLBM" ) ;
int GDPDJBIndex = pdtFcAPI . FeatureClass . FindField ( "PDJB" ) ;
var count = GXAPI . FeatureClass . FeatureCount ( new QueryFilter ( ) { WhereClause = "DLBM like '01%' " } ) ;
var featurecount = 0 ;
while ( ( feature = cursor . NextFeature ( ) ) ! = null )
{
featurecount + + ;
//ProgressHelper.ShowProcessBar($"正在进行耕地坡度赋值...【{featurecount}/{count}】");
//查询union图层
//unFcList = unionFcAPI.QueryFeatures(GeoDBAPI.CreateQueryFilter("FID_DLTBGX =" + feature.Value[Objectid_GX]));
//unFcList = unionFcAPI.QueryFeatures(GeoDBAPI.CreateQueryFilter("OLDOBJECTID =" + feature.Value[Objectid_GX]));
//if (unFcList.Count == 0)
//{
// continue;
//}
if ( feature . OID = = 5 2 9 )
{
}
string pdjb = string . Empty ;
if ( ! DicPDJB_MJ . ContainsKey ( feature . OID ) )
{
continue ;
}
List < PDJBModel > list = DicPDJB_MJ [ feature . OID ] ;
list = list . OrderByDescending ( o = > o . MJ ) . ToList ( ) ;
pdjb = list [ 0 ] . PDJB ; //[feature.OID];
//if (unFcList != null && unFcList.Count == 1)
//{
// pdjb = unFcList[0].Value[unFcList[0].Fields.FindField("PDJB")].ToString();
//}
//else if (unFcList != null && unFcList.Count > 1)
//{
// switch (SumType)
// {
// case PDJSumType.PDMax:
// pdjb = GetPDMaxValue(unFcList, null);
// break;
// case PDJSumType.PDMin:
// pdjb = GetPDMinValue(unFcList, null);
// break;
// case PDJSumType.MJMax:
// pdjb = GetMJMaxValue2(unFcList);
// break;
// case PDJSumType.PDAvg:
// pdjb = GetPDAvgValue(unFcList, null);
// break;
// case PDJSumType.Weight:
// pdjb = GetWeightValue(unFcList);
// break;
// default:
// break;
// }
//}
feature . Value [ GDPDJB_GX ] = pdjb ;
string dlbm = feature . Value [ DLBM_GX ] . ToString ( ) ;
string bghbsm = feature . Value [ BSM_GX ] . ToString ( ) ;
string UpdateGCSql = string . Empty ;
string strGDLX = feature . Value [ GDLX_GX ] . ToTrim ( ) ;
if ( pdjb = = "1" )
{
strGDLX = "" ;
}
//if (!string.IsNullOrWhiteSpace(dlbm) && "2,3,4,5".Contains(pdjb))
//{
// if (dlbm == "0101")
// {
// strGDLX = "TT";
// //feature.Value[GDLX_GX] = "TT";
// }
// else if ("0102,0103".Contains(dlbm))
// {
// //UpdateGCSql = string.Format("update DLTBGXGC set BGHGDPDJB='{0}', BGHGDLX='{1}' where BGHTBBSM='{2}'", pdjb, "PD", bghbsm);
// strGDLX = "PD";
// }
//}
feature . Value [ GDLX_GX ] = strGDLX ;
UpdateGCSql = string . Format ( "update DLTBGXGC set BGHGDPDJB='{0}', BGHGDLX='{1}' where BGHTBBSM='{2}'" , pdjb , strGDLX , bghbsm ) ;
//UpdateGCSql = string.Format("update DLTBGXGC set BGHGDPDJB='{0}' where BGHTBBSM='{1}'", pdjb, bghbsm);
if ( ! string . IsNullOrWhiteSpace ( UpdateGCSql ) )
( GXGCAPI . FeatureClass as FeatureClass ) . Workspace . ExecuteSQL ( UpdateGCSql ) ;
cursor . UpdateFeature ( feature ) ;
//IFeatureCursor gxCursor = GXGCAPI.FeatureClass.Update(new QueryFilter() { WhereClause = string.Format("BGHTBBSM ='{0}'", bghbsm) }, false);
//IFeature gxFeature = null;
//while ((gxFeature = gxCursor.NextFeature()) != null)
//{
// gxFeature.Value[GDPDJB_GXGC] = pdjb;
// string bghdlbm = gxFeature.Value[DLBM_GXGC].ToString();
// if (!string.IsNullOrWhiteSpace(bghdlbm) && "2,3,4,5".Contains(pdjb))
// {
// if (bghdlbm == "0101")
// gxFeature.Value[GDLX_GXGC] = "TT";
// else if ("0102,0103".Contains(bghdlbm))
// gxFeature.Value[GDLX_GXGC] = "PD";
// }
// gxCursor.UpdateFeature(gxFeature);
// Marshal.ReleaseComObject(gxFeature);
//}
//if (!string.IsNullOrWhiteSpace(dlbm) && "2,3,4,5".Contains(pdjb))
//{
// if (dlbm == "0101")
// sqllist.Add(string.Format("update BHXXB set BGHGDPDJB='{0}', BGHGDLX='{1}' where BGHTBBSM='{2}'", pdjb, "TT", bghbsm));
// else if ("0102,0103".Contains(dlbm))
// sqllist.Add(string.Format("update BHXXB set BGHGDPDJB='{0}', BGHGDLX='{1}' where BGHTBBSM='{2}'", pdjb, "PD", bghbsm));
//}
//else
//{
sqllist . Add ( string . Format ( "update BHXXB set BGHGDPDJB='{0}', BGHGDLX='{1}' where BGHTBBSM='{2}'" , pdjb , strGDLX , bghbsm ) ) ;
//}
Marshal . ReleaseComObject ( feature ) ;
}
//rdbHelper.BeginTransaction();
//try
//{
// foreach (string item in sqllist)
// {
// rdbHelper.ExecuteNonQuery(item, CommandType.Text);
// }
//}
//catch (Exception ex)
//{
// rdbHelper.Rollback();
//}
//rdbHelper.Commit();
//ProgressHelper.CloseProcessBar();
//MessageHelper.ShowTips("耕地坡度赋值完成!");
}
catch ( Exception ex )
{
//ProgressHelper.CloseProcessBar();
LogAPI . Debug ( "Err:耕地坡度级别赋值异常" + ex . Message ) ;
LogAPI . Debug ( "Err:耕地坡度级别赋值异常" + ex . StackTrace ) ;
//MessageHelper.ShowError("耕地坡度级别赋值异常:" + ex.Message);
}
finally
{
//ProgressHelper.CloseProcessBar();
if ( feature ! = null )
Marshal . ReleaseComObject ( feature ) ;
if ( gxgcfeature ! = null )
Marshal . ReleaseComObject ( gxgcfeature ) ;
if ( cursor ! = null )
Marshal . ReleaseComObject ( cursor ) ;
if ( pFtWsFct ! = null )
Marshal . ReleaseComObject ( pFtWsFct ) ;
if ( workspaceName ! = null )
Marshal . ReleaseComObject ( workspaceName ) ;
if ( unionLayer ! = null )
Marshal . ReleaseComObject ( unionLayer ) ;
//if (rdbHelper != null)
//{
// rdbHelper.DisConnect();
//}
}
}
private IWorkspace CreateDBWorkspace ( string pDbPath )
{
try
{
if ( ! File . Exists ( pDbPath ) )
{
Console . WriteLine ( string . Format ( "指定的文件路径{0}不存在!" , pDbPath ) ) ;
return null ;
}
IWorkspaceFactory pOutWorkFactory = null ;
pOutWorkFactory = new SqlWorkspaceFactoryClass ( ) ;
IWorkspace pOutWork = pOutWorkFactory . OpenFromFile ( pDbPath , 0 ) ;
return pOutWork ;
}
catch ( Exception ex )
{
//Console.WriteLine($"Log:CreateDBWorkspace错误:{ex.Message}");
throw ;
}
}
#region TableToTable
public bool TableToTable ( IFeatureWorkspace pInWork , IWorkspace pOutWork , string tableName , IQueryFilter queryFilter = null )
{
try
{
if ( pInWork = = null | | pOutWork = = null | | string . IsNullOrEmpty ( tableName ) ) return false ;
IWorkspace2 workspace2 = pInWork as IWorkspace2 ;
if ( workspace2 ! = null )
{
if ( ! workspace2 . get_NameExists ( esriDatasetType . esriDTFeatureClass , tableName ) )
{
return false ;
}
}
ITable pInTable = pInWork . OpenTable ( tableName ) ;
if ( pInTable = = null ) return false ;
IDataset pIndataset = ( IDataset ) pInTable ;
IDatasetName pInDatasetName = ( IDatasetName ) pIndataset . FullName ;
IEnumDataset enumDataset = pOutWork . get_Datasets ( esriDatasetType . esriDTTable ) ;
IDataset dataset ;
enumDataset . Reset ( ) ;
while ( ( dataset = enumDataset . Next ( ) ) ! = null )
{
string [ ] names = dataset . Name . Split ( '.' ) ;
if ( string . Equals ( names [ names . Length - 1 ] , tableName , StringComparison . CurrentCultureIgnoreCase ) )
{
dataset . Delete ( ) ;
break ;
}
}
IDataset pOutDataset = ( IDataset ) pOutWork ;
IDatasetName pOutDatasetName = new TableNameClass ( ) ;
pOutDatasetName . WorkspaceName = ( IWorkspaceName ) pOutDataset . FullName ;
pOutDatasetName . Name = tableName ;
IFieldChecker fieldChecker = new FieldCheckerClass ( ) ;
IFields targetFeatureClassFields = pInTable . Fields ;
IFields sourceFeatureClassFields = pInTable . Fields ;
IEnumFieldError enumFieldError ;
fieldChecker . InputWorkspace = pInWork as IWorkspace ;
fieldChecker . ValidateWorkspace = pOutWork ;
fieldChecker . Validate ( sourceFeatureClassFields , out enumFieldError , out targetFeatureClassFields ) ;
IFeatureDataConverter one2another = new FeatureDataConverterClass ( ) ;
try
{
one2another . ConvertTable ( pInDatasetName , queryFilter , pOutDatasetName , targetFeatureClassFields , "" , 1 0 0 0 , 0 ) ;
}
finally
{
Marshal . ReleaseComObject ( one2another ) ;
}
return true ;
}
catch ( Exception ex )
{
LogAPI . Debug ( "Err:TableToTable异常" + ex . Message ) ;
LogAPI . Debug ( "Err:TableToTable异常" + ex . StackTrace ) ;
throw ex ;
}
}
# endregion
#region 获取最新图斑编号
private void GetMaxTBBH ( IFeatureClass fc , ref Dictionary < string , int > result )
{
ICursor cursor = ( fc as ITable ) . Search ( new QueryFilterClass ( ) { SubFields = "ZLDWDM,TBBH" } , true ) ;
IRow row = null ;
int zlIndex = - 1 ;
int bhIndex = - 1 ;
while ( ( row = cursor . NextRow ( ) ) ! = null )
{
if ( zlIndex = = - 1 )
zlIndex = row . Fields . FindField ( "ZLDWDM" ) ;
if ( bhIndex = = - 1 )
bhIndex = row . Fields . FindField ( "TBBH" ) ;
if ( zlIndex ! = - 1 & & bhIndex ! = - 1 )
{
string zl = row . Value [ zlIndex ] . ToTrim ( ) ;
zl = zl . Replace ( zl . Substring ( 0 , 6 ) , Parm . PrjInfo . CODE ) ;
int tbbh = 0 ;
int . TryParse ( row . Value [ bhIndex ] . ToString ( ) , out tbbh ) ;
if ( result . ContainsKey ( zl ) )
{
if ( result [ zl ] < tbbh )
result [ zl ] = tbbh ;
}
else
{
result . Add ( zl , tbbh ) ;
}
}
}
}
# endregion
#region 获取最新标识码
public string GetNewBSM ( List < IFeatureClass > fcList )
{
string result = string . Empty ;
int xh = 0 ;
string leftStr = string . Empty ;
foreach ( var item in fcList )
{
string MaxBSM = GetMaxBSM ( item ) ;
if ( MaxBSM . Length ! = 1 8 )
continue ;
int xh2 = Convert . ToInt32 ( MaxBSM . Substring ( 1 0 ) ) ;
leftStr = MaxBSM . Substring ( 0 , 1 0 ) ;
if ( xh < xh2 )
xh = xh2 ;
}
xh + + ;
if ( string . IsNullOrWhiteSpace ( leftStr ) )
leftStr = Parm . PrjInfo . CODE + "1210" ;
result = leftStr + xh . ToString ( ) . PadLeft ( 8 , '0' ) ;
return result ;
}
private static string GetMaxBSM ( IFeatureClass fc )
{
string BSM = string . Empty ;
int BSMIndex = fc . FindField ( "BSM" ) ;
if ( BSMIndex = = - 1 ) return BSM ;
ITable table = ( ITable ) fc ;
// 创建一个ITableSort接口对象
ITableSort tableSort = new TableSortClass ( ) ;
tableSort . Table = table ;
tableSort . Fields = "BSM" ;
tableSort . set_Ascending ( "BSM" , false ) ;
tableSort . Sort ( null ) ;
ICursor cursor = tableSort . Rows ;
IRow row = cursor . NextRow ( ) ;
if ( row ! = null )
{
int maxBSM = 0 ;
int currBSM = 0 ;
string BSMStr = row . Value [ BSMIndex ] . ToString ( ) ;
if ( BSMStr . Length ! = 1 8 ) return BSM ;
string subBSMStr = BSMStr . Substring ( 9 ) ;
try
{
currBSM = Convert . ToInt32 ( subBSMStr ) ;
}
catch ( Exception )
{
return BSM ;
}
if ( currBSM > maxBSM ) maxBSM = currBSM ;
if ( BSMStr . Length ! = 1 8 ) return BSM ;
string maxStr = maxBSM . ToString ( ) ;
int zeroNum = 9 - maxStr . Length ;
for ( int i = 0 ; i < zeroNum ; i + + )
{
maxStr = 0 + maxStr ;
}
BSM = BSMStr . Substring ( 0 , 9 ) + maxStr ;
}
return BSM ;
}
# endregion
}
public class DLTB_IDGForThreadHelper2 : BaseIDG
{
private string Lock = "" ;
private IDGParameter Parm = null ;
private string TempDbPath = string . Empty ;
public DLTB_IDGForThreadHelper2 ( IDGParameter pParm )
{
Parm = pParm ;
}
public void Execute ( object pThreadParm )
{
IFeatureLayer _ JcTbLayer = null ;
IFeatureLayer _ BgTbLayer = null ;
IWorkspaceAPI _ WsAPI = null ;
IFeatureClassAPI _ JcFcAPI = null ;
IFeatureClassAPI _ BgFcAPI = null ;
IFeatureCursor pCursor = null ;
IFeature feature = null ;
ThreadParam _ Parm = null ;
try
{
_ Parm = pThreadParm as ThreadParam ;
string TempPath = CreateTempFile ( _ Parm ) ;
string TempDbPath = System . IO . Path . Combine ( TempPath , _ Parm . ThreadName + ".sqlite" ) ;
string TempGDbPath = System . IO . Path . Combine ( TempPath , _ Parm . ThreadName + ".gdb" ) ;
string TempGDbPath2 = System . IO . Path . Combine ( TempPath , "ZLDB.gdb" ) ;
DirectoryCopy ( _ Parm . ProjInfo . ZLDatabase , TempPath ) ;
FileInfo fInfo = new FileInfo ( _ Parm . ProjInfo . ZLDatabase ) ;
_ Parm . ProjInfo . ZLDatabase = System . IO . Path . Combine ( TempPath , fInfo . Name ) ;
DBLayerSourceHelper LaySourceHelper = OpenDB ( _ Parm . ProjInfo ) ;
ProcessBGTB ( LaySourceHelper , TempGDbPath2 ) ;
LaySourceHelper . JcTbLayer = GeoDBAPI . DeSerialzedPersist ( _ Parm . StrJcTbLayer ) as IFeatureLayer ;
LaySourceHelper . BgTbLayer = GeoDBAPI . DeSerialzedPersist ( _ Parm . StrBgTbLayer ) as IFeatureLayer ;
GPParamClass paramClass = new GPParamClass ( ) ;
string strFilter = string . Empty ;
if ( _ Parm . Codes . Count > 0 )
{
foreach ( var xzq in _ Parm . Codes )
{
strFilter + = string . Format ( " ZLDWDM like '{0}%' or" , xzq ) ;
}
strFilter = strFilter . TrimEnd ( 'r' ) . TrimEnd ( 'o' ) ;
}
if ( string . IsNullOrWhiteSpace ( strFilter ) )
strFilter = "1=1" ;
paramClass . FirstFeatureLayer = LaySourceHelper . JcTbLayer ; // GeoDBAPI.DeSerialzedPersist(_Parm.StrJcTbLayer) as IFeatureLayer;
paramClass . SecondFeatureLayer = LaySourceHelper . BgTbLayer ; // GeoDBAPI.DeSerialzedPersist(_Parm.StrBgTbLayer) as IFeatureLayer;
paramClass . Where_clause = strFilter ;
paramClass . TempGDBPath = TempPath ;
paramClass . IsGetOutPutFeature = true ;
paramClass . GPType = EnumGPType . BGTBYCL ;
paramClass . XZQDM = _ Parm . ProjInfo . CODE ;
IFeatureLayer Temp_DLTBGXGC = null ;
GPHelper helper = new GPHelper ( ) ;
helper . ExeGPForProces ( paramClass , ref Temp_DLTBGXGC ) ;
IRDBHelper rdbHelper = RDBFactory . CreateDbHelper ( "Data Source=" + TempDbPath , DatabaseType . SQLite ) ;
Console . WriteLine ( "Msg:正在进行变更行为赋值..." ) ;
#region BGXW=2
//变更图斑与基础库图斑一对多
rdbHelper . ExecuteSQL ( " UPDATE GXGC_Multipart set BGXW='2' where FID_DLTBBG in (select FID_DLTBBG from GXGC_Multipart where FID_DLTBBG <> -1 GROUP BY FID_DLTBBG HAVING COUNT(FID_DLTBBG) > 1) " ) ;
rdbHelper . ExecuteSQL ( @" UPDATE GXGC_Multipart set BGXW='2' where BGXW ISNULL and FID_DLTB in (select FID_DLTB from GXGC_Multipart GROUP BY FID_DLTB HAVING COUNT(FID_DLTB) > 1 ) " ) ;
# endregion
#region BGXW=1
rdbHelper . ExecuteSQL ( @ "UPDATE GXGC_Multipart set BGXW='1' where BGXW ISNULL and OBJECTID in (select OBJECTID from
(
select FID_DLTBBG , OBJECTID , BGXW ,
case when DLBM ISNULL OR DLBM = ' ' THEN ' ' ELSE DLBM END DLBM ,
case when DLBM_1 ISNULL OR DLBM_1 = ' ' THEN ' ' ELSE DLBM_1 END DLBM_1 ,
case when DLMC ISNULL OR DLMC = ' ' THEN ' ' ELSE DLMC END DLMC ,
case when DLMC_1 ISNULL OR DLMC_1 = ' ' THEN ' ' ELSE DLMC_1 END DLMC_1 ,
case when QSXZ ISNULL OR QSXZ = ' ' THEN ' ' ELSE QSXZ END QSXZ ,
case when QSXZ_1 ISNULL OR QSXZ_1 = ' ' THEN ' ' ELSE QSXZ_1 END QSXZ_1 ,
case when QSDWDM ISNULL OR QSDWDM = ' ' THEN ' ' ELSE QSDWDM END QSDWDM ,
case when QSDWDM_1 ISNULL OR QSDWDM_1 = ' ' THEN ' ' ELSE QSDWDM_1 END QSDWDM_1 ,
case when QSDWMC ISNULL OR QSDWMC = ' ' THEN ' ' ELSE QSDWMC END QSDWMC ,
case when QSDWMC_1 ISNULL OR QSDWMC_1 = ' ' THEN ' ' ELSE QSDWMC_1 END QSDWMC_1 ,
case when ZLDWDM ISNULL OR ZLDWDM = ' ' THEN ' ' ELSE ZLDWDM END ZLDWDM ,
case when ZLDWDM_1 ISNULL OR ZLDWDM_1 = ' ' THEN ' ' ELSE ZLDWDM_1 END ZLDWDM_1 ,
case when ZLDWMC ISNULL OR ZLDWMC = ' ' THEN ' ' ELSE ZLDWMC END ZLDWMC ,
case when ZLDWMC_1 ISNULL OR ZLDWMC_1 = ' ' THEN ' ' ELSE ZLDWMC_1 END ZLDWMC_1 ,
case when KCDLBM ISNULL or KCDLBM = ' ' THEN ' ' ELSE KCDLBM END KCDLBM ,
case when KCDLBM_1 ISNULL or KCDLBM_1 = ' ' THEN ' ' ELSE KCDLBM_1 END KCDLBM_1 ,
case when KCXS ISNULL or KCXS = ' ' THEN ' ' ELSE KCXS END KCXS ,
case when KCXS_1 ISNULL or KCXS_1 = ' ' THEN ' ' ELSE KCXS_1 END KCXS_1 ,
case when GDLX ISNULL or GDLX = ' ' THEN ' ' ELSE GDLX END GDLX ,
case when GDLX_1 ISNULL or GDLX_1 = ' ' THEN ' ' ELSE GDLX_1 END GDLX_1 ,
case when GDPDJB ISNULL or GDPDJB = ' ' THEN ' ' ELSE GDPDJB END GDPDJB ,
case when GDPDJB_1 ISNULL or GDPDJB_1 = ' ' THEN ' ' ELSE GDPDJB_1 END GDPDJB_1 ,
case when XZDWKD ISNULL or XZDWKD = ' ' or XZDWKD = 0.0 THEN 0 ELSE XZDWKD END XZDWKD ,
case when XZDWKD_1 ISNULL or XZDWKD_1 = ' ' or XZDWKD_1 = 0.0 THEN 0 ELSE XZDWKD_1 END XZDWKD_1 ,
case when TBXHDM ISNULL or TBXHDM = ' ' THEN ' ' ELSE TBXHDM END TBXHDM ,
case when TBXHDM_1 ISNULL or TBXHDM_1 = ' ' THEN ' ' ELSE TBXHDM_1 END TBXHDM_1 ,
case when TBXHMC ISNULL or TBXHMC = ' ' THEN ' ' ELSE TBXHMC END TBXHMC ,
case when TBXHMC_1 ISNULL or TBXHMC_1 = ' ' THEN ' ' ELSE TBXHMC_1 END TBXHMC_1 ,
case when ZZSXDM ISNULL or ZZSXDM = ' ' THEN ' ' ELSE ZZSXDM END ZZSXDM ,
case when ZZSXDM_1 ISNULL or ZZSXDM_1 = ' ' THEN ' ' ELSE ZZSXDM_1 END ZZSXDM_1 ,
case when ZZSXMC ISNULL or ZZSXMC = ' ' THEN ' ' ELSE ZZSXMC END ZZSXMC ,
case when ZZSXMC_1 ISNULL or ZZSXMC_1 = ' ' THEN ' ' ELSE ZZSXMC_1 END ZZSXMC_1 ,
case when GDDB ISNULL or GDDB = ' ' or GDDB = 0 THEN ' ' ELSE GDDB END GDDB ,
case when GDDB_1 ISNULL or GDDB_1 = ' ' or GDDB_1 = 0 THEN ' ' ELSE GDDB_1 END GDDB_1 ,
case when FRDBS ISNULL or FRDBS = ' ' THEN ' ' ELSE FRDBS END FRDBS ,
case when FRDBS_1 ISNULL or FRDBS_1 = ' ' THEN ' ' ELSE FRDBS_1 END FRDBS_1 ,
case when CZCSXM ISNULL or CZCSXM = ' ' THEN ' ' ELSE CZCSXM END CZCSXM ,
case when CZCSXM_1 ISNULL or CZCSXM_1 = ' ' THEN ' ' ELSE CZCSXM_1 END CZCSXM_1 ,
case when MSSM ISNULL or MSSM = ' ' THEN ' ' ELSE MSSM END MSSM ,
case when MSSM_1 ISNULL or MSSM_1 = ' ' THEN ' ' ELSE MSSM_1 END MSSM_1 ,
case when HDMC ISNULL or HDMC = ' ' THEN ' ' ELSE HDMC END HDMC ,
case when HDMC_1 ISNULL or HDMC_1 = ' ' THEN ' ' ELSE HDMC_1 END HDMC_1
from GXGC_Multipart WHERE BGXW ISNULL and
FID_DLTBBG < > - 1 and
FID_DLTB in ( select FID_DLTB from GXGC_Multipart GROUP BY FID_DLTB HAVING COUNT ( FID_DLTB ) = 1 ) and
FID_DLTBBG in ( select FID_DLTBBG from GXGC_Multipart GROUP BY FID_DLTBBG HAVING COUNT ( FID_DLTBBG ) = 1 )
)
WHERE ( DLBM ! = DLBM_1 or DLMC ! = DLMC_1 or QSXZ ! = QSXZ_1 or QSDWDM ! = QSDWDM_1 or QSDWMC ! = QSDWMC_1 or ZLDWDM ! = ZLDWDM_1 or ZLDWMC ! = ZLDWMC_1 or KCDLBM ! = KCDLBM_1 or KCXS ! = KCXS_1 or GDLX ! = GDLX_1 or GDPDJB ! = GDPDJB_1 or XZDWKD ! = XZDWKD_1 or TBXHDM ! = TBXHDM_1 or TBXHMC ! = TBXHMC_1 or ZZSXDM ! = ZZSXDM_1 or ZZSXMC ! = ZZSXMC_1 or GDDB ! = GDDB_1 or FRDBS ! = FRDBS_1 or CZCSXM ! = CZCSXM_1 or MSSM ! = MSSM_1 or HDMC ! = HDMC_1 ) ) ");
# endregion
Console . WriteLine ( "Msg:正在进行面积平差..." ) ;
lock ( Lock )
{
#region 面积平差
DataTable data_BSM = rdbHelper . ExecuteDatatable ( "tab" , "select BSM,TBMJ_1 from GXGC_Multipart GROUP BY BSM HAVING count(BSM)>1" , true ) ;
List < string > pcBSMList = new List < string > ( ) ;
if ( data_BSM ! = null & & data_BSM . Rows . Count > 0 )
{
foreach ( DataRow row in data_BSM . Rows )
{
var jc_bsm = row [ "BSM" ] . ToTrim ( ) ;
if ( ! pcBSMList . Contains ( jc_bsm ) )
pcBSMList . Add ( jc_bsm ) ;
}
}
pCursor = Temp_DLTBGXGC . FeatureClass . Search ( new QueryFilterClass ( ) { SubFields = "OBJECTID,BSM,TBMJ,SHAPE" } , true ) ;
var _ itbmj = Temp_DLTBGXGC . FeatureClass . FindField ( "TBMJ" ) ;
var bsmIdx = Temp_DLTBGXGC . FeatureClass . FindField ( "BSM" ) ;
feature = null ;
Dictionary < int , double > AreaList = new Dictionary < int , double > ( ) ;
//int _i = 0;
while ( ( feature = pCursor . NextFeature ( ) ) ! = null )
{
string bsm = feature . Value [ bsmIdx ] . ToTrim ( ) ;
if ( ! pcBSMList . Contains ( bsm ) )
continue ;
//_i++;
double area = GetEllipseArea ( feature . ShapeCopy ) ;
//lock (AreaList)
//{
AreaList . Add ( feature . OID , area . ToDouble ( ) ) ;
//}
//if (_i == 100)
//{
// _i = 0;
// Console.Clear();
// Console.Write(feature.OID);
//}
}
//}
DataTable data = rdbHelper . ExecuteDatatable ( "tab" , "select OBJECTID,BSM,TBMJ,TBMJ_1 from GXGC_Multipart " , true ) ;
Dictionary < int , double > _ GXGCvaluePairs = new Dictionary < int , double > ( ) ; //记录平差结果
if ( data_BSM ! = null & & data_BSM . Rows . Count > 0 )
{
foreach ( DataRow row in data_BSM . Rows )
{
var jc_TBMJ = row [ "TBMJ_1" ] . ToDouble ( ) ;
List < Adjustment > shpList = new List < Adjustment > ( ) ;
var rows = data . Select ( $"BSM ='{row[" BSM "]}'" ) ;
foreach ( var item in rows )
{
Adjustment adj = new Adjustment ( ) ;
adj . ID = item [ "OBJECTID" ] . ToInt ( ) ;
if ( AreaList . ContainsKey ( adj . ID ) )
adj . bgmj = AreaList [ adj . ID ] ;
shpList . Add ( adj ) ;
}
if ( shpList . Count > 0 )
{
AreaAdjustment ( shpList , jc_TBMJ ) ; //面积平差
foreach ( var item in shpList )
{
if ( ! _ GXGCvaluePairs . ContainsKey ( item . ID ) )
{
_ GXGCvaluePairs . Add ( item . ID , item . bgmj ) ;
}
}
}
}
}
# endregion
Console . WriteLine ( "Msg:正在写入过程数据..." ) ;
#region 生成更新过程层
//IFeatureClassAPI DLTBGXGC = wsAPI1.CreateFeatureClass("DLTBGXGC", (LaySourceHelper.GxgcTBLayer.FeatureClass as IGeoDataset).SpatialReference, LaySourceHelper.GxgcTBLayer.FeatureClass.Fields);
//Console.WriteLine(Temp_DLTBGXGC.FeatureClass.FeatureCount(null));
DataTable data_BGXW = rdbHelper . ExecuteDatatable ( "tab" , @"select FID_DLTBBG,FID_DLTB,BGXW,OBJECTID,TBMJ_1 from GXGC_Multipart WHERE BGXW NOT NULL " , true ) ;
GXGCFcToFc ( Temp_DLTBGXGC . FeatureClass , LaySourceHelper . GxgcTBLayer . FeatureClass , null , false , data_BGXW , _ GXGCvaluePairs ) ;
//Console.WriteLine("更新过程写入:" + LaySourceHelper.GxgcTBLayer.FeatureClass.FeatureCount(null));
# endregion
}
Console . WriteLine ( "Msg:正在写入更新数据..." ) ;
#region 生成更新层
IWorkspaceAPI wsAPI1 = new WorkspaceAPI ( TempGDbPath , WorkspaceTypeEnum . GDBFile ) ;
IFeatureClassAPI DLTBGX = wsAPI1 . CreateFeatureClass ( "DLTBGX" , ( LaySourceHelper . GxTbLayer . FeatureClass as IGeoDataset ) . SpatialReference , LaySourceHelper . GxTbLayer . FeatureClass . Fields ) ;
GXFcToFc ( LaySourceHelper . GxgcTBLayer . FeatureClass , DLTBGX . FeatureClass , new QueryFilterClass ( ) { WhereClause = "BGHDLBM <>'1001' and BGHDLBM <>'1002' and BGHDLBM <>'1003' and BGHDLBM<>'1004' and BGHDLBM <>'1006' and BGHDLBM<>'1009' and BGHDLBM<>'1101' and BGHDLBM<>'1107' and BGHDLBM<>'1107A' " } ) ;
IFeatureLayer DissolveAnalysisFeatureLayer = null ;
#region 上海数据不合并
if ( _ Parm . ProjInfo . CODE . StartsWith ( "31" ) )
{
IFeatureClassAPI fcAPI = new FeatureClassAPI ( DLTBGX . FeatureClass ) ;
fcAPI . FcToFc ( LaySourceHelper . GxTbLayer . FeatureClass , null , false ) ;
}
else
{
paramClass = new GPParamClass ( ) ;
paramClass . FirstFeatureLayer = new FeatureLayer ( ) { FeatureClass = DLTBGX . FeatureClass } ;
paramClass . OutFeatureClassPath = $"{TempGDbPath}\\GX_Dissolve" ;
paramClass . IsGetOutPutFeature = true ;
paramClass . ListDissolveFiledName = new List < string > ( ) { "DLBM" , "DLMC" , "QSXZ" , "QSDWDM" , "QSDWMC" , "ZLDWDM" , "ZLDWMC" , "KCDLBM" , "KCXS" , "GDLX" , "GDPDJB" , "TBXHDM" , "TBXHMC" , "ZZSXDM" , "ZZSXMC" , "GDDB" , "FRDBS" , "CZCSXM" , "MSSM" , "HDMC" } ;
paramClass . GPType = EnumGPType . Dissolve ;
GPHelper . Instance . ExeGPForProces ( paramClass , ref DissolveAnalysisFeatureLayer ) ;
//(LaySourceHelper.GxTbLayer.FeatureClass as ITable).DeleteSearchedRows(null);
IFeatureClassAPI fcAPI = new FeatureClassAPI ( DissolveAnalysisFeatureLayer . FeatureClass ) ;
fcAPI . FcToFc ( LaySourceHelper . GxTbLayer . FeatureClass , null , false ) ;
}
# endregion
IFeatureLayer tempGcLayer = null ;
paramClass = new GPParamClass ( ) ;
paramClass . FirstFeatureLayer = LaySourceHelper . GxgcTBLayer ;
paramClass . GPType = EnumGPType . SelectLayerByAttribute ;
paramClass . IsGetOutPutFeature = true ;
paramClass . Where_clause = "BGXW = '2' and (BGHDLBM ='1001' or BGHDLBM ='1002' or BGHDLBM ='1003' or BGHDLBM='1004' or BGHDLBM ='1006' or BGHDLBM='1009' or BGHDLBM='1101' or BGHDLBM='1107' or BGHDLBM='1107A')" ;
paramClass . FcName = "TempGC" ;
paramClass . TempGDBPath = TempGDbPath ;
GPHelper . Instance . ExeGPForProces ( paramClass , ref tempGcLayer ) ;
IFeatureClassAPI BgTbFcAPI = wsAPI1 . OpenFeatureClass ( "DLTBBG" ) ;
IFeatureLayer tempGcEraseLayer = null ;
paramClass . FirstFeatureLayer = tempGcLayer ;
paramClass . SecondFeatureLayer = new FeatureLayerClass ( ) { FeatureClass = BgTbFcAPI . FeatureClass } ;
paramClass . OutFeatureClassPath = $"{TempGDbPath}\\TempGcErase" ;
paramClass . IsGetOutPutFeature = true ;
paramClass . GPType = EnumGPType . Erase ;
GPHelper . Instance . ExeGPForProces ( paramClass , ref tempGcEraseLayer ) ;
GXFcToFc ( BgTbFcAPI . FeatureClass , LaySourceHelper . GxTbLayer . FeatureClass , new QueryFilterClass ( ) { WhereClause = "(DLBM ='1001' or DLBM ='1002' or DLBM ='1003' or DLBM='1004' or DLBM ='1006' or DLBM='1009' or DLBM='1101' or DLBM='1107' or DLBM='1107A') " } ) ;
GXFcToFc ( tempGcEraseLayer . FeatureClass , LaySourceHelper . GxTbLayer . FeatureClass , new QueryFilterClass ( ) { WhereClause = "BGHDLBM ='1001' or BGHDLBM ='1002' or BGHDLBM ='1003' or BGHDLBM='1004' or BGHDLBM ='1006' or BGHDLBM='1009' or BGHDLBM='1101' or BGHDLBM='1107' or BGHDLBM='1107A'" } ) ;
# endregion
}
catch ( Exception ex )
{
Console . WriteLine ( $"Err:异常---{ex.Message}" ) ;
Console . WriteLine ( $"Err:异常---{ex.StackTrace}" ) ;
throw ex ;
}
}
private IFeatureLayer ProcessBGTB ( DBLayerSourceHelper pLaySourceHelper , string pTempGDbPath )
{
IFeatureLayer result = null ;
try
{
#region 空属性值 赋值
#region 变更图斑
string BgtbName = ( pLaySourceHelper . BgTbLayer . FeatureClass as FeatureClass ) . BrowseName ;
//(pLaySourceHelper.BgTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {BgtbName} set KCDLBM =Null where KCDLBM is Null or KCDLBM=' ' or KCDLBM=' ' ");
//(pLaySourceHelper.BgTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {BgtbName} set KCXS=0 where KCXS is Null ");
//(pLaySourceHelper.BgTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {BgtbName} set GDLX =Null where GDLX is Null or GDLX=' ' or GDLX=' ' ");
//(pLaySourceHelper.BgTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {BgtbName} set GDPDJB =Null where GDPDJB is Null or GDPDJB=' ' or GDPDJB=' ' ");
//(pLaySourceHelper.BgTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {BgtbName} set XZDWKD=0 where XZDWKD is Null ");
//(pLaySourceHelper.BgTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {BgtbName} set TBXHDM =Null where TBXHDM is Null or TBXHDM=' ' or TBXHDM=' ' ");
//(pLaySourceHelper.BgTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {BgtbName} set TBXHMC =Null where TBXHMC is Null or TBXHMC=' ' or TBXHMC=' ' ");
//(pLaySourceHelper.BgTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {BgtbName} set ZZSXDM =Null where ZZSXDM is Null or ZZSXDM=' ' or ZZSXDM=' ' ");
//(pLaySourceHelper.BgTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {BgtbName} set ZZSXMC =Null where ZZSXMC is Null or ZZSXMC=' ' or ZZSXMC=' ' ");
//(pLaySourceHelper.BgTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {BgtbName} set GDDB =0 where GDDB is Null ");
//(pLaySourceHelper.BgTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {BgtbName} set FRDBS =Null where FRDBS is Null or FRDBS=' ' or FRDBS=' ' ");
//(pLaySourceHelper.BgTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {BgtbName} set CZCSXM =Null where CZCSXM is Null or CZCSXM=' ' or CZCSXM=' ' ");
//(pLaySourceHelper.BgTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {BgtbName} set MSSM =Null where MSSM is Null or MSSM=' ' or MSSM=' ' ");
//(pLaySourceHelper.BgTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {BgtbName} set HDMC =Null where HDMC is Null or HDMC=' ' or HDMC=' ' ");
# endregion
#region 基础地类图斑
string JC_DLTBName = ( pLaySourceHelper . JcTbLayer . FeatureClass as FeatureClass ) . BrowseName ;
//(pLaySourceHelper.JcTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {JC_DLTBName} set KCDLBM =Null where KCDLBM is Null or KCDLBM=' ' or KCDLBM=' ' ");
//(pLaySourceHelper.JcTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {JC_DLTBName} set KCXS =0 where KCXS is Null");
//(pLaySourceHelper.JcTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {JC_DLTBName} set GDLX =Null where GDLX is Null or GDLX=' ' or GDLX=' ' ");
//(pLaySourceHelper.JcTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {JC_DLTBName} set GDPDJB =Null where GDPDJB is Null or GDPDJB=' ' or GDPDJB=' ' ");
//(pLaySourceHelper.JcTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {JC_DLTBName} set XZDWKD =0 where XZDWKD is Null");
//(pLaySourceHelper.JcTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {JC_DLTBName} set TBXHDM =Null where TBXHDM is Null or TBXHDM=' ' or TBXHDM=' ' ");
//(pLaySourceHelper.JcTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {JC_DLTBName} set TBXHMC =Null where TBXHMC is Null or TBXHMC=' ' or TBXHMC=' ' ");
//(pLaySourceHelper.JcTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {JC_DLTBName} set ZZSXDM =Null where ZZSXDM is Null or ZZSXDM=' ' or ZZSXDM=' ' ");
//(pLaySourceHelper.JcTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {JC_DLTBName} set ZZSXMC =Null where ZZSXMC is Null or ZZSXMC=' ' or ZZSXMC=' ' ");
//(pLaySourceHelper.JcTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {JC_DLTBName} set GDDB =0 where GDDB is Null");
//(pLaySourceHelper.JcTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {JC_DLTBName} set FRDBS =Null where FRDBS is Null or FRDBS=' ' or FRDBS=' ' ");
//(pLaySourceHelper.JcTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {JC_DLTBName} set CZCSXM =Null where CZCSXM is Null or CZCSXM=' ' or CZCSXM=' ' ");
//(pLaySourceHelper.JcTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {JC_DLTBName} set MSSM =Null where MSSM is Null or MSSM=' ' or MSSM=' ' ");
//(pLaySourceHelper.JcTbLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL($"Update {JC_DLTBName} set HDMC =Null where HDMC is Null or HDMC=' ' or HDMC=' ' ");
# endregion
# endregion
GDPDExcute ( pLaySourceHelper , pTempGDbPath ) ;
}
catch ( Exception ex )
{
Console . WriteLine ( $"Err:变更前执行变更图斑数据处理失败:{ex.Message}" ) ;
Console . WriteLine ( $"Err:变更前执行变更图斑数据处理失败:{ex.StackTrace}" ) ;
if ( ex . Message . Contains ( "0x8004022D" ) ) //变更层数据被占用,无法获取锁
{
Console . WriteLine ( $"Err:问题原因可能是【变更图斑图层被占用,无法获取锁。】" ) ;
}
throw ex ;
}
return result ;
}
public virtual string CreateTempFile ( ThreadParam pType )
{
string result = string . Empty ;
try
{
string dbPath = System . IO . Path . Combine ( SysAppPath . GetCurrentAppPath ( ) , "Template\\Temp.db" ) ;
string TempFolder = pType . ProjInfo . ProjDir + $"\\DLTB\\" + pType . ThreadName ;
if ( ! Directory . Exists ( TempFolder ) )
Directory . CreateDirectory ( TempFolder ) ;
try
{
DelectDirect ( TempFolder ) ;
}
catch
{
//删除临时数据异常 不做处理
}
if ( ! Directory . Exists ( TempFolder ) )
{
Directory . CreateDirectory ( TempFolder ) ;
}
if ( File . Exists ( dbPath ) )
{
File . Copy ( dbPath , System . IO . Path . Combine ( TempFolder , pType . ThreadName + ".sqlite" ) ) ;
}
else
{
Console . WriteLine ( string . Format ( "文件{0}不存在!" , dbPath ) ) ;
}
result = TempFolder ;
}
catch ( Exception ex )
{
Console . WriteLine ( "创建临时数据库失败!" + ex . Message ) ;
throw ex ;
}
return result ;
}
private void CreateTempGDBForGP ( IFeatureLayer pJCDLTBLayer , IFeatureLayer pDLTBBGLayer , string pXZQDM , string pLocation )
{
object sev = null ;
//1-定义GeoProcessor对象
IGeoProcessor gp = new GeoProcessorClass ( ) ;
try
{
string StrFilter = string . Format ( "ZLDWDM like '{0}%'" , pXZQDM . ToTrim ( ) ) ;
//2-设置参数
gp . OverwriteOutput = true ;
string strPath = AppDomain . CurrentDomain . BaseDirectory ;
if ( ! strPath . EndsWith ( @"\" ) )
{
strPath + = @"\" ;
}
string toolPath = System . IO . Path . Combine ( strPath , @"Resource\ZLDatabaseTool" + ".tbx" ) ;
if ( ! System . IO . File . Exists ( toolPath ) )
{
throw new Exception ( "未找到预变更工具!" ) ;
}
//3-设置工具箱所在的路径
gp . AddToolbox ( toolPath ) ;
//4-设置输入参数
IVariantArray parameters = new VarArrayClass ( ) ;
parameters . Add ( pJCDLTBLayer ) ;
parameters . Add ( pDLTBBGLayer ) ;
parameters . Add ( StrFilter ) ;
parameters . Add ( pLocation ) ;
parameters . Add ( pXZQDM ) ;
//5-执行工具
IGeoProcessorResult result = gp . Execute ( "CreateTempGDB" , parameters , null ) ;
if ( result ! = null & & result . Status ! = esriJobStatus . esriJobSucceeded )
{
string ms = "" ;
if ( gp . MessageCount > 0 )
{
for ( int Count = 0 ; Count < = gp . MessageCount - 1 ; Count + + )
{
ms + = "$" + gp . GetMessage ( Count ) + "\n\n" ;
}
}
}
}
catch ( Exception ex )
{
throw ex ;
}
finally
{
if ( gp . MessageCount > 0 )
gp . GetMessages ( ref sev ) . ToString ( ) ;
}
}
public void CalculateArea ( object pParm )
{
//try
//{
// CalcAreaParm CalParm = pParm as CalcAreaParm;
// IFeatureLayer _Layer = GeoDBAPI.DeSerialzedPersist(CalParm.StrLayer) as IFeatureLayer;
// IFeatureCursor pCursor = _Layer.FeatureClass.Search(new QueryFilterClass() { SubFields = "OBJECTID,BSM,TBMJ,SHAPE" }, true);
// var _itbmj = _Layer.FeatureClass.FindField("TBMJ");
// var bsmIdx = _Layer.FeatureClass.FindField("BSM");
// IFeature feature = null;
// while ((feature = pCursor.NextFeature()) != null)
// {
// string bsm = feature.Value[bsmIdx].ToTrim();
// if (!CalParm.BsmList.Contains(bsm))
// continue;
// double area = GetEllipseArea(feature.ShapeCopy);
// lock (AreaList)
// {
// AreaList.Add(feature.OID, area.ToDouble());
// }
// }
//}
//catch (Exception ex)
//{
// //Console.WriteLine(ex.Message);
//}
}
public class CalcAreaParm
{
public string StrLayer { get ; set ; }
public int StartIndex { get ; set ; }
public List < string > BsmList { get ; set ; }
}
public DBLayerSourceHelper OpenDB ( ProjectInfo pPrjarm )
{
DBLayerSourceHelper result = new DBLayerSourceHelper ( ) ;
try
{
//LayerCfg layerInfo = null;
//if (pPrjarm != null && !string.IsNullOrWhiteSpace(pPrjarm.TempData))
//{
// byte[] contentArray = Convert.FromBase64String(pPrjarm.TempData);
// string LayerCfg = System.Text.Encoding.Default.GetString(contentArray);
// layerInfo = KGIS.Framework.Utils.SerializeAPI.DeserializeToObject<LayerCfg>(LayerCfg);
//}
//if (layerInfo == null)
//{
// throw new Exception("Err:获取图层信息失败!");
//}
//FileInfo fileInfo = new FileInfo(parm.PrjInfo.BGDatabase);
string PathBgDB = pPrjarm . BGDatabase ; // Path.Combine(, "BGDB" + ".gdb");
string PathZLDB = pPrjarm . ZLDatabase ;
string PathNMDB = pPrjarm . NMDatabase ;
result . BgWsAPI = new WorkspaceAPI ( PathBgDB , WorkspaceTypeEnum . GDBFile ) ;
if ( result . BgWsAPI . CurrentWorkspace = = null )
{
Console . WriteLine ( "打开变更数据库失败!" ) ;
return result ;
}
result . ZlWsAPI = new WorkspaceAPI ( PathZLDB , WorkspaceTypeEnum . GDBFile ) ;
if ( result . ZlWsAPI . CurrentWorkspace = = null )
{
Console . WriteLine ( "打开增量数据库失败!" ) ;
return result ;
}
result . NmWsAPI = new WorkspaceAPI ( PathNMDB , WorkspaceTypeEnum . GDBFile ) ;
IWorkspaceAPI JCAPI = new WorkspaceAPI ( pPrjarm . JCKPath , KGIS . Framework . AE . Enum . WorkspaceTypeEnum . GDBFile , true ) ;
result . JcTbLayer = new FeatureLayer ( ) { FeatureClass = JCAPI . OpenFeatureClass ( "DLTB" ) . FeatureClass , Name = "基础地类图斑" } ;
if ( result . JcTbLayer = = null )
{
throw new Exception ( "Err:获取年初地类图斑数据失败!" ) ;
}
try
{
result . JcPdtLayer = new FeatureLayer ( ) { FeatureClass = JCAPI . OpenFeatureClass ( "PDT" ) . FeatureClass , Name = "坡度图" } ;
}
catch ( Exception ex )
{
result . JcPdtLayer = null ;
}
result . BgTbLayer = result . OpenLayer ( result . BgWsAPI , "DLTBBG" ) ;
result . GxTbLayer = result . OpenLayer ( result . ZlWsAPI , "DLTBGX" ) ;
result . GxgcTBLayer = result . OpenLayer ( result . ZlWsAPI , "DLTBGXGC" ) ;
result . GxPdtLayer = result . OpenLayer ( result . ZlWsAPI , "PDTGX" ) ;
result . NmTbLayer = result . OpenLayer ( result . NmWsAPI , "DLTB_NMK" ) ;
return result ;
}
catch ( Exception ex )
{
throw ex ;
}
}
private IWorkspace CreateDBWorkspace ( string pDbPath )
{
try
{
if ( ! File . Exists ( pDbPath ) )
{
Console . WriteLine ( string . Format ( "指定的文件路径{0}不存在!" , pDbPath ) ) ;
return null ;
}
IWorkspaceFactory pOutWorkFactory = null ;
pOutWorkFactory = new SqlWorkspaceFactoryClass ( ) ;
IWorkspace pOutWork = pOutWorkFactory . OpenFromFile ( pDbPath , 0 ) ;
return pOutWork ;
}
catch ( Exception ex )
{
Console . WriteLine ( $"Log:CreateDBWorkspace错误:{ex.Message}" ) ;
throw ;
}
}
public double GetEllipseArea ( IGeometry polygon )
{
try
{
// 1、获得投影
String SphName = polygon . SpatialReference . Name . ToString ( ) . ToUpper ( ) ;
// 2、获得椭球
ICoordinate coordinate = CoordinateFactory . CreateCoordinate ( ) ;
if ( SphName . Contains ( "XIAN_1980" ) | | SphName . Contains ( "XIAN1980" ) )
{
coordinate = CoordinateFactory . CreateCoordinate ( KGIS . Framework . AE . GaussCalculate . Spheroid . SphXian80 ) ;
}
else if ( SphName . Contains ( "BEIJING_1954" ) | | SphName . Contains ( "BEIJING1954" ) )
{
coordinate = CoordinateFactory . CreateCoordinate ( KGIS . Framework . AE . GaussCalculate . Spheroid . SphBeijing54 ) ;
}
else if ( SphName . Contains ( "WGS_1984" ) | | SphName . Contains ( "WGS1984" ) )
{
coordinate = CoordinateFactory . CreateCoordinate ( KGIS . Framework . AE . GaussCalculate . Spheroid . SphWGS84 ) ;
}
else if ( SphName . Contains ( "CGCS_2000" ) | | SphName . Contains ( "CGCS2000" ) )
{
coordinate = CoordinateFactory . CreateCoordinate ( KGIS . Framework . AE . GaussCalculate . Spheroid . SphCGCS2000 ) ;
}
else
{
return - 1 ;
}
// 3、计算面积
IGeometry pGeometry = polygon as IGeometry ;
double PolygonArea = 0.0 ;
// 4、保留两位小数
PolygonArea = Math . Round ( coordinate . CalculateTerranArea ( pGeometry ) , 2 , MidpointRounding . AwayFromZero ) ;
return PolygonArea ;
}
catch ( Exception ex )
{
throw ex ;
}
}
public void GDPDExcute ( DBLayerSourceHelper pLaySourceHelper , string pTempGDbPath )
{
//IFeatureClassAPI GXAPI = null;
//IFeatureClassAPI pdtFcAPI = null;
IFeatureLayer PDTLayer = null ;
IFeature feature = null ;
IFeatureCursor cursor = null ;
IWorkspaceFactory pFtWsFct = null ;
IWorkspaceName workspaceName = null ;
IFeatureLayer unionLayer = null ;
IFeatureClassAPI unionFcAPI = null ;
try
{
Console . WriteLine ( "Msg:正在进行耕地坡度级别赋值,请稍后..." ) ;
#region 变更图斑层(GDB)
//// 获取变更图斑
//GXAPI = new FeatureClassAPI(BgTbLayer.FeatureClass);
//if (GXAPI == null || GXAPI.FeatureClass == null)
//{
// Console.WriteLine("Err:未获取到更新层图斑");
// return;
//}
# endregion
#region 坡度图层(MDB)
PDTLayer = pLaySourceHelper . GxPdtLayer ;
if ( pLaySourceHelper . GxPdtLayer = = null & & pLaySourceHelper . JcPdtLayer = = null )
{
Console . WriteLine ( "Warning:当前工程不存在坡度图图层!" ) ;
return ;
}
if ( PDTLayer . FeatureClass . FeatureCount ( null ) < = 0 )
{
PDTLayer = pLaySourceHelper . JcPdtLayer ;
}
if ( PDTLayer . FeatureClass . FeatureCount ( null ) < = 0 )
{
Console . WriteLine ( "Warning:当前工程中未导入坡度数据!" ) ;
return ;
}
# endregion
IWorkspaceAPI psTempWorkspaceAPI = new WorkspaceAPI ( pTempGDbPath , WorkspaceTypeEnum . GDBFile ) ;
IFeatureClassAPI tempdltbgxFeatureclassAPI = psTempWorkspaceAPI . CreateFeatureClass ( "TempDLTBGX" , ( pLaySourceHelper . BgTbLayer . FeatureClass as IGeoDataset ) . SpatialReference , pLaySourceHelper . BgTbLayer . FeatureClass . Fields ) ;
tempdltbgxFeatureclassAPI . AddField ( "OLDOBJECTID" , esriFieldType . esriFieldTypeInteger , "老OBJECTID" ) ;
IFeatureClass tempdltbgxFC = tempdltbgxFeatureclassAPI . FeatureClass ;
Dictionary < int , int > fieldsDic = new Dictionary < int , int > ( ) ;
for ( int i = 0 ; i < tempdltbgxFC . Fields . FieldCount ; i + + )
{
IField field = tempdltbgxFC . Fields . Field [ i ] ;
if ( field . Name = = tempdltbgxFC . ShapeFieldName | | field . Name . Contains ( tempdltbgxFC . ShapeFieldName ) | | field . Name = = tempdltbgxFC . OIDFieldName | | ! field . Editable ) continue ;
if ( ! "DLBM,GDLX,GDDB,GDPDJB,KCXS" . Contains ( field . Name ) ) continue ;
int index = - 1 ;
index = pLaySourceHelper . BgTbLayer . FeatureClass . Fields . FindField ( field . Name ) ;
if ( index = = - 1 )
index = pLaySourceHelper . BgTbLayer . FeatureClass . Fields . FindFieldByAliasName ( field . AliasName ) ;
if ( index = = - 1 )
continue ;
fieldsDic . Add ( i , index ) ;
}
if ( fieldsDic . Count = = 0 )
return ;
IFeatureBuffer buffer = tempdltbgxFC . CreateFeatureBuffer ( ) ;
IFeatureCursor tempgxCursor = tempdltbgxFC . Insert ( true ) ;
int oldOIDIndex = tempdltbgxFC . FindField ( "OLDOBJECTID" ) ;
if ( oldOIDIndex = = - 1 )
return ;
IQueryFilter queryfilter = new QueryFilterClass ( ) ;
queryfilter . WhereClause = string . Format ( "DLBM like '01%' " ) ;
int gdCount = pLaySourceHelper . BgTbLayer . FeatureClass . FeatureCount ( queryfilter ) ;
if ( gdCount = = 0 )
return ;
IFeature gxtbFeature = null ;
IFeatureCursor dltbgxCursor = pLaySourceHelper . BgTbLayer . FeatureClass . Search ( queryfilter , true ) ;
int OIDIndex = pLaySourceHelper . BgTbLayer . FeatureClass . FindField ( "OBJECTID" ) ;
int num = 0 ;
while ( ( gxtbFeature = dltbgxCursor . NextFeature ( ) ) ! = null )
{
num + + ;
if ( gxtbFeature . ShapeCopy . IsEmpty ) continue ;
buffer . Shape = gxtbFeature . ShapeCopy ;
foreach ( int item in fieldsDic . Keys )
{
if ( string . IsNullOrWhiteSpace ( gxtbFeature . Value [ fieldsDic [ item ] ] . ToTrim ( ) ) )
buffer . Value [ item ] = DBNull . Value ;
buffer . Value [ item ] = gxtbFeature . Value [ fieldsDic [ item ] ] ;
}
buffer . Value [ oldOIDIndex ] = gxtbFeature . Value [ OIDIndex ] ;
tempgxCursor . InsertFeature ( buffer ) ;
if ( num % 1 0 0 0 = = 0 )
{
tempgxCursor . Flush ( ) ;
}
Marshal . ReleaseComObject ( gxtbFeature ) ;
}
tempgxCursor . Flush ( ) ;
//DLTBGX与PDTGX 相交
GPParamClass gPParamClass = new GPParamClass ( ) ;
gPParamClass . FirstFeatureLayer = new FeatureLayerClass ( ) { FeatureClass = tempdltbgxFC } ; // pLaySourceHelper.BgTbLayer;
gPParamClass . SecondFeatureLayer = PDTLayer ;
gPParamClass . OutFeatureClassPath = pTempGDbPath + "\\TB_PD" ;
gPParamClass . IsGetOutPutFeature = true ;
gPParamClass . GPType = EnumGPType . Identify ;
GPHelper . Instance . ExeGPForProces ( gPParamClass , ref unionLayer ) ;
unionFcAPI = new FeatureClassAPI ( unionLayer . FeatureClass ) ;
cursor = unionFcAPI . FeatureClass . Search ( null , true ) ;
feature = null ;
Dictionary < int , string > DicPDJB = new Dictionary < int , string > ( ) ;
Dictionary < int , double > DicMJ = new Dictionary < int , double > ( ) ;
Dictionary < int , List < PDJBModel > > DicPDJB_MJ = new Dictionary < int , List < PDJBModel > > ( ) ;
int idxOID = unionFcAPI . FeatureClass . FindField ( "OLDOBJECTID" ) ;
if ( idxOID = = - 1 )
{
return ;
}
int idxArea = unionFcAPI . FeatureClass . FindField ( "SHAPE_AREA" ) ;
int idxPDJB = unionFcAPI . FeatureClass . FindField ( "PDJB" ) ;
while ( ( feature = cursor . NextFeature ( ) ) ! = null )
{
int oid = Convert . ToInt32 ( feature . Value [ idxOID ] . ToTrim ( ) ) ;
double area = feature . Value [ idxArea ] . ToDouble ( 2 ) ;
string pdjb = feature . Value [ idxPDJB ] . ToTrim ( ) ;
if ( ! DicPDJB_MJ . ContainsKey ( oid ) )
{
DicPDJB_MJ . Add ( oid , new List < PDJBModel > ( ) { new PDJBModel ( ) { PDJB = pdjb , MJ = area } } ) ;
}
else
{
List < PDJBModel > list = DicPDJB_MJ [ oid ] ;
PDJBModel pdjbMod = list . FirstOrDefault ( f = > f . PDJB = = pdjb ) ;
if ( pdjbMod = = null )
{
list . Add ( new PDJBModel ( ) { PDJB = pdjb , MJ = area } ) ;
}
else
{
pdjbMod . MJ + = area ;
}
DicPDJB_MJ [ oid ] = list ;
}
if ( ! DicMJ . ContainsKey ( oid ) )
{
DicMJ . Add ( oid , area ) ;
DicPDJB . Add ( oid , pdjb ) ;
}
else if ( DicMJ [ oid ] < area )
{
DicMJ [ oid ] = area ;
DicPDJB [ oid ] = pdjb ;
}
}
cursor = pLaySourceHelper . BgTbLayer . FeatureClass . Update ( new QueryFilter ( ) { WhereClause = "DLBM like '01%' " } , false ) ;
int Objectid_GX = pLaySourceHelper . BgTbLayer . FeatureClass . FindField ( "objectid" ) ;
int BSM_GX = pLaySourceHelper . BgTbLayer . FeatureClass . FindField ( "BSM" ) ;
int GDPDJB_GX = pLaySourceHelper . BgTbLayer . FeatureClass . FindField ( "GDPDJB" ) ;
int GDLX_GX = pLaySourceHelper . BgTbLayer . FeatureClass . FindField ( "GDLX" ) ;
int idxKCXS = pLaySourceHelper . BgTbLayer . FeatureClass . FindField ( "KCXS" ) ;
int DLBM_GX = pLaySourceHelper . BgTbLayer . FeatureClass . FindField ( "DLBM" ) ;
int GDPDJBIndex = PDTLayer . FeatureClass . FindField ( "PDJB" ) ;
var count = pLaySourceHelper . BgTbLayer . FeatureClass . FeatureCount ( new QueryFilter ( ) { WhereClause = "DLBM like '01%' " } ) ;
var featurecount = 0 ;
while ( ( feature = cursor . NextFeature ( ) ) ! = null )
{
featurecount + + ;
if ( featurecount % 5 0 0 = = 0 )
{
Console . WriteLine ( $"Msg:正在进行耕地坡度赋值...【{featurecount}/{count}】" ) ;
}
string pdjb = string . Empty ;
if ( ! DicPDJB_MJ . ContainsKey ( feature . OID ) )
{
continue ;
}
double tempmj = feature . Value [ feature . Fields . FindField ( "SHAPE_AREA" ) ] . ToDouble ( 0 ) ;
List < PDJBModel > list = DicPDJB_MJ [ feature . OID ] ;
list = list . OrderByDescending ( o = > o . MJ ) . ToList ( ) ;
pdjb = list [ 0 ] . PDJB ; //[feature.OID];
feature . Value [ GDPDJB_GX ] = pdjb ;
string dlbm = feature . Value [ DLBM_GX ] . ToString ( ) ;
string bghbsm = feature . Value [ BSM_GX ] . ToString ( ) ;
string UpdateGCSql = string . Empty ;
string strGDLX = feature . Value [ GDLX_GX ] . ToTrim ( ) ;
if ( pdjb = = "1" )
{
strGDLX = "" ;
}
else
if ( ! string . IsNullOrWhiteSpace ( dlbm ) & & "2,3,4,5" . Contains ( pdjb ) & & string . IsNullOrWhiteSpace ( strGDLX ) )
{
string kcxsKey1 = string . Format ( "{0}-{1}" , "TT" , pdjb ) ;
double xs1 = 0 ;
if ( Parm . KCXSDic . ContainsKey ( kcxsKey1 ) )
{
xs1 = Parm . KCXSDic [ kcxsKey1 ] . ToDouble ( ) ;
}
string kcxsKey2 = string . Format ( "{0}-{1}" , "PD" , pdjb ) ;
double xs2 = 0 ;
if ( Parm . KCXSDic . ContainsKey ( kcxsKey2 ) )
{
xs2 = Parm . KCXSDic [ kcxsKey2 ] . ToDouble ( ) ;
}
if ( xs1 = = 0 & & xs2 ! = 0 )
{
strGDLX = "PD" ;
}
else if ( xs1 ! = 0 & & xs2 = = 0 )
{
strGDLX = "TT" ;
}
else
{
if ( dlbm = = "0101" )
{
strGDLX = "TT" ;
}
else if ( "0102,0103" . Contains ( dlbm ) )
{
strGDLX = "PD" ;
}
}
}
string kcxsKey = string . Format ( "{0}-{1}" , strGDLX , pdjb ) ;
if ( Parm . KCXSDic . ContainsKey ( kcxsKey ) )
{
feature . Value [ idxKCXS ] = Parm . KCXSDic [ kcxsKey ] . ToDouble ( ) ;
}
feature . Value [ GDLX_GX ] = strGDLX ;
cursor . UpdateFeature ( feature ) ;
Marshal . ReleaseComObject ( feature ) ;
}
}
catch ( Exception ex )
{
Console . WriteLine ( "Warning:耕地坡度级别赋值异常:" + ex . Message ) ;
Console . WriteLine ( "Warning:耕地坡度级别赋值异常:" + ex ) ;
}
finally
{
//ProgressHelper.CloseProcessBar();
if ( feature ! = null )
Marshal . ReleaseComObject ( feature ) ;
if ( cursor ! = null )
Marshal . ReleaseComObject ( cursor ) ;
if ( pFtWsFct ! = null )
Marshal . ReleaseComObject ( pFtWsFct ) ;
if ( workspaceName ! = null )
Marshal . ReleaseComObject ( workspaceName ) ;
if ( unionLayer ! = null )
Marshal . ReleaseComObject ( unionLayer ) ;
}
}
#region 面积平差
/// <summary>
/// 面积平差
/// </summary>
/// <param name="shpList">需要平差的对象集合</param>
/// <param name="pKZMJ">控制面积</param>
public void AreaAdjustment ( List < Adjustment > shpList , double pKZMJ )
{
try
{
if ( shpList . Count = = 1 )
{
shpList [ 0 ] . bgmj = pKZMJ ;
return ;
}
shpList = shpList . OrderByDescending ( o = > o . bgmj ) . ToList ( ) ;
double mjc = Math . Round ( shpList . Sum ( s = > s . bgmj ) - pKZMJ , 2 ) ;
//平差
while ( Math . Round ( mjc , 2 ) ! = 0 )
{
int tpsm = ( int ) ( Math . Abs ( Math . Round ( mjc , 2 ) ) / ( double ) 0.01 ) ;
int e = tpsm / shpList . Count ;
int f = tpsm % shpList . Count ;
if ( f ! = 0 )
{
double tpmj = ( e + 1 ) * 0.01 ;
for ( int i = 0 ; i < f ; i + + )
{
if ( mjc < 0 )
shpList [ i ] . bgmj = shpList [ i ] . bgmj + tpmj ;
else
shpList [ i ] . bgmj = shpList [ i ] . bgmj - tpmj ;
}
}
if ( e ! = 0 )
{
double tpmj = e * 0.01 ;
for ( int i = f ; i < shpList . Count ; i + + )
{
if ( mjc < 0 )
shpList [ i ] . bgmj = shpList [ i ] . bgmj + tpmj ;
else
shpList [ i ] . bgmj = shpList [ i ] . bgmj - tpmj ;
}
}
mjc = Math . Round ( shpList . Sum ( s = > s . bgmj ) , 2 ) - pKZMJ ;
}
}
catch ( Exception ex )
{
//LogAPI.Debug("面积平差错误:" + ex.Message);
throw ex ;
}
}
# endregion
#region GXGCFcToFc
public bool GXGCFcToFc ( IFeatureClass FeatureClass , IFeatureClass pFc , IQueryFilter pFilter , bool pIsCut , DataTable data_BSM , Dictionary < int , double > GXGCvaluePairs )
{
IFeatureCursor S_Cursor = null ;
IFeatureCursor T_Cursor = null ;
try
{
if ( FeatureClass = = null | | pFc = = null ) return false ;
//获取对应关系
Dictionary < int , int > dicField = new Dictionary < int , int > ( ) ;
Dictionary < int , int > dicField1 = new Dictionary < int , int > ( ) ;
Dictionary < string , int > dicFieldBGH = new Dictionary < string , int > ( ) ;
for ( int i = 0 ; i < pFc . Fields . FieldCount ; i + + )
{
IField field = pFc . Fields . Field [ i ] ;
if ( field . Name = = pFc . ShapeFieldName | | field . Name . Contains ( pFc . ShapeFieldName ) | | field . Name = = pFc . OIDFieldName | | ! field . Editable ) continue ;
int index = - 1 ;
if ( field . Name . Contains ( "BGQ" ) )
{
string fieldName = field . Name . Replace ( "BGQTB" , "" ) . Replace ( "BGQ" , "" ) ;
if ( "BGQTBBH,BGQTBMJ,BGQTBXHDM,BGQTBXHMC,BGQTBDLMJ" . Contains ( field . Name ) )
fieldName = field . Name . Replace ( "BGQ" , "" ) ;
index = FeatureClass . Fields . FindField ( $"{fieldName}_1" ) ;
if ( index = = - 1 )
index = FeatureClass . Fields . FindField ( fieldName ) ;
}
else
if ( field . Name . Contains ( "BGH" ) )
{
dicFieldBGH . Add ( field . Name , i ) ;
string fieldName = field . Name . Replace ( "BGHTB" , "" ) . Replace ( "BGH" , "" ) ;
if ( "BGHTBBH,BGHTBMJ,BGHTBXHDM,BGHTBXHMC,BGHTBDLMJ" . Contains ( field . Name ) )
fieldName = field . Name . Replace ( "BGH" , "" ) ;
index = FeatureClass . Fields . FindField ( fieldName ) ;
}
if ( index = = - 1 ) continue ;
dicField . Add ( i , index ) ;
string fName = field . Name . Replace ( "BGQTB" , "" ) . Replace ( "BGHTB" , "" ) . Replace ( "BGQ" , "" ) . Replace ( "BGH" , "" ) ;
index = FeatureClass . Fields . FindField ( $"{fName}_1" ) ;
if ( "BGQTBBH,BGQTBMJ,BGQTBXHDM,BGQTBXHMC,BGQTBDLMJ,BGHTBBH,BGHTBMJ,BGHTBXHDM,BGHTBXHMC,BGHTBDLMJ" . Contains ( field . Name ) )
fName = field . Name . Replace ( "BGH" , "" ) . Replace ( "BGQ" , "" ) ;
index = FeatureClass . Fields . FindField ( $"{fName}_1" ) ;
if ( index = = - 1 )
index = FeatureClass . Fields . FindField ( fName ) ;
if ( index = = - 1 ) continue ;
dicField1 . Add ( i , index ) ;
}
( pFc as ITable ) . DeleteSearchedRows ( null ) ;
string s = ( pFc as FeatureClass ) . Workspace . PathName ;
IFeatureClassLoad pFclsLoad = pFc as IFeatureClassLoad ;
if ( pFclsLoad ! = null )
pFclsLoad . LoadOnlyMode = true ;
//此处写编辑的代码
S_Cursor = FeatureClass . Search ( pFilter , true ) ;
IFeature f = null ;
T_Cursor = pFc . Insert ( true ) ;
IFeatureBuffer buffer = pFc . CreateFeatureBuffer ( ) ;
var iFID_DLTBBG = FeatureClass . FindField ( "FID_DLTBBG" ) ;
var iFID_DLTB = FeatureClass . FindField ( "FID_DLTB" ) ;
var ibgxw = pFc . FindField ( "BGXW" ) ;
var itbbgmj = pFc . FindField ( "TBBGMJ" ) ;
var ibgqkcxs = pFc . FindField ( "BGQKCXS" ) ;
var ibgqkcmj = pFc . FindField ( "BGQKCMJ" ) ;
var ibgqtbdlmj = pFc . FindField ( "BGQTBDLMJ" ) ;
var ibghkcxs = pFc . FindField ( "BGHKCXS" ) ;
var ibghkcmj = pFc . FindField ( "BGHKCMJ" ) ;
var ibghtbdlmj = pFc . FindField ( "BGHTBDLMJ" ) ;
var ibsm = pFc . FindField ( "BSM" ) ;
var igxsj = pFc . FindField ( "GXSJ" ) ;
var idxBGHTBBH = pFc . FindField ( "BGHTBBH" ) ;
var idxJCTBBH = FeatureClass . FindField ( "TBBH_1" ) ;
if ( idxJCTBBH = = - 1 )
idxJCTBBH = FeatureClass . FindField ( "TBBH" ) ;
var tbbgmj = 0.00 ;
int bsm = 1 ;
while ( ( f = S_Cursor . NextFeature ( ) ) ! = null )
{
if ( GXGCvaluePairs . ContainsKey ( f . OID ) )
{
tbbgmj = GXGCvaluePairs [ f . OID ] ;
//if (tbbgmj == 0) continue;
}
var FID_DLTBBG = f . Value [ iFID_DLTBBG ] . ToString ( ) ;
var FID_DLTB = f . Value [ iFID_DLTB ] . ToString ( ) ;
var row = data_BSM . Select ( $"FID_DLTBBG={FID_DLTBBG} and FID_DLTB={FID_DLTB} " ) ;
if ( row = = null | | row . Length = = 0 ) continue ;
buffer . Shape = f . ShapeCopy ;
if ( pFilter is ISpatialFilter & & pIsCut )
{
if ( FeatureAPI . IsInterSect ( ( pFilter as ISpatialFilter ) . Geometry , f . ShapeCopy ) )
{
buffer . Shape = FeatureAPI . InterSect ( f . ShapeCopy , ( pFilter as SpatialFilterClass ) . Geometry ) ;
}
else
{
continue ;
}
}
if ( FID_DLTBBG = = "-1" )
{
foreach ( int item in dicField1 . Keys ) //被动变更的图斑 变更前后属性相同
{
try
{
if ( f . Value [ dicField1 [ item ] ] . ToString ( ) . Contains ( " " ) | | f . Value [ dicField1 [ item ] ] is DBNull )
{
buffer . Value [ item ] = f . Value [ dicField1 [ item ] ] . ToTrim ( ) ;
}
else
{
buffer . Value [ item ] = f . Value [ dicField1 [ item ] ] ;
}
//buffer.Value[item] = f.Value[dicField1[item]].ToTrim();
}
catch
{
buffer . Value [ item ] = f . Value [ dicField1 [ item ] ] ;
}
}
}
else
{
foreach ( int item in dicField . Keys )
{
try
{
buffer . Value [ item ] = f . Value [ dicField [ item ] ] ;
}
catch
{
buffer . Value [ item ] = f . Value [ dicField [ item ] ] ;
}
}
}
if ( idxJCTBBH ! = - 1 )
buffer . Value [ idxBGHTBBH ] = f . Value [ idxJCTBBH ] ;
buffer . Value [ ibgxw ] = row [ 0 ] [ "BGXW" ] ;
if ( GXGCvaluePairs . ContainsKey ( f . OID ) )
tbbgmj = GXGCvaluePairs [ f . OID ] ;
else
tbbgmj = row [ 0 ] [ "TBMJ_1" ] . ToDouble ( ) ;
buffer . Value [ itbbgmj ] = Math . Round ( tbbgmj , 2 ) ; //图斑变更面积
buffer . Value [ ibgqkcmj ] = Math . Round ( buffer . Value [ ibgqkcxs ] . ToDouble ( ) * tbbgmj , 2 ) ; //变更前扣除面积
buffer . Value [ ibgqtbdlmj ] = tbbgmj - Math . Round ( buffer . Value [ ibgqkcxs ] . ToDouble ( ) * tbbgmj , 2 ) ; //变更前图斑地类面积
buffer . Value [ ibghkcmj ] = Math . Round ( buffer . Value [ ibghkcxs ] . ToDouble ( ) * tbbgmj , 2 ) ; //变更后扣除面积
buffer . Value [ ibghtbdlmj ] = tbbgmj - Math . Round ( buffer . Value [ ibghkcxs ] . ToDouble ( ) * tbbgmj , 2 ) ; //变更后图斑地类面积
buffer . Value [ ibsm ] = $"{Parm.PrjInfo.CODE}2111{(bsm++).ToString().PadLeft(8, '0')}" ;
buffer . Value [ igxsj ] = new DateTime ( DateTime . Now . Year - 1 , 1 2 , 3 1 ) ;
T_Cursor . InsertFeature ( buffer ) ;
}
T_Cursor . Flush ( ) ;
if ( pFclsLoad ! = null )
pFclsLoad . LoadOnlyMode = false ;
return true ;
}
catch ( Exception ex )
{
throw ex ;
}
}
# endregion
#region GXFcToFc
public bool GXFcToFc ( IFeatureClass FeatureClass , IFeatureClass pFc , IQueryFilter pFilter )
{
IFeatureCursor S_Cursor = null ;
IFeatureCursor T_Cursor = null ;
try
{
if ( FeatureClass = = null | | pFc = = null ) return false ;
Dictionary < int , int > dicField = new Dictionary < int , int > ( ) ;
int index = - 1 ;
for ( int i = 0 ; i < pFc . Fields . FieldCount ; i + + )
{
IField field = pFc . Fields . Field [ i ] ;
if ( field . Name = = pFc . ShapeFieldName | | field . Name . Contains ( pFc . ShapeFieldName ) | | field . Name = = pFc . OIDFieldName | | ! field . Editable | | field . Name . ToUpper ( ) = = "TBYBH" ) continue ;
index = FeatureClass . Fields . FindField ( $"BGH{field.Name}" ) ;
if ( index = = - 1 )
index = FeatureClass . Fields . FindField ( $"BGHTB{field.Name}" ) ;
if ( index = = - 1 )
index = FeatureClass . Fields . FindField ( field . Name ) ;
if ( index = = - 1 ) continue ;
dicField . Add ( i , index ) ;
}
IFeatureClassLoad pFclsLoad = pFc as IFeatureClassLoad ;
if ( pFclsLoad ! = null )
pFclsLoad . LoadOnlyMode = true ;
//此处写编辑的代码
S_Cursor = FeatureClass . Search ( pFilter , true ) ;
IFeature f = null ;
T_Cursor = pFc . Insert ( true ) ;
IFeatureBuffer buffer = pFc . CreateFeatureBuffer ( ) ;
while ( ( f = S_Cursor . NextFeature ( ) ) ! = null )
{
buffer . Shape = f . ShapeCopy ;
foreach ( int item in dicField . Keys )
{
buffer . Value [ item ] = f . Value [ dicField [ item ] ] ;
}
T_Cursor . InsertFeature ( buffer ) ;
}
T_Cursor . Flush ( ) ;
if ( pFclsLoad ! = null )
pFclsLoad . LoadOnlyMode = false ;
return true ;
}
catch ( Exception ex )
{
throw ex ;
}
}
# endregion
#region FcToFc
public bool FcToFc ( IFeatureClass FeatureClass , IFeatureClass pFc , IQueryFilter pFilter )
{
IFeatureCursor S_Cursor = null ;
IFeatureCursor T_Cursor = null ;
try
{
if ( FeatureClass = = null | | pFc = = null ) return false ;
Dictionary < int , int > dicField = new Dictionary < int , int > ( ) ;
int index = - 1 ;
for ( int i = 0 ; i < pFc . Fields . FieldCount ; i + + )
{
IField field = pFc . Fields . Field [ i ] ;
if ( field . Name = = pFc . ShapeFieldName | | field . Name . Contains ( pFc . ShapeFieldName ) | | field . Name = = pFc . OIDFieldName | | ! field . Editable ) continue ;
index = FeatureClass . Fields . FindField ( $"{field.Name}" ) ;
if ( index = = - 1 )
continue ;
dicField . Add ( i , index ) ;
}
IFeatureClassLoad pFclsLoad = pFc as IFeatureClassLoad ;
if ( pFclsLoad ! = null )
pFclsLoad . LoadOnlyMode = true ;
//此处写编辑的代码
S_Cursor = FeatureClass . Search ( pFilter , true ) ;
IFeature f = null ;
IFeatureBuffer buffer = pFc . CreateFeatureBuffer ( ) ;
T_Cursor = pFc . Insert ( true ) ;
while ( ( f = S_Cursor . NextFeature ( ) ) ! = null )
{
buffer . Shape = f . ShapeCopy ;
foreach ( int item in dicField . Keys )
{
buffer . Value [ item ] = f . Value [ dicField [ item ] ] ;
}
T_Cursor . InsertFeature ( buffer ) ;
}
T_Cursor . Flush ( ) ;
if ( pFclsLoad ! = null )
pFclsLoad . LoadOnlyMode = false ;
return true ;
}
catch ( Exception )
{
throw ;
}
}
# endregion
}
//public class Adjustment
//{
// public int ID { get; set; }
// public double bgmj { get; set; }
//}
//public class PDJBModel
//{
// public string PDJB { get; set; }
// public double MJ { get; set; }
//}
public class ThreadParam
{
public string ThreadName { get ; set ; }
public List < string > Codes { get ; set ; }
public ProjectInfo ProjInfo { get ; set ; }
public string StrBgTbLayer { get ; set ; }
public string StrJcTbLayer { get ; set ; }
public List < LayerCfg > Layers { get ; set ; }
}
}