一:叠置分析(待验证)
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 :返回选择集
*/