搜尋此網誌

2015年11月29日 星期日

利用DotSpatial建立ShapeFile檔案 - Point

DotSpatial的功能很強大
除了前幾篇介紹到的功能外
也可以用來建立向量ShapeFile檔案
以下就來實作建立 Point 的 ShapeFile
程式碼如下:

public static string CreatePoint(string SaveFileName, int EpsgCode, double[][] Points, string[,] MetaData)
        {
            Feature f = new Feature();
            FeatureSet fs = new FeatureSet(f.FeatureType);
            fs.Projection = ProjectionInfo.FromEpsgCode(EpsgCode);

            //宣告MetaData欄位
            for (int i = 0; i < MetaData.GetLength(1); i++)
            {
                fs.DataTable.Columns.Add(new DataColumn(MetaData[0, i], typeof(string)));
            }

            //設定點位
            for (int i = 0; i < Points.GetLength(0); i++)
            {
                Coordinate coor = new Coordinate(Points[i][0], Points[i][1]);

                //設定MetaData資料
                DotSpatial.Topology.Point geom = new DotSpatial.Topology.Point(coor);
                IFeature feature = fs.AddFeature(geom);
                feature.DataRow.BeginEdit();
                for (int j = 0; j < MetaData.GetLength(1); j++)
                {
                    feature.DataRow[j] = MetaData[i + 1, j];
                }
                feature.DataRow.EndEdit();
            }

            fs.SaveAs(SaveFileName, true);

            return "Success";
        }

參數意義:
SaveFileName:要建立的檔案名稱含路徑
EpsgCode:要建立檔案的EpsgCode
Points:點的陣列資料
MetaData:屬性陣列資料

呼叫方式:
Cls_ShapeFile.CreatePoint("test.shp",3826, new double[2][] { new double[2] { 100, 200 }, new double[2] { 150, 340 } }, new string[3, 3] { { "A", "B", "C" }, { "a1", "b1", "c1" }, { "a2", "b2", "c2" } });

實作結果畫面:
MeatData畫面

希望對大家有幫助喔

7 則留言:

  1. 更新更好的寫法,簡化輸入參數的複雜程度
    改以Geometry的格式去描述點位資訊

    public static string CreatePoint(string SaveFileName, int EpsgCode, string[] GeometryText, string[] MetaData)
    {
    try
    {
    DotSpatial.Data.FeatureSet fs = new DotSpatial.Data.FeatureSet(DotSpatial.Topology.FeatureType.Point);
    fs.Projection = DotSpatial.Projections.ProjectionInfo.FromEpsgCode(EpsgCode);

    //宣告MetaData欄位
    string[] strColumn = MetaData[0].Split(',');
    for (int i = 0; i < strColumn.Length; i++)
    {
    fs.DataTable.Columns.Add(new System.Data.DataColumn(strColumn[i], typeof(string)));
    }

    for (int i = 0; i < GeometryText.Length; i++)
    {
    string strGeometry = GeometryText[i].Replace("POINT (", "");
    strGeometry = strGeometry.Replace(")", "");
    strGeometry = strGeometry.Trim();
    string[] Points = strGeometry.Split(' ');
    string[] ColumnData = MetaData[i + 1].Split(',');

    //設定點位
    DotSpatial.Topology.Coordinate coord = new DotSpatial.Topology.Coordinate(Convert.ToDouble(Points[0]), Convert.ToDouble(Points[1]));
    DotSpatial.Topology.Point geom = new DotSpatial.Topology.Point(coord);
    DotSpatial.Data.IFeature feature = fs.AddFeature(geom);

    //設定MetaData資料
    feature.DataRow.BeginEdit();
    for (int j = 0; j < strColumn.Length; j++)
    {
    feature.DataRow[j] = ColumnData[j];
    }
    feature.DataRow.EndEdit();
    }

    fs.SaveAs(SaveFileName, true);

    return "Success";
    }
    catch (Exception er)
    {
    return er.Message.ToString();
    }
    }

    呼叫方式:
    string[] GeometryText = new string[2];
    GeometryText[0] = "POINT (120.674172658635 24.1101156784629)";
    GeometryText[1] = "POINT (120.669897953672 24.1081119105116)";
    string[] MetaData = new string[3];
    MetaData[0] = "A,B,C";
    MetaData[1] = "1,11,111";
    MetaData[2] = "2,22,222";
    strResult = Cls_ShapeFile.CreatePoint(@"點.shp", 4326, GeometryText, MetaData);

    回覆刪除
  2. 請問Will大大?
    是否有修改某個位置點的範例呢?
    感謝~

    回覆刪除
    回覆
    1. Hi 您好啊
      目前我沒有整理修改特定點的範例,不過若要修改特定的點,必須要先知道要修改哪一個點,一般來說要先知道index key,也就是他儲存的順序,不過並不好處理
      若單純只是修改某個位置點的metadata相對簡單得多
      若是要修改某個點的點位資訊,比較建議仿造一般ArcGIS/QGIS做法,重新製作一份後覆蓋掉,比較不會有問題喔
      謝謝

      刪除
    2. 作者已經移除這則留言。

      刪除
    3. 感謝Will大大回覆~
      其實我也在國內外網站找了好久,改變位置點,真的沒有很完整的解法,
      我想我知道怎麼做了,
      可能的作法是先刪除此位置,然後再新增此筆位置。

      不知此作法可好?(因為此資料太大,約有24萬筆)

      非常感謝Will大大答覆~

      刪除
    4. Hi 您好啊
      若資料量大時,確實這樣做是最好的方法喔
      先刪除再新增
      你的做法沒有錯喔
      謝謝

      刪除
    5. 非常感謝Will大大答案回覆。

      刪除