製圖綜合和建築物資料處理等都涉及到建築物多邊形的化簡。製圖綜合中,由於比例尺的變小,建築物在小比例尺地圖上所佔面積變小,這意味著建築物圖形的形狀精度也有一定的損失,為了更好地表示原有建築物的特徵(面積、圖形和方向),需要對建築物多邊形進行化簡。另外,從遙感影像提取的建築物向量資料需要經過圖形化簡等一系列操作才能作為可使用的資料。
首先明確,向量資料結構中,建築物多邊形是由一些列環(circle)組成,環則由一串首尾相同的點構造。這意味著對建築物多邊形化簡其實是對這些環(線狀)處理,更具體地說,是對環的各個點進行處理(刪除、移位)。
對建築物多邊形的化簡到最後得到能較好擬合建築物的成果多邊形,這中間需要一系列操作。首先要進行去除冗餘點的操作。
1)冗餘點
對於建築物多邊形邊界上的鄰近三點,若它們所組成兩條直線的夾角為平角(或零角),則該三點共線,且位於中間位置那個點的取捨對建築物多邊形的 幾 何形狀沒有影響,因此該三點中位於中間位置那個點是冗餘的。
需要注意的是由於資料採集誤差、製圖不規範等原因,使得地圖上建築物多邊形邊界上出現冗餘點的情況很少,出於方法的合理性考慮,選取5°作為緩衝角度,對冗餘點的定義做出以下修正定義:對於建築物多邊形邊界上的鄰近三點,若它們所組成兩條直線的夾角與平角(或零角)相差的角度小於5°時,稱該三點中位於中間位置的那個點為冗餘點。
2)基本思想
3)**實現
// 去除冗餘點,zf,0717其中calangle函式是計算三點的夾角,具體**如下:void cgeopolygon::removeredundant(void)
else //不正常,存在冗餘點的情況
double angle = calangle(first,middle,last); //計算角度
if(angle >= 10&&angle<=170) //角度閾值設為10°(可根據需要調整),當角度大於閾值,情況正常,不需要去除點
else // 存在冗餘點
}vectortemppoints; //定義臨時點集
if(temppoints.size()!=0) vector().swap(temppoints); //防止點集不為空
for(int j = 0;jpts[j]);
} temppoints.swap(circles[i]->pts); //交換,得到去除冗餘點之後的環circles[i]->pts
}}
// 計算三點之間的角度,zf,0717,要#includedouble cgeopolygon::calangle(cmypoint* p1, cmypoint* p2, cmypoint* p3)iscontained函式判斷某個數是不是在陣列中,見下
// 判斷某個數是不是在陣列中,zf,0717bool cgeopolygon::iscontained(vectortemp, int i)
{ bool answer = false;
for(int j = 0;j4)效果展示
去除冗餘點之前
去除冗餘點之後
5)小結
(三)建築物多邊形化簡系列 去除冗餘點
製圖綜合和建築物資料處理等都涉及到建築物多邊形的化簡。製圖綜合中,由於比例尺的變小,建築物在小比例尺地圖上所佔面積變小,這意味著建築物圖形的形狀精度也有一定的損失,為了更好地表示原有建築物的特徵 面積 圖形和方向 需要對建築物多邊形進行化簡。另外,從遙感影像提取的建築物向量資料需要經過圖形化簡等一系...
(一)建築物多邊形化簡系列 去除噪點環
由於本人最近在進行建築物資料處理的專案,遇到了較多的問題,同時也收穫了很多知識。所有打算寫乙個建築物處理的系列部落格。要處理建築物多邊形,首先得理解結構關係,這是所有實現處理的基礎。建築物多邊形是由一條條封閉的環 線狀 組成,環是由一組首尾相同的點組成,所以對建築物多邊形的處理實質是對環和點處理。實...
(五)建築物多邊形化簡系列 最小外接矩形的獲取
最小外接矩形問題是在給出乙個多邊形 或一群點 求出面積最小且外接多邊形的矩形的問題。這個問題看起來並不難,但是具體實現並不簡單。除了呼叫現有的公開庫之外,這裡給出一種簡單且易理解的方法。演算法的主要思想是 1 先實現多邊形的簡單外接矩形的演算法。簡單外接矩形是指邊平行於x軸或y軸的外接矩形。簡單外接...