红色部分为最核心的一步:
BOOL GetLayerExtent(const IFeatureLayerPtr ipLayer, double & dMinX,double & dMinY ,double & dMaxX,double & dMaxY)
{if (ipLayer == NULL)
{
return FALSE;
}
HRESULT hr;
long nCount = 0;
IFeatureClassPtr ipFCls;
hr = ipLayer->get_FeatureClass(&ipFCls);
if (ipFCls == NULL)
{
return FALSE;
}
hr = ipFCls->FeatureCount(NULL,&nCount);
if (nCount < 1)//图层内没有要素的,直接跳过
{
return FALSE;
}
IFeatureClassManagePtr ipFClsManage = ipFCls;
if (ipFClsManage != NULL)//为避免数据删除的影响(水位线),特此更新一下范围
{
hr = ipFClsManage->UpdateExtent();
}
IEnvelopePtr ipEnv;
hr = ipLayer->get_AreaOfInterest(&ipEnv);
// 测试发现上面一行与下面几行的效果是一致的。
// IGeoDatasetPtr ipGeoDst = ipLayer;
// if (ipGeoDst == NULL)
// {
// return FALSE;
// }
// hr = ipGeoDst->get_Extent(&ipEnv);
if (FAILED(hr))
{
return FALSE;
}
hr = ipEnv->get_XMin(&dMinX);
hr = ipEnv->get_YMin(&dMinY);
hr = ipEnv->get_XMax(&dMaxX);
hr = ipEnv->get_YMax(&dMaxY);
return TRUE;
}