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 + -
显示快捷键?