> ## Content Index
> Fetch the complete content index at: https://blog.anthea.day/llms.txt
> Use this file to discover other available public pages before exploring further.

# 歡迎來到 GIS 的世界－Day 08：用 DotSpatial 讀取
- URL: https://blog.anthea.day/series-2022-ithome-8/
- Published: 2022-09-22T15:55:44.000Z
- Updated: 2026-10-21T04:09:58.000Z
- Author: Anthea / 芫荽
- Tags: #Migrated-1792241843742, #Import 2026-10-17 12:57, Coding, 2022 iThome 鐵人賽：歡迎來到 GIS 的世界

DotSpatial 是第一個登場的處理 Shapefile 套件，是我第一個在職場中接觸到的套件，也是我到目前為止還有疑惑還沒釐清的套件。

之所以在有疑問的情況下還是選擇介紹這個套件的原因，除了能處理 Shapefile 的套件本來就不多之外，也有可能會遇到像我一樣的情況，舊有的專案需要使用這個套件進行維護，所以最後還是選擇納入這次文章的範圍。

#### 環境說明 — .NET Framework 4.8

DotSpatial 在他的 [GitGub](https://github.com/DotSpatial/DotSpatial?ref=blog.anthea.day) 上有特別說明：

> DotSpatial is a geographic information system library written for .NET Framework.

因此只有這個套件的範例不是使用 .NET 6 來撰寫。另外要注意的是，除了主要的  
`DotSpatial.Data` 之外，其餘套件有些在預設安裝的時候不會選擇 1.9.0 的版本，之前有遇到過版次不一導致功能出現一些問題，這時候可以試試看升版能不能解決。

![](https://cdn-images-1.medium.com/max/800/1*Q7EMGrdkggJUdvaRu70ObQ.png)

### 讀取

```C#
var shpPath = "test.shp";
var columnInfo = new Dictionary<int, string>();
var shapefile = Shapefile.OpenFile(shpPath);
var fields = shapefile.Attributes.Columns;
for (var i = 0; i < fields.Count; i++)
{
    // 列出所有欄位名稱
    var field = fields[i];
    columnInfo.Add(i, field.ColumnName);
}var feature = shapefile.Features.FirstOrDefault();
var data = feature.DataRow.ItemArray;
for (var i = 0; i < data.Length; i++)
{
    // 取得所有的值
    if (string.IsNullOrEmpty(data[i].ToString())) continue;
    Console.WriteLine($"{columnInfo[i],-11}：{data[i]}");
}// 取得類型和 WKT
Console.WriteLine($"{feature.GeometryType,-11}：{feature.BasicGeometry.ToString()}");
```

就像前一篇所介紹的，需要先找到 `Feature` 才能取得資料。讀取完成的結果如下圖：

![](https://cdn-images-1.medium.com/max/800/0*RNpf0FTMztluSW1a.png)