C#+Arcengine+ArcGIS編程總結,完善中...

來源:互聯網
上載者:User

C# Arcengine編程總結

1、、環境配置:

安裝arcengine10.1、arcgis10.1、VS2010

2、、連結SDE工作空間兩種方式

        public static IWorkspace WorkgroupArcSdeWorkspaceFromString(string connectionString)
        {
            try
            {
                Type factoryType = Type.GetTypeFromProgID(
                    "esriDataSourcesGDB.SdeWorkspaceFactory");
                IWorkspaceFactory2 workspaceFactory2 = (IWorkspaceFactory2)
                    Activator.CreateInstance(factoryType);
                return workspaceFactory2.OpenFromString(connectionString, 0);
            }
            catch { return null; }
        }

   public static IWorkspace ConnectToTransactionalVersion(String server, String
           instance, String user, String password, String database, String version)
        {
            IPropertySet propertySet = new PropertySetClass();
            propertySet.SetProperty("SERVER", server);
            propertySet.SetProperty("INSTANCE", instance);
            propertySet.SetProperty("DATABASE", database);
            propertySet.SetProperty("USER", user);
            propertySet.SetProperty("PASSWORD", password);
            propertySet.SetProperty("VERSION", version);


            Type factoryType = Type.GetTypeFromProgID(
                "esriDataSourcesGDB.SdeWorkspaceFactory");
            IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance
                (factoryType);
            try
            {
                return workspaceFactory.Open(propertySet, 0);
            }
            catch (Exception ex)
            {
                return null;
            }
        }

3、座標系統自訂

        public static Dictionary<string, ISpatialReference> SpatialReference()
        {

           //OpenXmlDocument(座標系統檔案Pro目錄,"path")
            string xmlpath = FilePathHelper.OpenXmlDocument("System//SR_Xian1980_3_Degree_GK_Zone_35", "path");
            Dictionary<string, ISpatialReference> diction = new Dictionary<string, ISpatialReference>();
            ISpatialReferenceFactory pSRF = new SpatialReferenceEnvironmentClass();
            ISpatialReference spatial = pSRF.CreateESRISpatialReferenceFromPRJFile(xmlpath);
            diction.Add("XI'AN_1980", spatial);
            spatial = pSRF.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
            diction.Add("WGS_1984", spatial);
            return diction;
        }

4、座標系統轉換列子,如果將WGS_1984轉換XI'AN_1980

public override string getWGS1984ToXian1980(double x, double y, double z)
        {
            SDEHelper.getEngineLicense();
            IPoint ppoint = new PointClass();
            ppoint.PutCoords(x, y);
            ppoint.Z = z;
            IGeometry pgeometry = ppoint as IGeometry;
            pgeometry.Project(GISHelper.SpatialReference()["WGS_1984"]);
            pgeometry.Project(GISHelper.SpatialReference()["XI'AN_1980"]);
            string[] fileds={"X","Y","Z"};//轉換後的值
            string[] values={ppoint.X+"",ppoint.Y+"",ppoint.Z+""};
            return Json.stringToJson(fileds,values);
        }

5、如果C#+arcengine發布為webservice時,一定要使用功能時先註冊arcengine的license,否則arcengine功能服務使用

6、註冊arcengine代碼

       private static esriLicenseStatus pLicesestatus;//AE licese註冊
        public static void getEngineLicense()
        {
            if (m_AoInitialize == null)
            {
                //ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);
                ////初始化License,保證可以訪問SDE
                // m_AoInitialize = new AoInitializeClass();
                //pLicesestatus = (esriLicenseStatus)m_AoInitialize.IsProductCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB);
                //if (pLicesestatus == esriLicenseStatus.esriLicenseAvailable)
                //{
                //    if (pLicesestatus != esriLicenseStatus.esriLicenseCheckedOut)
                //        pLicesestatus = (esriLicenseStatus)m_AoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB);
                //}
                //綁定License
                //ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);
                ESRI.ArcGIS.RuntimeManager.BindLicense(ESRI.ArcGIS.ProductCode.EngineOrDesktop, ESRI.ArcGIS.LicenseLevel.Standard);
                //初始化License,保證可以訪問SDE
                m_AoInitialize = new AoInitializeClass();
                esriLicenseStatus pLicesestatus = (esriLicenseStatus)m_AoInitialize.IsProductCodeAvailable(esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB);




                if (pLicesestatus == esriLicenseStatus.esriLicenseAvailable)
                {
                    if (pLicesestatus != esriLicenseStatus.esriLicenseCheckedOut)
                        pLicesestatus = (esriLicenseStatus)m_AoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB);
                }
                AoInitialize aoi = new AoInitialize();
                esriLicenseExtensionCode extensionCodes = esriLicenseExtensionCode.esriLicenseExtensionCodeSpatialAnalyst;
                esriLicenseExtensionCode extensionCode = esriLicenseExtensionCode.esriLicenseExtensionCode3DAnalyst;
                esriLicenseExtensionCode extensionCode3 = esriLicenseExtensionCode.esriLicenseExtensionCodeAeronautical;
                esriLicenseExtensionCode extensionCode4 = esriLicenseExtensionCode.esriLicenseExtensionCodeAGINSPIRE;
                esriLicenseExtensionCode extensionCode5 = esriLicenseExtensionCode.esriLicenseExtensionCodeAirports;
                esriLicenseExtensionCode extensionCode6 = esriLicenseExtensionCode.esriLicenseExtensionCodeGeoStats;
                esriLicenseExtensionCode extensionCode7 = esriLicenseExtensionCode.esriLicenseExtensionCodeRuntimeBasic;
                esriLicenseExtensionCode extensionCode8 = esriLicenseExtensionCode.esriLicenseExtensionCodeVector;
                esriLicenseExtensionCode extensionCode9 = esriLicenseExtensionCode.esriLicenseExtensionCodeServerStandardEdition;
                esriLicenseExtensionCode extensionCode10 = esriLicenseExtensionCode.esriLicenseExtensionCodeServerEnterprise;
                esriLicenseExtensionCode extensionCode11 = esriLicenseExtensionCode.esriLicenseExtensionCodeServerAdvancedEdition;
                esriLicenseExtensionCode extensionCode12 = esriLicenseExtensionCode.esriLicenseExtensionCodeSchematicsSDK;
                esriLicenseExtensionCode extensionCode13 = esriLicenseExtensionCode.esriLicenseExtensionCodeSchematics;
                esriLicenseExtensionCode extensionCode14 = esriLicenseExtensionCode.esriLicenseExtensionCodeRuntimeStandard;
                esriLicenseExtensionCode extensionCode15 = esriLicenseExtensionCode.esriLicenseExtensionCodeRuntimeAdvanced;
                esriLicenseExtensionCode extensionCode16 = esriLicenseExtensionCode.esriLicenseExtensionCodeDataReViewer;
                esriLicenseExtensionCode extensionCode17 = esriLicenseExtensionCode.esriLicenseExtensionCodeBusinessStandard;
                esriLicenseExtensionCode extensionCode18 = esriLicenseExtensionCode.esriLicenseExtensionCodeBusiness;
                esriLicenseExtensionCode extensionCode19 = esriLicenseExtensionCode.esriLicenseExtensionCodeBusinessStandard;
                esriLicenseExtensionCode[] obj = { extensionCodes,extensionCode,extensionCode3,extensionCode4,extensionCode5
                                                 ,extensionCode6,extensionCode7,extensionCode8,extensionCode9
                                                 ,extensionCode10,extensionCode11,extensionCode12,extensionCode13,extensionCode14
                                                 ,extensionCode15,extensionCode16,extensionCode17,extensionCode18,extensionCode19, };
                esriLicenseProductCode pro = esriLicenseProductCode.esriLicenseProductCodeEngine;
                if (aoi.IsProductCodeAvailable(pro) == esriLicenseStatus.esriLicenseAvailable &&
                    aoi.IsExtensionCodeAvailable(pro, extensionCode) == esriLicenseStatus.esriLicenseAvailable &&
                    aoi.IsExtensionCodeAvailable(pro, extensionCodes) == esriLicenseStatus.esriLicenseAvailable
                     )
                {
                    aoi.Initialize(pro);
                    for (int i = 0; obj.Length > i; i++)
                    {
                        aoi.CheckOutExtension(obj[i]);
                    }
                }
            }
        }

7、擷取IfeatureClass的3種方式,通過載入shp路徑和開啟sde空間表、條件查詢sde值

  //通過載入shp路徑方式擷取IFeatureClass  
public  IFeatureClass  getPathIFeatureClass (IGeometry polygon{      
            IWorkspaceFactory pworkspacefactory = new ShapefileWorkspaceFactoryClass();
            IWorkspace pworkspace = pworkspacefactory.OpenFromFile( "C:\\SHP", 0);
            IFeatureWorkspace pfeatureworkspace = pworkspace as IFeatureWorkspace;
            IFeatureClass clipfeatureclass = pfeatureworkspace.OpenFeatureClass("temp.shp");
            IFeatureCursor pfeautrecursor = clipfeatureclass.Search(null, false);
            IFeature pfeature = pfeautrecursor.NextFeature();
            while (pfeature != null)
            {
                pfeature.Delete(); //刪除元素
                pfeature = pfeautrecursor.NextFeature();
            }
            pfeature = clipfeatureclass.CreateFeature();
            pfeature.Shape = polygon;
            pfeature.Store();
            //關閉資源鎖定  
            IWorkspaceFactoryLockControl ipWsFactoryLock;
            ipWsFactoryLock = (IWorkspaceFactoryLockControl)pworkspacefactory;
            if (ipWsFactoryLock.SchemaLockingEnabled)
            {
                ipWsFactoryLock.DisableSchemaLocking();
            }  
     }

   //開啟sde方式擷取IFeatureClass 

   public static IFeatureClass GetSDEIFeatureClass (IWorkspace work,string featureClassName)
        {
            try
            {
                IFeatureWorkspace pFeatureWorkSpace = work as IFeatureWorkspace;
                return pFeatureWorkSpace.OpenFeatureClass(featureClassName);//featureClassName是空間表名稱
            }
            catch { return null; }
        }

  public IFeatureClass GetFeatureClassByFilter(IWrokSpace space,string filter, string featureClassName)
        {
            IFeatureWorkspace pFeatureWorkSpace = space as IFeatureWorkspace;
            IQueryDef pQueryDef = pFeatureWorkSpace.CreateQueryDef();
            pQueryDef.Tables = featureClassName;
            pQueryDef.SubFields = "*";
            pQueryDef.WhereClause = filter;//filter查詢條件相當於比如: fileter=" 1=1 and id=1"
            IFeatureClass pFeatureClass = null;
            try
            {
                IFeatureDataset fDataset = pFeatureWorkSpace.OpenFeatureQuery("temp", pQueryDef);
                IFeatureClassContainer featureClassContainer = fDataset as IFeatureClassContainer;
                pFeatureClass = featureClassContainer.get_ClassByName("temp");
            }
            catch { }
            return pFeatureClass;
        }

8、建立IGeometry幾何對象(可以是IPoint、Polygon、polyline的等)

public IGeometry getGeometry(){
                IPointCollection ppointcollection = new PolygonClass();
                IPoint ppoint = new PointClass();
                ppoint.PutCoords(經度, 緯度);
ppoint.PutCoords(經度, 緯度);
                ppoint.PutCoords(經度, 緯度);
                object missing = Type.Missing;
                ppointcollection.AddPoint(ppoint, ref missing, ref missing);
                IPolygon polygon = ppointcollection as IPolygon;//可是是IPoint/IPolyline
                //通過座標集合構建一個閉合面d
                IGeometry pgeometry = intersectPolygon as IGeometry;
                pgeometry.Project(座標系統1980); //如果原座標值是80座標,那麼先將座標系統設定為1980
                 pgeometry.Project(座標系統1984);//第二部才可設定為1984
                polygon .Close();
                return pgeometry;
}

9、實現增刪改查

http://www.cnblogs.com/feilong3540717/archive/2011/03/11/1981842.html

10、柵格資料使用

http://blog.csdn.net/lysc_forever/article/details/7723354



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.