arcEngine開發之根據點坐標創建Shp圖層
阿新 • • 發佈:2018-03-05
幾何 添加 文件 works substring DC point ret code
因此第二步我們需要設置shp文件的空間坐標。 這裏是通過設置 IField.GeometryDef 實現的。這個屬性其實是IGeometryDef接口,通過對這個接口的 GeometryType 和 SpatialReference 屬性進行設置即可完成對空間坐標的定義。
思路
根據點坐標創建Shapefile文件大致思路是這樣的:
(1)創建表的工作空間,通過 IField、IFieldsEdit、IField 等接口創建屬性字段,添加到要素集中。
(2)根據獲取點的坐標信息為屬性字段賦值,進而得到圖層的要素集
必要元素
將創建 Shapefile 文件代碼封裝成方法如下,這裏說明一下創建一 個 Shapefile 文件至少需要配置的元素:
(1)首先,當我們創建一個shp文件時,ArcMap會自動生成如下字段:
其中shp表示幾何字段,我們需要設置 IFile.Name 和 IField.Type 來定義這個字段
(2)其次,如果我們沒有設置空間坐標時,會彈出如下對話框:
因此第二步我們需要設置shp文件的空間坐標。 這裏是通過設置 IField.GeometryDef 實現的。這個屬性其實是IGeometryDef接口,通過對這個接口的 GeometryType 和 SpatialReference 屬性進行設置即可完成對空間坐標的定義。
代碼說明
封裝的這段代碼裏,發現對於 IFeature 和 IFeatureClass 還是不怎麽理解,通過查閱資料發現, IFeature 繼承自 IRow 和 IObject ,由於IFeature 可以通過 IFeatureClass 創建而成,因此可以知道的是IFeatureClass 是和ITable處於同一個級別,IFeature 相當於是屬性表中的一行。
代碼
private IFeatureLayer CreateShpFromPoints(List<CPoint> cPointList,string filePath) { //其中,CPoint為存儲點數據的結構體,包含name,x,y屬性 //利用IWorkspaceFactory打開工作空間 int index = filePath.LastIndexOf(‘\\‘); string folder = filePath.Substring(0, index); string shapeName = filePath.Substring(index + 1); IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass(); IFeatureWorkspace pFWS = (IFeatureWorkspace)pWSF.OpenFromFile(folder, 0); //創建字段編輯所需要的接口 IFields pFields = new FieldsClass(); IFieldsEdit pFieldsEdit; pFieldsEdit = (IFieldsEdit)pFields; //給字段屬性、類型賦值 IField pField = new FieldClass(); IFieldEdit pFieldEdit = (IFieldEdit)pField; pFieldEdit.Name_2 = "Shape"; pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry; IGeometryDef pGeometryDef = new GeometryDefClass(); IGeometryDefEdit pGDefEdit = (IGeometryDefEdit)pGeometryDef; pGDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint; //定義坐標系 ISpatialReferenceFactory pSRF = new SpatialReferenceEnvironmentClass(); ISpatialReference pSpatialReference = pSRF.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_Beijing1954); pGDefEdit.SpatialReference_2 = pSpatialReference; pFieldEdit.GeometryDef_2 = pGeometryDef; pFieldsEdit.AddField(pField); IFeatureClass pFeatureClass; pFeatureClass = pFWS.CreateFeatureClass(shapeName, pFields, null, null, esriFeatureType.esriFTSimple, "Shape", ""); IPoint pPoint = new PointClass(); for (int j = 0; j < cPointList.Count; j++) { pPoint.X = cPointList[j].X; pPoint.Y = cPointList[j].Y; IFeature pFeature = pFeatureClass.CreateFeature(); pFeature.Shape = pPoint; pFeature.Store(); } IFeatureLayer pFeatureLayer = new FeatureLayerClass(); pFeatureLayer.Name = shapeName; pFeatureLayer.FeatureClass = pFeatureClass; return pFeatureLayer; }
arcEngine開發之根據點坐標創建Shp圖層