1. 程式人生 > >arcEngine開發之根據點坐標創建Shp圖層

arcEngine開發之根據點坐標創建Shp圖層

幾何 添加 文件 works substring DC point ret code

思路

根據點坐標創建Shapefile文件大致思路是這樣的:
(1)創建表的工作空間,通過 IField、IFieldsEdit、IField 等接口創建屬性字段,添加到要素集中。
(2)根據獲取點的坐標信息為屬性字段賦值,進而得到圖層的要素集

必要元素

將創建 Shapefile 文件代碼封裝成方法如下,這裏說明一下創建一 個 Shapefile 文件至少需要配置的元素:
(1)首先,當我們創建一個shp文件時,ArcMap會自動生成如下字段:
技術分享圖片
其中shp表示幾何字段,我們需要設置 IFile.NameIField.Type 來定義這個字段
(2)其次,如果我們沒有設置空間坐標時,會彈出如下對話框:
技術分享圖片


因此第二步我們需要設置shp文件的空間坐標。 這裏是通過設置 IField.GeometryDef 實現的。這個屬性其實是IGeometryDef接口,通過對這個接口的 GeometryTypeSpatialReference 屬性進行設置即可完成對空間坐標的定義。

代碼說明

封裝的這段代碼裏,發現對於 IFeatureIFeatureClass 還是不怎麽理解,通過查閱資料發現, IFeature 繼承自 IRowIObject ,由於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圖層