二維轉檔 CVectorFile

[info] 小提示:
初階版不限格式,只要能變成幾何與屬性都能轉入 db 內。

二維轉檔高階版

[info] 小提示:
範例程式碼:Github

步驟 1. 首先新增類別庫專案,在此請使用[.Net Framework 4.7.2](含)以上的版本,接著為專案命名,在本範例命名為 VectorFile2VectorLayer。

步驟 2. 請在右邊[方案總管]中找到[參考],點擊滑鼠右鍵後點選[加入參考…],視窗開啟後,選擇[瀏覽]頁籤,至安裝目錄下找到TMPEngine.dll檔案並按下[確定],即可將 TMPEngine.dll 加入參考。

PluginSample

步驟 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;
}

以上步驟完成後,程式碼應如下圖:

VectorFile2VectorLayer

步驟 5. 實做完上述函式後,將來源 VectorFile 轉成 VectorLayer,再加入 Database 中。

  1. sourceUrl 為來源 VectorFile 的路徑。
  2. layerName 為欲新增的圖層名稱,可隨意取名。
  3. 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;
    }

VFile -> VLayer

步驟 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());

LayerSetting

步驟 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;
}

LayerSaving

步驟 8. 實作GetSupportCmds函式:找到系統已產生覆寫(Override)繼承自DoCmdBaseClassGetSupportCmds函式,此函式功能為讓外部取得此函式庫中所有支援之指令字串。

public override string[] GetSupportCmds()
{
    return m_Cmds.ToArray();
}

VectorGetSupportCmds

步驟 9. 最後,在Init()裡加入新的指令名稱。我們叫它 "VectorFile2VectorLayer"。希望它在呼叫之後回傳一筆簡單的資料,讓我們知道DoCommand當前是成功運行的。

public override bool Init()
{
    m_Cmds = new List<string>();
    m_Cmds.Add("VectorFile2VectorLayer");
    return true;
}

VectorCmdsReturn

步驟 10. 以上步驟皆完成後,請按下建置專案,由於類別庫無法直接執行,完成後請到專案資料夾中的\bin\Debug(或是\bin\Release,依建置類型決定)目錄內將檔案複製到安裝目錄下的plugins目錄中,最後用 client 進行呼叫查看執行結果。

Copyright © PilotGaea 2022 Version:13.0 all right reserved,powered by Gitbook修訂時間: 2024-01-31 10:01:42