iT邦幫忙

2022 iThome 鐵人賽

DAY 9
0
Software Development

歡迎來到 GIS 的世界!30 天從後端開始學 GIS系列 第 9

一起來用 DotSpatial 處理 Shapefile 吧! - 2 建立

  • 分享至 

  • xImage
  •  

文章同步發表至 Medium

建立的方法也很簡單,按照我們之前所說的,要先擁有一個包含 Geometry 資訊的 Feature 存在,我們才能針對這個區域設定他的 Attribute

但是我們要如何製造出一個 Geometry 呢? 以我的情況來說,PostgreSQL 是可以儲存空間資訊的,但我沒有辦法在不使用套件的情快下直接讀取出來,因此最方便快速的方法,就是把在 PostgreSQL 中的資料讀取成 WKT 的格式,再轉換成套件所支援的 Geometry 格式。

轉換 WKT

在 DotSpatial 中,要製造一個 Polygon 需要使用到其他 Geometry 的型別,其中最基本的就是 Coordinate,也就是 Point。

var wkt = "POLYGON((120.501320843584 23.643673036339,120.501491708153 23.6444211261058,120.501498926896 23.6444147291785,120.501524821969 23.6443917685627,120.501717159325 23.6442212029981,120.501677888785 23.644054697763,120.501579964979 23.6436249183856,120.501320843584 23.643673036339))";

// 把 WKT 字串切割成一組一組的座標
var points = wkt.Replace("POLYGON((", "").Replace("))", "").Split(',');

// 建立成 Coordinate
var coordinates = points.Select(point =>
{
    var pointArr = point.Split(' ');
    return new Coordinate(Convert.ToDouble(pointArr[0]), Convert.ToDouble(pointArr[1]));
}).ToList();

var polygon = new Polygon(coordinates);

這個方法有個缺點,如果是甜甜圈類型的 Polygon,就會因為 Polygon((),()) 的關係,多了一個不能被轉換成座標的部分,如果你的資料包含這種格式要記得另外做處理。

建立 Shapefile

建立一個 Shapefile 的完整程式碼如下:

// 設定 Shapefile 類型
var featureSet = new FeatureSet(FeatureType.Polygon);

// 設定座標系統
featureSet.Projection = ProjectionInfo.FromEpsgCode(4326);

// 設定屬性名稱
featureSet.DataTable.Columns.Add(new System.Data.DataColumn("序號", typeof(int)));
featureSet.DataTable.Columns.Add(new System.Data.DataColumn("名稱", typeof(string)));

// 讀取 WKT 為一個 Polygon
var wkt = "POLYGON((120.501320843584 23.643673036339,120.501491708153 23.6444211261058,120.501498926896 23.6444147291785,120.501524821969 23.6443917685627,120.501717159325 23.6442212029981,120.501677888785 23.644054697763,120.501579964979 23.6436249183856,120.501320843584 23.643673036339))";
var points = wkt.Replace("POLYGON((", "").Replace("))", "").Split(',');
var coordinates = points.Select(point =>
{
    var pointArr = point.Split(' ');
    return new Coordinate(Convert.ToDouble(pointArr[0]), Convert.ToDouble(pointArr[1]));
}).ToList();
var polygon = new Polygon(coordinates);

// 設定 Feature
var feature = new Feature(polygon);
var iFeature= featureSet.AddFeature(feature);
iFeature.DataRow["序號"] = 1;
iFeature.DataRow["名稱"] = "多邊形測試";

// 儲存
featureSet.SaveAs("newFile.shp", true);

把檔案用 QGIS 開啟的結果:


上一篇
一起來用 DotSpatial 處理 Shapefile 吧! - 1 讀取
下一篇
一起來用 GDAL 處理 Shapefile 吧! - 1 建立
系列文
歡迎來到 GIS 的世界!30 天從後端開始學 GIS30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言