C#+GDAL读写文件
读取shp文件:
1 private void btnBrower_Click(object sender, EventArgs e)
2 {
3 OpenFileDialog dlg = new OpenFileDialog();
4 dlg.Title = "打开ShapeFile数据";
5 dlg.Filter = "ShapeFile数据(*.shp)|*.shp";
6 if (dlg.ShowDialog() == DialogResult.OK)
7 {
8 Ogr.RegisterAll();
9
10 string strVectorFile = dlg.FileName;
11 textBox1.Text = strVectorFile;
12 //打开数据
13 DataSource ds = Ogr.Open(strVectorFile, 0);
14 if (ds == null)
15 {
16 listBox1.Items.Add(string.Format("打开文件【{0}】失败!", strVectorFile));
17 return;
18 }
19 listBox1.Items.Add(string.Format("打开文件【{0}】成功!", strVectorFile));
20
21 // 获取该数据源中的图层个数,一般shp数据图层只有一个,如果是mdb、dxf等图层就会有多个
22 int iLayerCount = ds.GetLayerCount();
23
24 // 获取第一个图层
25 Layer oLayer = ds.GetLayerByIndex(0);
26 if (oLayer == null)
27 {
28 listBox1.Items.Add(string.Format("获取第{0}个图层失败!\n", 0));
29 return;
30 }
31
32 // 对图层进行初始化,如果对图层进行了过滤操作,执行这句后,之前的过滤全部清空
33 oLayer.ResetReading();
34
35 // 通过属性表的SQL语句对图层中的要素进行筛选,这部分详细参考SQL查询章节内容
36 //oLayer.SetAttributeFilter("\"NAME99\"LIKE \"北京市市辖区\"");
37
38 // 通过指定的几何对象对图层中的要素进行筛选
39 //oLayer.SetSpatialFilter();
40
41 // 通过指定的四至范围对图层中的要素进行筛选
42 //oLayer.SetSpatialFilterRect();
43
44 // 获取图层中的属性表表头并输出
45 listBox1.Items.Add("属性表结构信息:");
46 FeatureDefn oDefn = oLayer.GetLayerDefn();
47 int iFieldCount = oDefn.GetFieldCount();
48 for (int iAttr = 0; iAttr < iFieldCount; iAttr++)
49 {
50 FieldDefn oField = oDefn.GetFieldDefn(iAttr);
51
52 listBox1.Items.Add(string.Format("{0}:{1} ({2}.{3})", oField.GetNameRef(),
53 oField.GetFieldTypeName(oField.GetFieldType()),
54 oField.GetWidth(), oField.GetPrecision()));
55 }
56 // 输出图层中的要素个数
57 listBox1.Items.Add(string.Format("要素个数 = {0}", oLayer.GetFeatureCount(0)));
58 Feature oFeature = null;
59 // 下面开始遍历图层中的要素
60 while ((oFeature = oLayer.GetNextFeature()) != null)
61 {
62 Geometry geo = oFeature.GetGeometryRef();
63 wkbGeometryType wkb = geo.GetGeometryType();
64 listBox1.Items.Add(string.Format("当前处理第要素值:{0}", wkb.ToString()));
65 string strGml=geo.ExportToGML();
66 listBox1.Items.Add(strGml);
67 listBox1.Items.Add(string.Format("当前处理第{0}个: \n属性值:", oFeature.GetFID()));
68
69 // 获取要素中的属性表内容
70 for (int iField = 0; iField < iFieldCount; iField++)
71 {
72 FieldDefn oFieldDefn = oDefn.GetFieldDefn(iField);
73 FieldType type = oFieldDefn.GetFieldType();
74 switch (type)
75 {
76 case FieldType.OFTString:
77 listBox1.Items.Add(string.Format("{0}\t", oFeature.GetFieldAsString(iField)));
78 break;
79 case FieldType.OFTReal:
80 listBox1.Items.Add(string.Format("{0}\t", oFeature.GetFieldAsDouble(iField)));
81 break;
82 case FieldType.OFTInteger:
83 listBox1.Items.Add(string.Format("{0}\t", oFeature.GetFieldAsInteger(iField)));
84 break;
85 default:
86 listBox1.Items.Add(string.Format("{0}\t", oFeature.GetFieldAsString(iField)));
87 break;
88 }
89 }
90 // 获取要素中的几何体
91 Geometry oGeometry = oFeature.GetGeometryRef();
92 // 为了演示,只输出一个要素信息
93 break;
94 }
95 listBox1.Items.Add("数据集关闭!");
96 }
97 }
读取个人地理数据库mdb:
1 private void btnBrower_Click(object sender, EventArgs e) 2 { 3 OpenFileDialog dlg = new OpenFileDialog(); 4 dlg.Title = "打开Personal Geodatabase"; 5 dlg.Filter = "Personal Geodatabase数据(*.mdb)|*.mdb"; 6 if (dlg.ShowDialog() == DialogResult.OK) 7 { 8 Ogr.RegisterAll(); 9 10 string strVectorFile = dlg.FileName; 11 textBox1.Text = strVectorFile; 12 string strInfo = string.Empty; 13 //打开数据 14 DataSource ds = Ogr.Open(strVectorFile, 0); 15 if (ds == null) 16 { 17 strInfo += string.Format("打开文件【{0}】失败!\n", strVectorFile); 18 return; 19 } 20 strInfo += string.Format("打开文件【{0}】成功!\n", strVectorFile); 21 22 // 获取该数据源中的图层个数,一般shp数据图层只有一个,如果是mdb、dxf等图层就会有多个 23 int iLayerCount = ds.GetLayerCount(); 24 strInfo += string.Format("个人地理数据库共包含{0}个图层!\n", iLayerCount); 25 // 获取第一个图层 26 Layer oLayer = ds.GetLayerByIndex(1); 27 if (oLayer == null) 28 { 29 strInfo += string.Format("获取第{0}个图层失败!\n", 1); 30 return; 31 } 32 strInfo += string.Format("第0个图层名称:{0}\n", oLayer.GetName()); 33 // 对图层进行初始化,如果对图层进行了过滤操作,执行这句后,之前的过滤全部清空 34 oLayer.ResetReading(); 35 36 // 通过属性表的SQL语句对图层中的要素进行筛选,这部分详细参考SQL查询章节内容 37 //oLayer.SetAttributeFilter("\"NAME99\"LIKE \"北京市市辖区\""); 38 39 // 通过指定的几何对象对图层中的要素进行筛选 40 //oLayer.SetSpatialFilter(); 41 42 // 通过指定的四至范围对图层中的要素进行筛选 43 //oLayer.SetSpatialFilterRect(); 44 45 // 获取图层中的属性表表头并输出 46 strInfo += "属性表结构信息:\n"; 47 FeatureDefn oDefn = oLayer.GetLayerDefn(); 48 int iFieldCount = oDefn.GetFieldCount(); 49 for (int iAttr = 0; iAttr < iFieldCount; iAttr++) 50 { 51 FieldDefn oField = oDefn.GetFieldDefn(iAttr); 52 53 strInfo += string.Format("{0}:{1} ({2}.{3})\n", oField.GetNameRef(), 54 oField.GetFieldTypeName(oField.GetFieldType()), 55 oField.GetWidth(), oField.GetPrecision()); 56 } 57 // 输出图层中的要素个数 58 strInfo += string.Format("要素个数 = {0}\n", oLayer.GetFeatureCount(0)); 59 Feature oFeature = null; 60 // 下面开始遍历图层中的要素 61 while ((oFeature = oLayer.GetNextFeature()) != null) 62 { 63 Geometry geo = oFeature.GetGeometryRef(); 64 if (geo==null) 65 { 66 break; 67 } 68 wkbGeometryType wkb = geo.GetGeometryType(); 69 strInfo += string.Format("当前处理第{0}要素值:{1}\n", oFeature.GetFID(), wkb.ToString()); 70 string strGml = geo.ExportToGML(); 71 strInfo += strGml; 72 strInfo += string.Format("\n当前处理第{0}个: \n属性值:", oFeature.GetFID()); 73 74 // 获取要素中的属性表内容 75 for (int iField = 0; iField < iFieldCount; iField++) 76 { 77 FieldDefn oFieldDefn = oDefn.GetFieldDefn(iField); 78 FieldType type = oFieldDefn.GetFieldType(); 79 switch (type) 80 { 81 case FieldType.OFTString: 82 strInfo += string.Format("{0}\t", oFeature.GetFieldAsString(iField)); 83 break; 84 case FieldType.OFTReal: 85 strInfo += string.Format("{0}\t", oFeature.GetFieldAsDouble(iField)); 86 break; 87 case FieldType.OFTInteger: 88 strInfo += string.Format("{0}\t", oFeature.GetFieldAsInteger(iField)); 89 break; 90 default: 91 strInfo += string.Format("{0}\t", oFeature.GetFieldAsString(iField)); 92 break; 93 } 94 } 95 // 获取要素中的几何体 96 Geometry oGeometry = oFeature.GetGeometryRef(); 97 // 为了演示,只输出一个要素信息 98 break; 99 } 100 strInfo += "\n数据集关闭!"; 101 richTextBox1.Text = strInfo; 102 } 103 }
作者:太一吾鱼水
文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。
欢迎大家留言交流,转载请注明出处。