空间分析

一:叠置分析(待验证)

 1.1 空间分析返回layer

 /*

   说明:

   pFeatureLayer:      叠置要素层;

   pGeoBound     :      叠置分析图形;

   nSpaceFilterMode:空间过滤方式:2<--->相交; 其他包含

   ILayerPtr             :返回新图层

*/

ILayerPtr SpatialFilter(IFeatureLayerPtr pFeatureLayer,IGeometryPtr pGeoBound,int nSpaceFilterMode,CString sPropFilter)
{

 // 如果空间过滤,可以使用创建选择集的方法
 IFeatureClassPtr pFeatureClass=pFeatureLayer->FeatureClass;

 IFeatureSelectionPtr pFeatureSelection = pFeatureLayer;
  pFeatureSelection->Clear();

 IFeatureLayerDefinitionPtr pFeatureLayerDefinition;
 pFeatureLayerDefinition = pFeatureLayer;
 ISpatialFilterPtr pGeoFilter;

 pGeoFilter.CreateInstance(__uuidof(SpatialFilter));

 pGeoFilter->PutRefGeometry(pGeoBound); 

 if  (nSpaceFilterMode == 2)   //'相交
 {
      pGeoFilter->SpatialRel = esriSpatialRelIntersects;
 }
 else                      //包含
 {
     pGeoFilter->SpatialRel = esriSpatialRelContains;
 }

 pGeoFilter->GeometryField = pFeatureClass->ShapeFieldName;

 pGeoFilter->WhereClause = (LPCTSTR)sPropFilter;

 pFeatureSelection->Clear();

 try
 {
      pFeatureSelection->SelectFeatures(pGeoFilter, esriSelectionResultNew,    VARIANT_FALSE);
 }
 catch (...)
 {
     return NULL;
 }
 pGeoFilter = NULL;

 if  (pFeatureSelection->SelectionSet->GetCount() > 0)
 {
      IFeatureLayerPtr pSelLayer;
      pSelLayer = pFeatureLayerDefinition->CreateSelectionLayer(pFeatureLayer->Name, VARIANT_TRUE, "","");
     pFeatureSelection->Clear();
      return pSelLayer;
 }
 else
 {
     pFeatureLayerDefinition->DefinitionExpression = "1=2";
     pFeatureSelection->Clear();
     return pFeatureLayer;
 }

  return pFeatureLayer;
}

 

 

 

 ILayerPtr pResultLyr = NULL;
 pResultLyr = SpatialFilter(pFeaLyr,pGeo,2,"");
 
 if ( pResultLyr == NULL)  return;


 IFeatureLayerPtr pResultFeaLyr(pResultLyr);

 IGeoFeatureLayerPtr pGeoLyr(pResultFeaLyr);

 IFeatureCursorPtr pFeaCur;
 pFeaCur = pGeoLyr->Search(NULL,VARIANT_FALSE);

 ///

1.2 空间分析返回IFeatureCursorPtr

/*

IFeatureCursorPtr SearchBySpatialFilter(IFeatureLayerPtr pFeatureLayer,IGeometryPtr pGeoBound,int nSpaceFilterMode,CString sPropFilter)
{


 IFeatureCursorPtr pFeaCursor = NULL;
 ISelectionSetPtr  pSelSet  = NULL;

 IFeatureClassPtr pFeatureClass=pFeatureLayer->FeatureClass;

 IFeatureSelectionPtr pFeatureSelection = pFeatureLayer;

 pFeatureSelection->Clear();

 IFeatureLayerDefinitionPtr pFeatureLayerDefinition;
 pFeatureLayerDefinition = pFeatureLayer;

 ISpatialFilterPtr pGeoFilter;

 pGeoFilter.CreateInstance(__uuidof(SpatialFilter));

 pGeoFilter->PutRefGeometry(pGeoBound); 

 if  (nSpaceFilterMode == 2)   //'相交
 {
      pGeoFilter->SpatialRel = esriSpatialRelIntersects;
 }
 else                      //包含
 {
        pGeoFilter->SpatialRel = esriSpatialRelContains;
 }

 pGeoFilter->GeometryField = pFeatureClass->ShapeFieldName;

 pGeoFilter->WhereClause = (LPCTSTR)sPropFilter;

 pFeatureSelection->Clear();
 HRESULT hr;
 try
 {
      hr = pFeatureSelection->SelectFeatures(pGeoFilter, esriSelectionResultNew, VARIANT_FALSE);
      pGeoFilter = NULL;

      long nSelCount = pFeatureSelection->SelectionSet->GetCount();
     if  (pFeatureSelection->SelectionSet->GetCount() > 0)
    {
       pSelSet = pFeatureSelection->SelectionSet;
       ICursorPtr  pCursor;
   
       pSelSet->Search(NULL,VARIANT_TRUE,&pCursor);
       if ( pCursor != NULL)
      {
          pFeaCursor = (IFeatureCursorPtr)pCursor;
      }
   
   }
   else
   {
       pFeatureLayerDefinition->DefinitionExpression = "1=2";
       pFeatureSelection->Clear();
       return NULL;
  }

 }
 catch (...)
 {
    return NULL;
 }

 return pFeaCursor;

 
}

 

 

 

二:空间统计分析

    2.1 得到某个字段集合的唯一值(相当于 select distinctive(sFld) from sTable

 

 

 

 

//获得字段中的所有值的游标

ICursorPtr ArcDbHelper::GetUniqueCursor(     

                         ITablePtr spTable,       //表,可以是要素表

                         CString sField,          //需要获得值的字段

                         Cstring sFilter          //过滤条件

                                   )

{

    IQueryDefPtr spQueryDef;

    ICursorPtr spCursor;

    IFeatureWorkspacePtr spFeaWorkspace;

    IDatasetPtr spDataset;

 

    spDataset      = spTable;

    spFeaWorkspace = spDataset->Workspace;

    spQueryDef     = spFeaWorkspace->CreateQueryDef();

 

    Cstring sTableName = (LPCTSTR)(_bstr_t)spDataset->BrowseName;

    spQueryDef->Tables = (_bstr_t)(LPCTSTR) sTableName;

 

    CString strSubFields;

    strSubFields.Format("DISTINCT %s",sField);

 

    spQueryDef->SubFields = (LPCTSTR)strSubFields;

    spQueryDef->WhereClause = (LPCTSTR)sFilter;

    return spQueryDef->Evaluate();

}

 

 

 

 

 long GetFeatueclassUniqueValues(ITablePtr spTbClass,CString sField,CString sFilter = "")

 {

    ICursorPtr pCursor=GetUniqueCursor(spTbClass,sField,(LPCTSTR)sFilter);      

    if (pCursor==NULL)

        return 0;

    IRowPtr  pRow;

    pRow = pCursor->NextRow();

    CString sRowKey;

    CString sValue;

    _variant_t vVal;

    long nRowCount = -1;

    long nFldIndex = -1;

 

    while (pRow!=NULL)

    {

       Row->get_Fields(&pFlds);

       nFldIndex = pFlds->FindField((_bstr_t)(LPCTSTR)sFldName);

       vVal = pRow->GetValue(nFldIndex);

 

       if  (((vVal.vt!=VT_NULL) ||(vVal.vt!=VT_EMPTY) ) )// && vVal.vt==VT_BSTR

       {

           nRowCount++;

           sValue=(LPCTSTR)(_bstr_t)vVal;

       }

       pRow = pCursor->NextRow();

    }

 

    return nRowCount;

}

   说明:

   pFeatureLayer:      叠置要素层;

   pGeoBound     :      叠置分析图形;

   nSpaceFilterMode:空间过滤方式:2<--->相交; 其他包含

   IFeatureCursorPtr :返回选择集

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值