首页 > 编程学习 > C#+Arcengine+ArcGIS编程总结,完善中...

C#+Arcengine+ArcGIS编程总结,完善中...

发布时间:2022/6/23 23:33:03

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



Copyright © 2010-2022 ngui.cc 版权所有 |关于我们| 联系方式| 豫B2-20100000