(一)建築物多邊形化簡系列 去除噪點環

2022-03-11 22:19:13 字數 1943 閱讀 8773

由於本人最近在進行建築物資料處理的專案,遇到了較多的問題,同時也收穫了很多知識。所有打算寫乙個建築物處理的系列部落格。

要處理建築物多邊形,首先得理解結構關係,這是所有實現處理的基礎。建築物多邊形是由一條條封閉的環(線狀)組成,環是由一組首尾相同的點組成,所以對建築物多邊形的處理實質是對環和點處理。

實際專案中,所給的資料是非常凌亂的,雜質非常多。下圖是初始的建築物多邊形資料,我們可以發現:區域性有大量黑色點,放大發現並不是黑色,而是多邊形中環太小太多,資料量大且雜,分布非常廣泛。另外程式執行速度非常慢。這兩點說明需要對資料進行過濾處理,即對噪點環進行過濾刪除處理。

區域性放大發現黑點是小環,即噪點環。

1)噪點環

顧名思義就是圖上的噪點,只不過噪點不是點,而是乙個個小環,這些環特點為:面積小;數量多且分布廣;明顯不是建築物多邊形;這些小環與正常的建築物的環實質上只有面積上的差別,小環面積很小。

要進行建築物化簡得到最終成功,必須先除去這些噪點環,否則由於環數量太大導致程式執行緩慢甚至卡死。

2)去除的思路

上面提到這些小環與正常的建築物的環實質上只有面積上的差別,小環面積很小。所以可以設定乙個面積閾值,把小於這個閾值的環一律捨棄,保留大於面積閾值的環。閾值的設定需要根據實際的專案要求。

3)**實現

使用mfc和c++,vs2010,主體演算法如下

// zf,按面積過濾,0701

void cgeopolygon::objectfilterbyarea(void)

vectortemppolyline; //定義新的無噪點環的環陣列

if(temppolyline.size()!=0) vector().swap(temppolyline); //防止環陣列不為空

for(int j = 0;j其中getarea函式是計算每個環的面積,輸入的是每個環的點集。

//zf,計算某個環的面積

double cgeopolyline::getarea(vectorpts)

if (area < 0)

area = -area;

return area;

}

iscontained函式判斷某個數是不是在陣列中,見下:

// 判斷某個數是不是在陣列中,zf,0717

bool cgeopolygon::iscontained(vectortemp, int i)

{ bool answer = false;

for(int j = 0;j4)實驗結果,

去除噪點環之前

去除噪點環之後

去除(過濾)前

去除(過濾)後

5)小結

去掉(過濾)噪點環之後,發現圖面明顯變得清爽,同時由於噪點環的去除,總體環數量大幅減少,後續程式執行和各種操作也變得快捷。

(三)建築物多邊形化簡系列 去除冗餘點

製圖綜合和建築物資料處理等都涉及到建築物多邊形的化簡。製圖綜合中,由於比例尺的變小,建築物在小比例尺地圖上所佔面積變小,這意味著建築物圖形的形狀精度也有一定的損失,為了更好地表示原有建築物的特徵 面積 圖形和方向 需要對建築物多邊形進行化簡。另外,從遙感影像提取的建築物向量資料需要經過圖形化簡等一系...

(三)建築物多邊形化簡系列 去除冗餘點

製圖綜合和建築物資料處理等都涉及到建築物多邊形的化簡。製圖綜合中,由於比例尺的變小,建築物在小比例尺地圖上所佔面積變小,這意味著建築物圖形的形狀精度也有一定的損失,為了更好地表示原有建築物的特徵 面積 圖形和方向 需要對建築物多邊形進行化簡。另外,從遙感影像提取的建築物向量資料需要經過圖形化簡等一系...

(五)建築物多邊形化簡系列 最小外接矩形的獲取

最小外接矩形問題是在給出乙個多邊形 或一群點 求出面積最小且外接多邊形的矩形的問題。這個問題看起來並不難,但是具體實現並不簡單。除了呼叫現有的公開庫之外,這裡給出一種簡單且易理解的方法。演算法的主要思想是 1 先實現多邊形的簡單外接矩形的演算法。簡單外接矩形是指邊平行於x軸或y軸的外接矩形。簡單外接...