向量轉檔視窗程式
建立專案檔
[info] 小提示:
範例程式碼:Github
目標是使用 MicroSoft Visual Studio 2019(或以上之版本)建立一個名為 Windows Forms App 的應用程式。
步驟 1. 首先新增 Windows Forms App(.Net Framework)專案,在此請使用[.Net Framework 4.7.2](含)以上的版本,接著為專案命名。本範例命名為 VectorConverterApp。
步驟 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("基本");
comboBox_Features.Items.AddRange(featureNames.ToArray());
comboBox_Features.SelectedIndex = 0;
}
步驟 3. 在點擊事件函式中建立名為 maker 的 CVectorMaker 物件,並將 UI 預設為關閉。
private void button_Start_Click(object sender, EventArgs e) {
EnableUI(false);
// 生成一向量圖層(來源為shp)
System.Environment.CurrentDirectory = @"C:\ProgramFiles\PilotGaea\TileMap"; // 為了順利存取安裝目錄下的相關DLL
CVectorMaker maker = new CVectorMaker();
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_CreateLayerCompleted(string LayerName, bool Success, string ErrorMessage)
{
m_Stopwatch.Stop();
string message = string.Format("CreateCompleted{0}", (Success ? "成功" : "失敗"));
listBox_Main.Items.Add(message);
message = string.Format("耗時{0}分。", m_Stopwatch.Elapsed.TotalMinutes.ToString("0.00"));
listBox_Main.Items.Add(message);
}
進度訊息回傳設定:
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,則為輸出檔名。
- DBFileName 為目標檔案的DB路徑。
- TerrainDBName 為來源地形DB路徑,
- TerrainLayerName 為來源地形的圖層名稱,請確認資料庫中的地形高程名稱。
- ShpFileName 為檔案來源 SHP 檔路徑。
- TextFieldIndex 為顯示
文字欄位
編號。 - SymbolFieldIndex 為顯示
圖標欄位
編號。可利用SymbolFieldValue
及ImagePath
參數做進一步設定。 - SrcEPSG 為來源 EPSG。
- UseCluster 為是否使用叢集,將其參數設為
true
即可使用叢集模型。 - UseSimplePoint 為是否使用簡約化。
- MaxClusterDistance 為群集點的最大合併距離。
- UseHeight 為是否使用欄位高度值,若將其參數設為 false 時,則永遠取用地形高度。
- HeightIndex 為高度欄位編號。當 UseHeight 為 false 時則無意義。
- IsAbsoluteHeight 為高度欄位值是否為絕對高。當 UseHeight 為 false 時則無意義。。
- SymbolFieldValue 為
與ImagePath參數相對應
,當設定的顯示圖標欄位中的值存在於此參數陣列中時,則將該點圖標設為編號對應於 ImagePath 陣列中的圖形檔。 - ImagePath 為
與SymbolFieldValue參數相對應
,記錄圖形檔完整路徑,根據SymbolFieldValue參數
將圖素的圖標設為對應的圖形檔。 - TextSet 為顯示文字字體設定,陣列長度固定為9,參數分別代表 { 字型名稱、字型顏色R、G、B、字型邊界顏色R、G、B、字型大小,字型邊界大小 } ,預設值為 { 微軟正黑體, 255, 255, 255, 0, 0, 0, 16, 3 }
// 設定必要參數
string DBFileName = string.Format(@"{0}\..\output\vector_maker.DB", Application.StartupPath);
string TerrainDBName = string.Format(@"{0}\..\data\terrain_maker\terrain.DB", Application.StartupPath);
string TerrainLayerName = "terrain";
string LayerName = "test";
string ShpFileName = string.Format(@"{0}\..\data\vector_maker\gis_osm_places_free_1.shp", Application.StartupPath);
int TextFieldIndex = 0;
int SymbolFieldIndex = 1;
int SrcEPSG = 4326;
bool UseCluster = true;
bool UseSimplePoint = false;
double MaxClusterDistance = 200;
bool UseHeight = false;
int HeightIndex = 0;
bool IsAbsoluteHeight = false;
string[] SymbolFieldValue = null;
string[] ImagePath = null;
string[] TextSet = null;
// 設定進階參數
switch (comboBox_Features.SelectedIndex)
{
case 0: // 基本
break;
}
步驟 6. 開始執行非同步轉檔。
m_Stopwatch.Restart();
// 開始非同步轉檔
bool ret = m_Maker.Create(DBFileName, TerrainDBName, TerrainLayerName, ShpFileName, TextFieldIndex, SymbolFieldIndex, LayerName, SrcEPSG, UseCluster, UseSimplePoint, MaxClusterDistance, UseHeight, HeightIndex, IsAbsoluteHeight,
SymbolFieldValue, ImagePath, TextSet);
string message = string.Format("Create檢查{0}", (ret ? "通過" : "失敗"));
listBox_Main.Items.Add(message);