clsspacialsel.cs
来自「以构建的方式来实现对通用的查询统计」· CS 代码 · 共 397 行 · 第 1/2 页
CS
397 行
pEnve = pDisplayTrans.VisibleBounds;
if(pEnve == null) return 0 ;
dbRealWidth = pEnve.Width;
return nScreenDist * (dbRealWidth / nScreenWidth);
}
public ArrayList QueryGeoOnDraw(IGeometry geo)//画几何体直接获取查询要素
{
if (m_MapQueryEnv == null || geo == null) return null;
if (m_MapQueryEnv.MapQueryMethod != MapQueryMethod.DRAW) return null;
IFeatureLayer FLayer = clsGISPub.FindFeatureLayer(m_MapQueryEnv.MapControl.Map, m_MapQueryEnv.QueryLayer);
if (FLayer == null)
{
MessageBox.Show("查询图层名:" + m_MapQueryEnv.QueryLayer + " 没有找到!");
return null;
}
IFeatureCursor FCursor = clsGISPub.InSearch(FLayer.FeatureClass, geo, "", ESRI.ArcGIS.Geodatabase.esriSpatialRelEnum.esriSpatialRelIntersects);
if (FCursor == null) return null;
ArrayList AList = new ArrayList();
SaveQueryGeo(AList, FCursor);
return AList;
}
//处理在地图上选择几何体*
public ArrayList SelectGeosOnMap(IGeometry pEnv)
{
if (m_MapQueryEnv == null || pEnv == null) return null;
if (m_MapQueryEnv.MapQueryMethod != MapQueryMethod.SELECT) return null;
IFeatureLayer FLayer = clsGISPub.FindFeatureLayer(m_MapQueryEnv.MapControl.Map, m_MapQueryEnv.SelLayer);
if(FLayer == null)
{
MessageBox.Show("图层名:" + m_MapQueryEnv.SelLayer + " 没有找到!");
return null;
}
if (pEnv == null) return null;
IFeatureCursor FCursor = clsGISPub.InSearch(FLayer.FeatureClass, pEnv, "", ESRI.ArcGIS.Geodatabase.esriSpatialRelEnum.esriSpatialRelIntersects);
if(FCursor == null) return null;
//如果搜索的图层与查询的图层是一个,则直接返回选择的几何体
ArrayList AList = new ArrayList ();
if (m_MapQueryEnv.SelLayer == m_MapQueryEnv.QueryLayer)
{
SaveQueryGeo(AList,FCursor);
return AList;
}
else//如果不是同一个图层,则要用选择的几何体去一一地搜索要查询的几何体
{
IFeatureLayer QueryLayer = clsGISPub.FindFeatureLayer(m_MapQueryEnv.MapControl.Map, m_MapQueryEnv.QueryLayer);
if (QueryLayer == null) return null;
while(true)
{
IFeature Feat = FCursor.NextFeature();
if(Feat == null) break;
IGeometry pGeo;
pGeo = Feat.ShapeCopy;
double dbBufferR = GetBufferR();
if (dbBufferR > BaseDataDef.ZERO) pGeo = BufferFeature(pGeo, dbBufferR);//需要再次地BUFFER.
IFeatureCursor NewFCursor = clsGISPub.InSearch(QueryLayer.FeatureClass, pGeo, "", ESRI.ArcGIS.Geodatabase.esriSpatialRelEnum.esriSpatialRelIntersects);
SaveQueryGeo(AList, NewFCursor);
}
return AList;
}
}
//将要查询的几何体的编号保存到list中
private void SaveQueryGeo(ArrayList lst, IFeatureCursor FCursor)
{
if (lst == null || FCursor == null) return;
int iFIndex = FCursor.Fields.FindField(m_MapQueryEnv.SpacialField);
if(iFIndex < 0) return;
IFeatureLayer FLayer = clsGISPub.FindFeatureLayer(m_MapQueryEnv.MapControl.Map, m_MapQueryEnv.QueryLayer);//要查询的图层
if(FLayer == null) return;
while(true)
{
IFeature feat = FCursor.NextFeature();
if (feat == null) break;
string code = feat.get_Value(iFIndex).ToString();
if (!lst.Contains(code)) lst.Add(code);//避免重复包含
}
}
IFeatureCursor GetSelFeatsFromCode(ArrayList AList, string LayerOfCode)
{
IFeatureLayer FLayer = clsGISPub.FindFeatureLayer(m_MapQueryEnv.MapControl.Map, LayerOfCode);
if (FLayer == null) return null;
if(AList.Count == 0) return null;
string codeField = GetCodeFieldFromLayer(LayerOfCode);
string sql = "";
for (int i = 0; i < AList.Count; i++)
{
if (sql == "") sql = AList[i].ToString();
else sql = sql + " , "+ AList[i].ToString();
}
IQueryFilter2 queryFilter2 = new QueryFilterClass();
queryFilter2.WhereClause = codeField + " in ("+ sql + ")";
//Using a query filter to search a feature class:
return FLayer.Search(queryFilter2, false);
}
string GetCodeFieldFromLayer(string layerOfCode)
{
if (layerOfCode == XXQH_TYPE.CPROV) return "PROV_CODE";
else if(layerOfCode == XXQH_TYPE.CDIST) return "DIST_CODE";
else return "CNTY_CODE";
}
public bool SaveCodeToDB(ArrayList AList)
{
if (AList == null || m_MapQueryEnv == null) return false;
DeleteTempRecond();
DataSet ds = new DataSet();
string strSQL;
strSQL = "SELECT GUID, CODE FROM " + BaseDataDef.QueryStatTempTable + " WHERE GUID = '0'";
OleDbDataAdapter Adapter = new System.Data.OleDb.OleDbDataAdapter(strSQL, m_MapQueryEnv.DbConn);
OleDbCommandBuilder StatInstCB = new OleDbCommandBuilder(Adapter);
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = m_MapQueryEnv.DbConn;
//cmd.Transaction = m_tran;
cmd.CommandType = CommandType.Text;
cmd.CommandText = strSQL;
Adapter.SelectCommand = cmd;
Adapter.Fill(ds, BaseDataDef.QueryStatTempTable);
DataTable dt = ds.Tables[BaseDataDef.QueryStatTempTable];
for (int i = 0; i < AList.Count; i++)
{
DataRow dr = dt.NewRow();
dr["GUID"] = m_MapQueryEnv.GUID;
dr["CODE"] = AList[i].ToString();
dt.Rows.Add(dr);
}
Adapter.Update(ds, BaseDataDef.QueryStatTempTable);
return true;
}
//处理通过地区编码选择几何体
public ArrayList QueryAreaCode()
{
if (m_MapQueryEnv == null) return null;
if (m_MapQueryEnv.MapQueryMethod != MapQueryMethod.CODE) return null;
int iLevel;
if (m_MapQueryEnv.SelLayer == XXQH_TYPE.CPROV) iLevel = 1;
else if (m_MapQueryEnv.SelLayer == XXQH_TYPE.CDIST) iLevel = 2;
else iLevel = 3;
frmSelectXXQHbyATT frm = new frmSelectXXQHbyATT();
frm.mapControl = null;
frm.OleDbConn = m_MapQueryEnv.DbConn;
frm.iLevel = iLevel;
frm.FirstLayer = XXQH_TYPE.CPROV;
frm.SecondLayer = XXQH_TYPE.CDIST;
frm.ThirdLayer = XXQH_TYPE.CCNTY;
frm.FirstKeyField = "PROV_CODE";
frm.FirstNameField = "name";
frm.SecondKeyField = "DIST_CODE";
frm.SecondNameField = "name";
frm.ThirdKeyField = "CNTY_CODE";
frm.ThirdNameField = "name";
////frm.PrivCode = "110000";////通过这里来设置权限
//设置以前的选择
frm.ShowDialog();
//保存设置,如果查询图层就是选择图层,则直接保存编码;否则还要通过该编码的要素在查询图层上搜索
ArrayList AList = new ArrayList();
frm.SaveSel(AList);
if (m_MapQueryEnv.QueryLayer != m_MapQueryEnv.SelLayer)//选择的编码不是查询的图层,特殊处理
{
//获取编码对应的图层要素集
IFeatureCursor FCursor = GetSelFeatsFromCode(AList, m_MapQueryEnv.SelLayer);/////////
IFeatureLayer QueryLayer = clsGISPub.FindFeatureLayer(m_MapQueryEnv.MapControl.Map, m_MapQueryEnv.QueryLayer);
if (QueryLayer == null || FCursor == null) return null;
AList.Clear();
while (true)
{
IFeature Feat = FCursor.NextFeature();
if (Feat == null) break;
IGeometry pGeo;
pGeo = Feat.ShapeCopy;
double dbBufferR = GetBufferR();
if (dbBufferR > BaseDataDef.ZERO) pGeo = BufferFeature(pGeo, dbBufferR);//需要再次地BUFFER.
IFeatureCursor NewFCursor = clsGISPub.InSearch(QueryLayer.FeatureClass, pGeo, "", ESRI.ArcGIS.Geodatabase.esriSpatialRelEnum.esriSpatialRelIntersects);
SaveQueryGeo(AList, NewFCursor);
}
}
if (m_MapQueryEnv.IsSaveCodeToDb) SaveCodeToDB(AList);
m_MapQueryEnv.arrayList = AList;
if (m_MapQueryEnv.IsAddSelectionOnMap) ShowSelection(AList);//显示选择的几何体
if (m_MapQueryEnv.IsAddSelectionOnMap) m_MapQueryEnv.MapControl.Refresh(esriViewDrawPhase.esriViewGeography, Type.Missing, Type.Missing);
return AList;
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?