Shapefile(shp)是ESRI開發的一種空間數據格式,一般由后綴為shp(圖形數據)、shx(圖形索引數據)、dbf(屬性數據)、prj(投影信息)等一系列同名的文件構成,用於存儲矢量圖形數據。其中,shp、shx、dbf三個文件是一個完整的Shapefile數據必須包含的。
系統環境和第一篇的一樣,看代碼:
創建Shapefile
using System; using ESRI.ArcGIS.DataSourcesFile; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; // using ESRI.ArcGIS.Version; // 省略若干 static IFeatureClass CreateShapefile(string folder, string file, IFields fields) { // 創建Shapefile工作空間 var factory = new ShapefileWorkspaceFactory(); var workspace = factory.OpenFromFile(folder, 0); // 取得要素工作空間 var featureWorkspace = workspace as IFeatureWorkspace; // 創建要素類 var featureClass = featureWorkspace.CreateFeatureClass( file, // 名稱,不用帶后綴 fields, // 要素類的字段,其中必須包含Geometry字段 null, // 指定要素類包含何種要素,一般null即可 null, // 指定何種類型將被實例化為要素類擴展的,一般null即可 esriFeatureType.esriFTSimple, // 要素類型 "Shape",// 幾何字段的名稱,按慣例叫Shape即可 "" // 允許應用程序控制RDBMS中的表結構,一般用空字符串即可 ); return featureClass; }
要素類(FeatureClass) ?
A FeatureClass is an ObjectClass whose objects are features, that is, a feature class is a collection of spatial entities, modeled as objects with properties and behavior. All of the features in a feature class share the same attribute schema (they have the same set of named fields). The row objects handed out by a feature class support the IRow, IObject, and IFeature interfaces.
A feature class has a distinguished field of type Geometry, referred to as the shape field. The shape field stores the geometry (referred to as the shape property) for the features in the FeatureClass.
以上是官方的解釋,我的理解就是,Shapefile在內存中就當一個FeatureClass好了。
構造字段(IField)
一些字段存放圖形數據,另一些字段存放屬性數據。創建要素類必須要有一個圖形數據的Geometry字段,必須給定空間參考:
static IField CreateGeometryField(esriSRProjCSType projection) { // 創建幾何定義 var geometryDef = new GeometryDef(); var geometryDefEdit = (IGeometryDefEdit)geometryDef; geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint; // 創建空間參考 var spatialReferenceFactory = new SpatialReferenceEnvironment(); var spatialReference = spatialReferenceFactory.CreateProjectedCoordinateSystem((int)projection); geometryDefEdit.SpatialReference_2 = spatialReference; // 創建字段 var geometryField = new Field(); var geometryFieldEdit = (IFieldEdit)geometryField; geometryFieldEdit.Name_2 = "Shape";// 字段名按慣例叫Shape即可,與CreateFeatureClass中必須一致 geometryFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;// 字段類型Geometry geometryFieldEdit.GeometryDef_2 = geometryDef; return geometryField; }
而一般的字段,就不用那么麻煩了:
static IField CreateStringField(string name, int length) { var field = new Field(); var fieldEdit = (IFieldEdit)field; fieldEdit.Name_2 = name; fieldEdit.Type_2 = esriFieldType.esriFieldTypeString; fieldEdit.Length_2 = length; return field; }
還需要一個IFields,容納所有的字段
static void Main(string[] args) { try { Initialize(); // 創建Geometry字段 var geometryField = CreateGeometryField(esriSRProjCSType.esriSRProjCS_WGS1984UTM_50N); // 創建字段集合 var fields = new Fields(); var fieldsEdit = (IFieldsEdit)fields; fieldsEdit.AddField(geometryField); // 創建Shapefile var shapefile = CreateShapefile(AppDomain.CurrentDomain.BaseDirectory, "shapefile", fields); Console.WriteLine("完成"); } catch(Exception e) { Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); } Console.ReadKey(); }
參考鏈接
ArcGIS Resource Center :IFeatureWorkspace.CreateFeatureClass Method
FeatureLayer,FeatureDataset,FeatureClass,Feature幾個概念一點點總結,歡迎指教