SuperMap iObjects C++之缓冲区
-->小詩
????????緩沖區分析是圍繞空間對象,使用一個或多個與這些對象的距離值(稱為緩沖半徑)作為半徑,生成一個或多個區域的過程。緩沖區也可以理解為空間對象的一種影響或服務范圍。
????????緩沖區分析的基本作用對象是點、線、面。SuperMap 支持對二維點、線、面數據集(或記錄集)和網絡數據集進行緩沖區分析。其中,對網絡數據集進行緩沖區分析時,是對其中的弧段作緩沖區。緩沖區的類型可以分為單重緩沖區(或稱簡單緩沖區)和多重緩沖區。下面以簡單緩沖區為例分別介紹點、線、面的緩沖區。
緩沖區分析應用場景
????????緩沖區分析在 GIS 空間分析中經常用到,且往往結合疊加分析來共同解決實際問題。緩沖區分析在農業、城市規劃、生態保護、防洪抗災、軍事、地質、環境等諸多領域都有應用。
????????例如擴建道路時,可根據道路擴寬寬度對道路創建緩沖區,然后將緩沖區圖層與建筑圖層疊加,通過疊加分析查找落入緩沖區而需要被拆除的建筑;又如,為了保護環境和耕地,可對濕地、森林、草地和耕地進行緩沖區分析,在緩沖區內不允許進行工業建設。
點緩沖區
????????點的緩沖區是以點對象為圓心,以給定的緩沖距離為半徑生成的圓形區域。當緩沖距離足夠大時,兩個或多個點對象的緩沖區可能有重疊。選擇合并緩沖區時,重疊部分將被合并,最終得到的緩沖區是一個復雜面對象。
線緩沖區
????????線的緩沖區是沿線對象的法線方向,分別向線對象的兩側平移一定的距離而得到兩條線,并與在線端點處形成的光滑曲線(也可以形成平頭)接合形成的封閉區域。同樣,當緩沖距離足夠大時,兩個或多個線對象的緩沖區可能有重疊。合并緩沖區的效果與點的合并緩沖區相同。
面緩沖區
????????面的緩沖區生成方式與線的緩沖區類似,區別是面的緩沖區僅在面邊界的一側延展或收縮。當緩沖半徑為正值時,緩沖區向面對象邊界的外側擴展;為負值時,向邊界內收縮。同樣,當緩沖距離足夠大時,兩個或多個面對象的緩沖區可能有重疊。也可以選擇合并緩沖區,其效果與點的合并緩沖區相同。
下面跟著小編一起看看具體創建緩沖區的過程吧:
創建點對象緩沖區
下面示例示范對一個點數據集創建緩沖區,并且將結果存放到結果面數據集中。
要點:
UGint?BufferExample::CreatePointBuffer()
{
????//?獲取數據源
????UGDataSource*?pDatasource?=?m_workspace->GetDatasource(_U("data"));
???
????//?獲取點數據集
????const?UGString?strPointDatasetName?=?_U("Point");
????UGDatasetVector*?pDatasetPoint?=?(UGDatasetVector*)pDatasource->GetDataset(strPointDatasetName);
????
????//?創建結果面數據集,用于保存緩沖區對象
????UGString?strResultDatasetName?=?_U("BufferResult");
????UGDatasetVectorInfo?datasetInfo;
????datasetInfo.m_nType?=?UGDataset::Region;
????datasetInfo.m_strName?=?pDatasource->GetUnoccupiedDatasetName(strResultDatasetName);
????UGDatasetVector*?pResultDataset?=?pDatasource->CreateDatasetVector(datasetInfo);
??? //?查詢點記錄集
????pDatasetPoint->Open();
????pResultDataset->Open();
????pResultDataset->SetPrjCoordSys(pDatasetPoint->GetPrjCoordSys());
????UGQueryDef?queryDefPoint;
????queryDefPoint.m_nCursorType?=?UGQueryDef::OpenStatic;
????queryDefPoint.m_nOptions??=?UGQueryDef::Geometry;
????UGRecordset*?pRecordset?=?pDatasetPoint->Query(queryDefPoint);
UGQueryDef?queryDefRegion;
????UGRecordset*?pRecordsetRegion?=?pResultDataset->Query(queryDefRegion);?????
????UGBufferParam?bufferParam;
????//?設置緩沖區半徑;
????bufferParam.m_dBufferRadius?=?10;??
????//?設置緩沖區半徑單位,此時為米,如果設置AU_KILOMETER,則表示為10千米
????//?如果數據的坐標系為平面坐標系,則此參數無效,設置的緩沖區半徑單位與數據單位一致。
????bufferParam.m_nRaidusUnit?=?AU_METER;
????//?設置每段弧段由多少段線段擬合
????bufferParam.m_nSemicircleSegments?=?20;
????UGPrjCoordSys&?prjCoordSys?=(UGPrjCoordSys&)pDatasetPoint->GetPrjCoordSys();
????pRecordsetRegion->EditBulk(TRUE);
????UGGeometry*?pGeometry?=?NULL;
????UGGeoRegion?geoResultRegion;
????while?(!pRecordset->IsEOF())
????{
????????if(!pRecordset->GetGeometry(pGeometry)?||?pGeometry?==?NULL)
????????{
????????????pRecordset->MoveNext();
????????????continue;
????????}
????????if(UGGeoOperator::CreateBuffer(pGeometry,?bufferParam,?geoResultRegion,?&prjCoordSys))
????????{
????????????pRecordsetRegion->AddNew(&geoResultRegion);
????????}
????????pRecordset->MoveNext();
????}
????pRecordsetRegion->EditBulk(FALSE);
????if(pGeometry?!=?NULL)
????{
????????delete?pGeometry;
????????pGeometry?=?NULL;
????}
????pDatasetPoint->ReleaseRecordset(pRecordset);
????pRecordset?=?NULL;
????pResultDataset->ReleaseRecordset(pRecordsetRegion);
????pRecordsetRegion?=?NULL;
????std::cout?<<?"創建緩沖區成功"?<<?endl;
????pDatasource->Close();
????delete?pDatasource;
????pDatasource?=?NULL;
????return?1;
}
創建線對象緩沖區和創建面對象緩沖區跟點是類似的,這里就不一一舉例了
這里將其中的區別做一下說明:
線記錄創建緩沖區:
1、UGBufferParam.m_nSideType?線對象的緩沖邊類型支持 UGFULL,?UGLEFT,?UGRIGHT,?UGFULLDIFFR,分半是全部緩沖、左緩沖、右緩沖、左右不等緩沖。
2、UGBufferParam.m_nEndType;?緩沖類型分為兩種:UGFLAT?平頭緩沖,UGROUND?圓頭緩沖,?
(1)對于單邊緩沖區(UGLEFT,?UGRIGHT),m_nEndType?只能為?UGFLAT。
???? (2)對于全緩沖(UGFULL),?則?m_nEndType可以為?UGFLAT?和?UGROUND
???? (3)對于左右不等緩沖(UGFULLDIFFR),?m_nEndType?只能為?UGFLAT
3、?UGBufferParam.m_dBufferRadius?設置緩沖半徑。
????如果m_bFieldRadius為TRUE,則m_dBufferRadius無效,此時會使用m_strBufferRadius或 m_strDiffBufferRadius作為緩沖半徑。
??如果設置的m_nSideType?為左右不等緩沖(UGFULLDIFFR),則此參數無效。
??當為左右不等緩沖時,需要設置m_dDiffBufferRadius或m_strDiffBufferRadius,
??m_dDiffBufferRadius[0]表示左邊緩沖半徑,m_dDiffBufferRadius[1]表示右邊緩沖半徑
或者是
??m_strDiffBufferRadius[0]表示左邊的緩沖半徑字段,m_strDiffBufferRadius[1]表示右邊的緩沖半徑字段
????
面記錄創建緩沖區??
??1、面緩沖區分析時,只支持左邊緩沖(按面對象外邊界順時針走向),且端點類型必須為平頭,
???所以用戶可以不設置m_nSideType?、m_nEndType這兩個參數。
??2、設置緩沖半徑,這個是一樣的。
???如果m_bFieldRadius為TRUE,則需要設置m_strBufferRadius,此時m_dBufferRadius無效
? 3、?如果緩沖半徑小于0時,則生成緊縮多邊形,就是往對象內進行緩沖。
總結
以上是生活随笔為你收集整理的SuperMap iObjects C++之缓冲区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电瓶车罚款不交后果如何
- 下一篇: SpringSecurity之授权