二維轉檔 CVectorFile
[info] 小提示:
初階版不限格式,只要能變成幾何與屬性都能轉入 db 內。
二維轉檔高階版
[info] 小提示:
範例程式碼:Github
步驟 1. 首先新增類別庫
專案,在此請使用[.Net Framework 4.7.2](含)以上的版本,接著為專案命名,在本範例命名為 VectorFile2VectorLayer。
步驟 2. 請在右邊[方案總管]中找到[參考],點擊滑鼠右鍵後點選[加入參考…],視窗開啟後,選擇[瀏覽]頁籤,至安裝目錄下找到TMPEngine.dll
檔案並按下[確定],即可將 TMPEngine.dll 加入參考。
步驟 3. 加入參考後請於Class1.cs
上方加入以下程式碼:
using PilotGaea.Serialize;
using PilotGaea.TMPEngine;
using PilotGaea.Geometry;
以上為所有外掛的前置作業,完成後下面將示範轉檔的實作過程。
步驟 1. 專案建置後,請在Class1
後方加入繼承DoCmdBaseClass
。
public class Class1 : DoCmdBaseClass
步驟 2. 請宣告一個List
的全域變數,用來儲存要新增的指令。
private List<string> m_Cmds;
步驟 3. DeInit
函式為覆寫(Override)繼承自DoCmdBaseClass
之函式DeInit()
,此函式將在外掛重新載入或主程式結束時被呼叫,預設為不執行任何指令。
public override void DeInit() {
// 預設為不執行任何指令
}
步驟 4. 實作 Docmd 函式:請找到系統已產生覆寫(Override)繼承自DoCmdBaseClass
的 Docmd 函式,此函式為呼叫功能之主要進入點,在此我們將判斷傳進來的指令字串,並呼叫相對應的函式執行我們寫好的功能。如果此函式回傳為false
,client 將會收到http status code 500
(伺服器內部錯誤)`。
public override bool DoCmd(CGeoDatabase db, string cmd, string sessionID, VarStruct inputParm, out VarStruct retParm)
{
bool Ret = false;
retParm = null;
switch (cmd)
{ // 在此的指令須對應上方初始化時建立的指令
case "VectorFile2VectorLayer":
Ret = VectorFile2VectorLayer(db, sessionID, inputParm, out retParm);
break;
default:
break;
}
return Ret;
}
以上步驟完成後,程式碼應如下圖:
步驟 5. 實做完上述函式後,將來源 VectorFile 轉成 VectorLayer,再加入 Database 中。
- sourceUrl 為來源 VectorFile 的路徑。
- layerName 為欲新增的圖層名稱,可隨意取名。
- epsg 為參考的 EPSG。
private bool VectorFile2VectorLayer(CGeoDatabase db, string sessionID, VarStruct inParm, out VarStruct outParm)
{
outParm = new VarStruct();
outParm["success"].Set(false);
outParm["error"].Set("");
string sourceUrl = ""; // 取得來源VectorFile路徑
if (!inParm.TryGet("sourceUrl", ref sourceUrl))
{
outParm["error"].Set("no sourceUrl argument");
return false;
}
string layerName = ""; // 取得要新增的圖層名稱
if (!inParm.TryGet("layerName", ref layerName))
{
outParm["error"].Set("no layerName argument");
return false;
}
int epsg = 0; // 加入參考的EPSG
if (!inParm.TryGet("epsg", ref epsg))
{
outParm["error"].Set("no epsg argument");
return false;
}
步驟 6. 新增一個VectorDatabase(VectorDB)
,再將 VectorFile 轉換成新圖層並完成圖層設定。
CVectorFile DBFile = db.CreateVectorFile(); // 新增VectorDB
if (!DBFile.Open($"C:\\ProgramData\\PilotGaea\\PGMaps\\{layerName}.DB"))
{
outParm["error"].Set("Open DB Error");
return false;
}
int LayerID = DBFile.NewLayerFromFile(layerName, epsg, LAYER_TYPE.VECTOR_BASE, sourceUrl, epsg); // 將VectorFile轉換為新圖層
DBFile.Close();
// 圖層設定如下
var newLayerSetting = new VarStruct();
newLayerSetting["Type"].Set("VECTOR_BASE");
newLayerSetting["Show"].Set("1");
newLayerSetting["Alpha"].Set("1");
newLayerSetting["VisibleType"].Set("RESOLUTION");
newLayerSetting["VisibleMin"].Set("0");
newLayerSetting["VisibleMax"].Set("0");
newLayerSetting["OffsetX"].Set("0");
newLayerSetting["OffsetY"].Set("0");
newLayerSetting["DistributeTileMatrixSet"].Set("EPSG:" + epsg);
newLayerSetting["WMTS"].Set("1");
newLayerSetting["WMS"].Set("1");
newLayerSetting["WFS"].Set("0");
newLayerSetting["CacheControl"].Set("604800");
newLayerSetting["BkColor"].Set("#FFFFFFFF");
newLayerSetting["AccessControl"].Clear();
newLayerSetting["ViewportMode"].Clear();
newLayerSetting["Metadata"].Clear();
newLayerSetting["Name"].Set(layerName);
newLayerSetting["EPSG"].Set(epsg.ToString());
newLayerSetting["Url"].Set($"C:\\ProgramData\\PilotGaea\\PGMaps\\{layerName}.DB");
newLayerSetting["ID"].Set(LayerID.ToString());
步驟 7. 將圖層加入 Server 並儲存。
if (db.NewLayer(newLayerSetting, null) == null)
{
outParm["error"].Set("Failed to add new layer.");
return false;
}
if (!db.Save()) // 儲存
{
outParm["error"].Set("Failed to save db.");
return false;
}
outParm["success"].Set(true);
return true;
}
步驟 8. 實作GetSupportCmds
函式:找到系統已產生覆寫(Override)繼承自DoCmdBaseClass
的GetSupportCmds
函式,此函式功能為讓外部取得此函式庫中所有支援之指令字串。
public override string[] GetSupportCmds()
{
return m_Cmds.ToArray();
}
步驟 9. 最後,在Init()
裡加入新的指令名稱。我們叫它 "VectorFile2VectorLayer"。希望它在呼叫之後回傳一筆簡單的資料,讓我們知道DoCommand
當前是成功運行的。
public override bool Init()
{
m_Cmds = new List<string>();
m_Cmds.Add("VectorFile2VectorLayer");
return true;
}
步驟 10. 以上步驟皆完成後,請按下建置專案,由於類別庫無法直接執行,完成後請到專案資料夾中的\bin\Debug
(或是\bin\Release
,依建置類型決定)目錄內將檔案複製到安裝目錄下的plugins
目錄中,最後用 client 進行呼叫查看執行結果。