傾斜攝影轉檔視窗程式
建立專案檔
[info] 小提示:
範例程式碼:Github
目標是使用 MicroSoft Visual Studio 2019(或以上之版本)建立一個名為 Windows Forms App 的應用程式。
步驟 1. 首先新增 Windows Forms App(.Net Framework)專案,在此請使用[.Net Framework 4.7.2](含)以上的版本,接著為專案命名。本範例命名為 PhotogrammetryConverterApp。
步驟 2. 請在右邊[方案總管]中找到[參考],點擊滑鼠右鍵後點選[加入參考…],視窗開啟後,選擇[瀏覽]頁籤,至安裝目錄下找到TMPEngine.dll
檔案並按下[確定],即可將 TMPEngine.dll 加入參考。
步驟 3. 加入參考後請於 Form 的設計視窗點擊滑鼠右鍵,並按下[檢視程式碼]在上方加入以下程式碼:
using PilotGaea.Serialize;
using PilotGaea.TMPEngine;
using PilotGaea.Geometry;
步驟4. 請在組態管理員選擇適當的方案平台,設定為`x64執行模式,並選擇 Release 方案組態。
編寫轉檔程式
步驟 1. 建立 UI,於工具箱新增 ListBox、ProgressBar、ComboBox、Label、Button 控制項至表單中,將 ListBox 控制項的名稱設置為"listBox_Main",並雙擊 Button 控制項以建立按鈕點擊事件函式。
步驟 2. 於Form1()
加入功能列表。
public Form1() {
InitializeComponent();
// 加入功能列表
List<string> featureNames = new List<string>();
featureNames.Add("基本");
featureNames.Add("來源3MX");
featureNames.Add("輸出OGC I3S");
featureNames.Add("輸出OGC 3DTiles");
featureNames.Add("變換-平移");
featureNames.Add("變換-旋轉");
featureNames.Add("變換-縮放");
featureNames.Add("遮罩-內縮");
featureNames.Add("遮罩-無內縮");
featureNames.Add("刪除指定區域");
featureNames.Add("添加額外模型");
featureNames.Add("單緒");
comboBox_Features.Items.AddRange(featureNames.ToArray());
comboBox_Features.SelectedIndex = 0;
}
步驟 3. 在點擊事件函式中建立名為 maker 的 CPhotogrammetryMaker 物件,並將 UI 預設為關閉。
private void button_Start_Click(object sender, EventArgs e) {
EnableUI(false);
// 將來源資料輸出成PhotogrammetryModel圖層
System.Environment.CurrentDirectory = @"C:\Program Files\PilotGaea\TileMap"; // 為了順利存取安裝目錄下的相關DLL
CPhotogrammetryModelMaker m_Maker = null;
Stopwatch m_Stopwatch = new Stopwatch();
}
private void EnableUI(bool enable)
{
button_Start.Enabled = enable;
comboBox_Features.Enabled = enable;
}
步驟 4. 為 maker 物件建立監聽事件,並於類別中新增以下三項事件函式。
m_Maker.CreateLayerCompleted += M_Maker_CreateLayerCompleted;
m_Maker.ProgressMessageChanged += M_Maker_ProgressMessageChanged;
m_Maker.ProgressPercentChanged += M_Maker_ProgressPercentChanged;
建立圖層完畢回傳設定:
private void M_Maker_ProgressMessageChanged(string message)
{
listBox_Main.Items.Add(message);
}
進度回傳設定:
private void M_Maker_ProgressPercentChanged(double percent)
{
progressBar_Main.Value = Convert.ToInt32(percent);
}
步驟 5. 新增圖層。
- LayerName 為目標圖層名稱,可隨意取名。若 EXPORT_TYPE 不為 LET_DB,則為輸出檔名。
- destPath 為指定執行 Create 的資料庫路徑。
- srcPath 為來源資料檔案路徑。
- terrainPath 為高程資料庫路徑。
- terrainName 為高程資料庫內指定的高程圖層名稱,請確認資料庫中的地形高程名稱。
- EXPORT_TYPE 為要輸出的類型,有 LET_DB、LET_OGCI3S、LET_OGC3DTILES。預設 LET_DB。
- offset 為圖層位移,透過 offset 參數指定對三軸(x,y,z)的位移量,單位為公尺。
- rotationAngle 為圖層對Z軸的旋轉角度 (角度範圍為0°~359°)。
- scale 為圖層放大比例,預設為1。
- isDoMaskLayer 為是否執行遮罩功能,將其參數設為
true
即可開啟遮罩。 - maskLayerOffsetting 為遮罩的縮放值,單位為公尺,僅開啟執行遮罩功能時有用。
- isDoExtrudeEdge 為模型邊緣拉伸功能,將其參數設為
true
即可開啟邊緣拉伸。 - attrSHPFileName 為添加屬性 SHP 檔的檔案路徑。
- attrSHPFileEPSG 為添加屬性 SHP 檔的 EPSG。
- removalPolygons 為指定 SHP 檔內的多邊形區域,在
removalPolygons參數
透過 SHP 檔指定要刪除的圖層區域。shp檔SRS只支援4326。
- additionalModelFileNames 為額外模型的檔案路徑。如要添加額外模型功能,可透過
additionalModel
相關參數添加額外模型到圖層中。 - additionalModelPositions 為額外模型的插入點座標,以 EPSG4326 描述。
- additionalModelPositions 為額外模型對三軸的旋轉,單位為弧度。
- additionalModelScales 為額外模型的縮放值,預設為1,是為原始大小。
- maxThreadCount 為轉檔使用執行緒數量,負數為使用單緒,0為自動分配。
// 設定必要參數
EXPORT_TYPE exportType = EXPORT_TYPE.LET_DB;
string layerName = "test";
string destPath = string.Format(@"{0}\..\output\photogrammetrymodel_maker.DB", Application.StartupPath);
string srcPath = string.Format(@"{0}\..\data\photogrammetrymodel_maker\LOD\LODTreeExport.xml", Application.StartupPath);
string terrainPath = string.Format(@"{0}\..\data\terrain_maker\terrain.DB", Application.StartupPath);
string terrainName = "terrain";
// 設定進階參數 (可自行選擇是否加入)
GeoPoint offset = null;
double rotationAngle = 0;
double scale = 1;
bool isDoMaskLayer = false;
double maskLayerOffsetting = 0;
bool isDoExtrudeEdge = false;
string attrSHPFileName = "";
long attrSHPFileEPSG = 4326;
GeoPolygonSet[] removalPolygons = null;。
string[] additionalModelFileNames = null;
GeoPoint[] additionalModelPositions = null;
GeoPoint[] additionalModelRotations = null;
GeoPoint[] additionalModelScales = null;
int maxThreadCount = 0;
步驟 6. 開始執行非同步轉檔。
m_Stopwatch.Restart();
// 開始非同步轉檔
bool ret = m_Maker.Create(exportType, layerName, destPath, srcPath, terrainPath, terrainName,offset, rotationAngle, scale,isDoMaskLayer, maskLayerOffsetting, isDoExtrudeEdge,attrSHPFileName, attrSHPFileEPSG,removalPolygons,additionalModelFileNames, additionalModelPositions, additionalModelRotations,additionalModelScales,maxThreadCount
);
string message = string.Format("參數檢查{0}", (ret ? "通過" : "失敗"));
listBox_Main.Items.Add(message);