日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

SuperMap iObjects C++之缓冲区

發布時間:2024/3/13 c/c++ 73 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SuperMap iObjects C++之缓冲区 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

-->小詩

????????緩沖區分析是圍繞空間對象,使用一個或多個與這些對象的距離值(稱為緩沖半徑)作為半徑,生成一個或多個區域的過程。緩沖區也可以理解為空間對象的一種影響或服務范圍。

????????緩沖區分析的基本作用對象是點、線、面。SuperMap 支持對二維點、線、面數據集(或記錄集)和網絡數據集進行緩沖區分析。其中,對網絡數據集進行緩沖區分析時,是對其中的弧段作緩沖區。緩沖區的類型可以分為單重緩沖區(或稱簡單緩沖區)和多重緩沖區。下面以簡單緩沖區為例分別介紹點、線、面的緩沖區。

緩沖區分析應用場景

????????緩沖區分析在 GIS 空間分析中經常用到,且往往結合疊加分析來共同解決實際問題。緩沖區分析在農業、城市規劃、生態保護、防洪抗災、軍事、地質、環境等諸多領域都有應用。

????????例如擴建道路時,可根據道路擴寬寬度對道路創建緩沖區,然后將緩沖區圖層與建筑圖層疊加,通過疊加分析查找落入緩沖區而需要被拆除的建筑;又如,為了保護環境和耕地,可對濕地、森林、草地和耕地進行緩沖區分析,在緩沖區內不允許進行工業建設。

點緩沖區

????????點的緩沖區是以點對象為圓心,以給定的緩沖距離為半徑生成的圓形區域。當緩沖距離足夠大時,兩個或多個點對象的緩沖區可能有重疊。選擇合并緩沖區時,重疊部分將被合并,最終得到的緩沖區是一個復雜面對象。

線緩沖區

????????線的緩沖區是沿線對象的法線方向,分別向線對象的兩側平移一定的距離而得到兩條線,并與在線端點處形成的光滑曲線(也可以形成平頭)接合形成的封閉區域。同樣,當緩沖距離足夠大時,兩個或多個線對象的緩沖區可能有重疊。合并緩沖區的效果與點的合并緩沖區相同。

面緩沖區

????????面的緩沖區生成方式與線的緩沖區類似,區別是面的緩沖區僅在面邊界的一側延展或收縮。當緩沖半徑為正值時,緩沖區向面對象邊界的外側擴展;為負值時,向邊界內收縮。同樣,當緩沖距離足夠大時,兩個或多個面對象的緩沖區可能有重疊。也可以選擇合并緩沖區,其效果與點的合并緩沖區相同。

下面跟著小編一起看看具體創建緩沖區的過程吧:

創建點對象緩沖區

下面示例示范對一個點數據集創建緩沖區,并且將結果存放到結果面數據集中。

要點:

  • 打開UDB數據源,獲取點數據集,并創建結果面數據集。
  • 查詢點記錄集和創建 結果面記錄集。
  • 設置緩沖區分析參數,創建緩沖區對象,并將結果寫到結果面記錄集中。
  • 關閉數據源,釋放內存。
  • 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++之缓冲区的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。