📄 clsprocstat.cs
字号:
using System;
using System.Collections.Generic;
using System.Text;
using dist.hb.EnvQueryStat.Pub;
using ESRI.ArcGIS.Carto;
using System.Data;
using System.Data.OleDb;
using ESRI.ArcGIS.Geodatabase;
namespace dist.hb.EnvQueryStat.Stat
{
/// <summary>
/// 主分组是地图时,进行地图统计
/// </summary>
class clsProcStat
{
public clsStatEnv StatEnv;
public clsCreateStatTable StatTable;
public clsProcStat()
{
StatEnv = null;
StatTable = new clsCreateStatTable();
}
public void Stat()
{
if (StatEnv == null) return;
StatTable.StatEnv = StatEnv;
StatTable.Initialize();
Stat1();
Stat2();
Stat3();
}
#region "处理情况1:主分组为地图,目标图层与分组图层不相同,还有次分组"
private bool Stat1()
{
if (StatEnv == null || StatTable == null || StatEnv.MapControl == null) return false;
if (StatEnv.MainGroupType != 0) return false;//0表示,主分组为地图
if (StatTable.MainGroupList == null || StatTable.StatItemList == null) return false;
if (StatTable.MainGroupList.Count == 0 || StatTable.StatItemList.Count == 0) return false;
string StatLayerName = StatEnv.ProcAttFilter.StatTemplateInfo.strLayerName;
if (StatEnv.MainGroupItem.ToLower() == StatLayerName) return false;//分组的图层与统计的图层相同
//获取要统计的地图要素,通过该要素统计该要素内的统计对象的编码
LayerInfoArray LayerInfoList = new LayerInfoArray();
LayerBaseInfo LayerInfo = LayerInfoList.GetLayerInfo(StatEnv.MainGroupItem);
if (LayerInfo == null) return false;
IFeatureLayer FLayer = clsGISPub.FindFeatureLayer(StatEnv.MapControl.Map, LayerInfo.LayerName);//分组图层
if(FLayer == null) return false;
string code = "";
foreach (myItemInfo var in StatTable.MainGroupList)
{
if(code == "") code = var.ItemCode;
else code = code +"," + var.ItemCode;
}
string SQL = LayerInfo.codeField + " in (" + code + ")";
IFeatureCursor FCursor = clsGISPub.SearchFeature(FLayer.FeatureClass, SQL);
if (FCursor == null) return false;
if(StatEnv.ProcAttFilter.StatTemplateInfo == null) return false;
string statLayerName = StatEnv.ProcAttFilter.StatTemplateInfo.strLayerName;
IFeatureLayer StatLayer = clsGISPub.FindFeatureLayer(StatEnv.MapControl.Map, statLayerName);
if (StatLayer == null) return false;
LayerInfo = LayerInfoList.GetLayerInfo(statLayerName);////这里是统计图层,注意与“分组图层”区分
int GroupCodeField = StatLayer.FeatureClass.Fields.FindField(LayerInfo.codeField);
int GroupNameField = StatLayer.FeatureClass.Fields.FindField(LayerInfo.nameField);
while (true)//对分组的图层进行循环,统计每一个行政区划内的具体的查询图层的编码,在具体地进行属性统计
{
IFeature Feat = FCursor.NextFeature();
if (Feat == null) break;
string GroupCode = Feat.get_Value(GroupCodeField).ToString();
string GroupName = Feat.get_Value(GroupNameField).ToString();
IFeatureCursor StatCursor = clsGISPub.InSearch(StatLayer.FeatureClass, Feat.ShapeCopy, "", esriSpatialRelEnum.esriSpatialRelIntersects);
if (StatCursor == null) break;
int iCodeField = StatCursor.Fields.FindField(StatEnv.ProcAttFilter.StatTemplateInfo.strSpaceField);//空间统计图层的编码字段
code = "";
while(true)
{
IFeature TempFeat = StatCursor.NextFeature();
if (TempFeat == null) break;
if (code == "") code = "'" + TempFeat.get_Value(iCodeField).ToString() + "'";
else code = code + ",'" + TempFeat.get_Value(iCodeField).ToString() + "'";
}
///////////////统计一个行政区划////////////////////////////////////////////
StatOnCode(GroupCode, GroupName, code);
}
return true;
}
//按一个行政区划,将其下的所有代码进行分类统计
private bool StatOnCode(string GroupCode, string GroupName, string code)
{
if (StatEnv == null || StatEnv.ProcAttFilter == null || StatTable == null) return false;
if (code.Trim() == "") return false;
string view = StatEnv.ProcAttFilter.StatTemplateInfo.strVName;
string ViewCode = StatEnv.ProcAttFilter.StatTemplateInfo.strAttField;
clsProcAttWhere ProcWhere = new clsProcAttWhere();
ProcWhere.StatEnv = StatEnv;
string sAttWhere = ProcWhere.GetAttWhere(true);////????
//如果没有次分组
if (StatEnv.SecondGroupField.Trim() == "" || StatTable.SecondGroupList == null || StatTable.SecondGroupList.Count == 0)
{
string SQL;
SQL = "SELECT " + MakeStatField() + " FROM " + view + " WHERE "
+ ViewCode + " in (" + code + ")";
if(sAttWhere.Trim() != "") SQL += " and " + sAttWhere;
saveStat1(GroupCode, GroupName, SQL);
}
else//有次分组
{
string Second = "";
foreach (myItemInfo var in StatTable.SecondGroupList)
{
if (Second == "") Second = "'" + var.ItemCode + "'";
else Second += ",'" + var.ItemCode + "'";
}
string SecondGroupField = StatEnv.ProcAttFilter.GetFieldName(StatEnv.SecondGroupField);
Second = SecondGroupField + " in(" + Second + ")";
string SQL;
SQL = "SELECT " + SecondGroupField + "," + MakeStatField() + " FROM " + view + " WHERE "
+ ViewCode + " in (" + code + ") and " + Second;
if (sAttWhere.Trim() != "") SQL += " and " + sAttWhere;
SQL = SQL + " GROUP BY " + SecondGroupField;
saveStat2(GroupCode, GroupName, SQL);
}
return true;
}
//处理一条统计好的记录(没有group by的分组)
private bool saveStat1(string GroupCode, string GroupName, string SQL)//只有一条记录
{
clsDbPub.SaveTextToFile(SQL);
if (StatEnv == null || StatTable == null) return false;
DataTable dt = clsDbPub.GetDataTable(StatEnv.DbConn, SQL);
if (dt == null || dt.Rows.Count == 0) return false;
DataRow dr = StatTable.workTable.NewRow();
clsProcMainGroupField procField = new clsProcMainGroupField();
procField.StatEnv = StatEnv;
dr[procField.GetMainFieldCode()] = GroupCode;
dr[procField.GetMainFieldName()] = GroupName;
for (int i = 0; i < dt.Columns.Count; i++)
{
string name = dt.Columns[i].ColumnName;
dr[name] = dt.Rows[0][name];
}
StatTable.workTable.Rows.Add(dr);
return true;
}
//处理一条统计好的记录(带有group by分组)
private bool saveStat2(string GroupCode, string GroupName, string SQL)//只有一条记录
{
clsDbPub.SaveTextToFile(SQL);
if (StatEnv == null || StatTable == null) return false;
DataTable dt = clsDbPub.GetDataTable(StatEnv.DbConn, SQL);
if (dt == null || dt.Rows.Count == 0) return false;
DataRow dr = StatTable.workTable.NewRow();
clsProcMainGroupField procField = new clsProcMainGroupField();
procField.StatEnv = StatEnv;
dr[procField.GetMainFieldCode()] = GroupCode;
dr[procField.GetMainFieldName()] = GroupName;
string AttCodeField = StatEnv.ProcAttFilter.StatTemplateInfo.strAttField;
string AttNameField = StatEnv.ProcAttFilter.StatTemplateInfo.strAttNameField;
string SecondGroupField = StatEnv.ProcAttFilter.GetFieldName(StatEnv.SecondGroupField);
for (int i = 0; i < dt.Rows.Count; i++)//myItemInfo var1 in SecondGroupList
{
string code = dt.Rows[i][SecondGroupField].ToString();
foreach (StatItem var in StatTable.StatItemList)
{
string ValueField = var.fieldName + "_" + code;
dr[ValueField] = dt.Rows[i][var.fieldName];
}
}
StatTable.workTable.Rows.Add(dr);
return true;
}
private string MakeStatField()
{
if(StatTable == null || StatTable.StatItemList == null) return "";
string item = "";
foreach (StatItem var in StatTable.StatItemList)
{
if (item == "") item = var.statMethod + "(" + var.fieldName + ") as " + var.fieldName;
else item += "," + var.statMethod + "(" + var.fieldName + ") as " + var.fieldName;
}
return item;
}
#endregion
#region "处理情况2:主分组为地图,目标图层与分组图层相同,还有次分组"
private bool Stat2()
{
if (StatEnv == null || StatTable == null || StatEnv.MapControl == null) return false;
if (StatEnv.MainGroupType != 0) return false;//0表示,主分组为地图
if (StatTable.MainGroupList == null || StatTable.StatItemList == null) return false;
if (StatTable.MainGroupList.Count == 0 || StatTable.StatItemList.Count == 0) return false;
string StatLayer = StatEnv.ProcAttFilter.StatTemplateInfo.strLayerName;
if (StatEnv.MainGroupItem.ToLower() != StatLayer) return false;//分组的图层与统计的图层相同
//获取要统计的地图要素,通过该要素统计该要素内的统计对象的编码
LayerInfoArray LayerInfoList = new LayerInfoArray();
LayerBaseInfo LayerInfo = LayerInfoList.GetLayerInfo(StatEnv.MainGroupItem);
if (LayerInfo == null) return false;
string code = "";
foreach (myItemInfo var in StatTable.MainGroupList)
{
if (code == "") code = "'" + var.ItemCode + "'";
else code = code + ",'" + var.ItemCode + "'";
}
string AttCodeField = StatEnv.ProcAttFilter.StatTemplateInfo.strAttField;
string AttNameField = StatEnv.ProcAttFilter.StatTemplateInfo.strAttNameField;
string MainGroup = AttCodeField + " in (" + code + ")";
string view = StatEnv.ProcAttFilter.StatTemplateInfo.strVName;
clsProcAttWhere ProcWhere = new clsProcAttWhere();
ProcWhere.StatEnv = StatEnv;
string sAttWhere = ProcWhere.GetAttWhere(true);////????
//如果没有次分组
if (StatEnv.SecondGroupField.Trim() == "" || StatTable.SecondGroupList == null || StatTable.SecondGroupList.Count == 0)
{
string SQL;
SQL = "SELECT " + AttCodeField + "," + AttNameField + "," + MakeStatField() + " FROM " + view + " WHERE "
+ MainGroup;
if (sAttWhere.Trim() != "") SQL += " and " + sAttWhere;
SQL += " group by " + AttCodeField + "," + AttNameField;
saveStat3(SQL);//没有次分组,所有的统计记录
}
else//有次分组
{
string Second = "";
foreach (myItemInfo var in StatTable.SecondGroupList)
{
if (Second == "") Second = "'" + var.ItemCode + "'";
else Second += ",'" + var.ItemCode + "'";
}
string SecondGroupField = StatEnv.ProcAttFilter.GetFieldName(StatEnv.SecondGroupField);
Second = SecondGroupField + " in(" + Second + ")";
string SQL;
SQL = "SELECT " + AttCodeField + "," + AttNameField + ", " + SecondGroupField + "," + MakeStatField() + " FROM " + view + " WHERE "
+ MainGroup + " and " + Second;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -