zoukankan      html  css  js  c++  java
  • arcgis gp

    ArcGIS GPConsole
    ArcGIS_GPConsole_CSharp\ArcGIS_GPConsole\Program.cs
    // Copyright 2010 ESRI
    // 
    // All rights reserved under the copyright laws of the United States
    // and applicable international laws, treaties, and conventions.
    // 
    // You may freely redistribute and use this sample code, with or
    // without modification, provided you include the original copyright
    // notice and use restrictions.
    // 
    // See the use restrictions.
    // 
    
    
    
    
    using System;
    using System.Collections.Generic;
    using System.Text;
    using ESRI.ArcGIS.Carto;
    using ESRI.ArcGIS.esriSystem;
    using ESRI.ArcGIS.Server;
    using ESRI.ArcGIS.Geodatabase;
    using ESRI.ArcGIS.Geoprocessor;
    using ESRI.ArcGIS.Geoprocessing;
    using ESRI.ArcGIS.Geometry;
    
    namespace ArcGIS_GPConsole_CSharp
    {
        class Program
        {
    
            private static LicenseInitializer m_AOLicenseInitializer = new ArcGIS_GPConsole_CSharp.LicenseInitializer();
    
            private static string servername = "localhost";
    
            [STAThread]
            static void Main(string[] args)
            {
                bool bInitialized = false;
                ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop);
    
                if (!ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop))
                {
                    Console.WriteLine("This application could not load the correct version of ArcGIS.");
                    return;
                }
    
                //ESRI License Initializer generated code.
                if(m_AOLicenseInitializer.InitializeApplication(new esriLicenseProductCode[] { esriLicenseProductCode.esriLicenseProductCodeArcInfo },
                new esriLicenseExtensionCode[]{ })==true)
                {
                    bInitialized = true;
                    Console.WriteLine("Engine initialized");
                    Console.WriteLine("License type: " + esriLicenseProductCode.esriLicenseProductCodeArcInfo.ToString());
                }
                else
                {
                    Console.WriteLine("Engine NOT initialized");
                }
    
                IServerContext serverContext = null;
    
                try
                {
                    System.Console.WriteLine("Start...");
    
                    GISServerConnection serverConnection= new GISServerConnection ();
                    serverConnection.Connect(servername);
                    IServerObjectManager serverManager = serverConnection.ServerObjectManager;
    
                    serverContext = serverManager.CreateServerContext("", "");
    
                    ESRI.ArcGIS.Geoprocessor.Geoprocessor gp = new ESRI.ArcGIS.Geoprocessor.Geoprocessor(serverContext);
    
                    ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactory ffactory = null;
                    ESRI.ArcGIS.DataSourcesGDB.AccessWorkspaceFactory afactory = null;
                    ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactory sfactory = null;
                    ESRI.ArcGIS.DataSourcesGDB.SdeWorkspaceFactory sdefactory = null;
                    PropertySet sdeServerProperties = null;
                    IFeatureLayer shpflayer = null;
                    IVariantArray varray = null;
                    IFeatureLayer sdeflayer = null;
    
                    if (gp.IServerContext != null)
                    {
                        System.Console.WriteLine("Server");
                        ffactory = (ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactory)serverContext.CreateObject("esriDataSourcesGDB.FileGDBWorkspaceFactory");
                        afactory = (ESRI.ArcGIS.DataSourcesGDB.AccessWorkspaceFactory)serverContext.CreateObject("esriDataSourcesGDB.AccessWorkspaceFactory");
                        sfactory = (ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactory)serverContext.CreateObject("esriDataSourcesFile.ShapefileWorkspaceFactory");
                        sdefactory = (ESRI.ArcGIS.DataSourcesGDB.SdeWorkspaceFactory)serverContext.CreateObject("esriDataSourcesGDB.SdeWorkspaceFactory");
                        sdeServerProperties = (PropertySet)serverContext.CreateObject("esriSystem.PropertySet");
                        shpflayer = (IFeatureLayer)serverContext.CreateObject("esriCarto.FeatureLayer");
                        varray = (IVariantArray)serverContext.CreateObject("esriSystem.VarArray");
                        sdeflayer = (IFeatureLayer)serverContext.CreateObject("esriCarto.FeatureLayer");
                    }
                    else
                    {
                        System.Console.WriteLine("Local");
                        if (!bInitialized)
                        {
                            System.Console.WriteLine("Engine license must be initialized.");
                            System.Console.ReadLine();
                            return;
                        }
                        ffactory = new ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactoryClass();
                        afactory = new ESRI.ArcGIS.DataSourcesGDB.AccessWorkspaceFactoryClass();
                        sfactory = new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactoryClass();
                        sdefactory = new ESRI.ArcGIS.DataSourcesGDB.SdeWorkspaceFactoryClass();
                        sdeServerProperties = new PropertySetClass();
                        shpflayer = new ESRI.ArcGIS.Carto.FeatureLayerClass();
                        varray = (IVariantArray)new VarArrayClass();
                        sdeflayer = new ESRI.ArcGIS.Carto.FeatureLayerClass();
                    }
    
                    gp.OverwriteOutput = true;
    
                    ///* Geoprocessor .NET wrapper - Copy Features tool ***
                    ESRI.ArcGIS.DataManagementTools.CopyFeatures copyfeatures = new ESRI.ArcGIS.DataManagementTools.CopyFeatures();
    
                    string inputfile = @"C:\Program Files\ArcGIS\DeveloperKit10.0\Samples\data\Usa\USA.gdb";
                    string inputfeatureclass = "states";
    
                    string outputfile = "c:/temp";
                    string outputfeatureclass = "output.shp";
    
                    IFeatureWorkspace fws = (IFeatureWorkspace)ffactory.OpenFromFile(inputfile, 0);
                    IFeatureClass infc = fws.OpenFeatureClass(inputfeatureclass);
    
                    copyfeatures.in_features = infc;
                    copyfeatures.out_feature_class = @outputfile + "/" + outputfeatureclass;
    
                    varray.Add(copyfeatures.in_features);
                    varray.Add(copyfeatures.out_feature_class);
    
                    gp.Execute(copyfeatures.ToolName + "_" + copyfeatures.Alias, varray, null);
                    processGPMessages(gp);
    
                    /* Work with the IGeoProcessor COM object reference 
                    IGeoProcessor igp = gp.IGeoProcessor;
    
                    IWorkspaceFactory iwf = (IWorkspaceFactory)serverContext.CreateObject("esriGeoprocessing.ToolboxWorkspaceFactory");
    
                    IToolboxWorkspace itw = (IToolboxWorkspace)iwf.OpenFromFile(@"c:/Program Files/ArcGIS/ArcToolbox/Toolboxes/", 0);
                    IGPToolbox tbox = (IGPToolbox)itw.OpenToolbox(copyfeatures.ToolboxName);
                    IGPTool tool = (IGPTool)tbox.OpenTool(copyfeatures.ToolName);
                    IArray parameters = tool.ParameterInfo;
    
                    for (int j = 0; j < parameters.Count; j++)
                    {
                        IGPParameter gparam = (IGPParameter)parameters.get_Element(j);
     
                        System.Console.WriteLine("Parameter name: " + gparam.Name);
                        System.Console.WriteLine("Parameter Data Type Display Name: " + gparam.DataType.DisplayName);
                        System.Console.WriteLine("Parameter Data Type Name: " + gparam.DataType.Name);
                        System.Console.WriteLine("Is Parameter required?: " + gparam.ParameterType.ToString());
                        
                        System.Console.WriteLine("Parameter Value Data Type: " + gparam.Value.DataType.Name);
                        System.Console.WriteLine("Parameter Value as Text: " + gparam.Value.GetAsText());
                    }
                    */
    
                    //Use the Geoprocessor with a custom toolbox and model on the server
                    Console.WriteLine("Call Geoprocessor Example");
                    RunGeoprocessorExample(gp);
    
                    //Use the IGPServer with a published GP service
                    Console.WriteLine("Call IGPServer Example");
                    RunGPServerExample();
    
                    System.Console.WriteLine("Finish");
                    Console.ReadLine();
    
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex.Message);
                    System.Diagnostics.Debug.WriteLine(ex.StackTrace);
                }
                finally
                {
                    serverContext.ReleaseContext();
                    if (bInitialized)
                    m_AOLicenseInitializer.ShutdownApplication();
                }
            }
    
            static void processGPMessages(Geoprocessor gp)
            {
                IGPMessages gpMsgs = gp.IGeoProcessor.GetReturnMessages();
                IArray ir = gpMsgs.Messages;
                int ic = ir.Count;
                for (int i = 0; i < ic; i++)
                {
                    Console.WriteLine(gpMsgs.GetMessage(i).Description);
                }
            }
    
    
            public static void RunGeoprocessorExample(Geoprocessor gp)
            {
    
                try
                {
                    IServerContext serverContext = null;
                    if (gp.IServerContext != null)
                    {
                        serverContext = gp.IServerContext;
                    }
                    else
                    {
                        return;
                    }
    
    
                    gp.AddToolbox(@"C:\Program Files\ArcGIS\DeveloperKit10.0\Samples\data\GP\RunBuffer\BufferTools.tbx");
                    gp.SetEnvironmentValue("scratchWorkspace", @"c:/temp");
                    gp.OverwriteOutput = true;
    
                    // Need reference to GPTool to get parameter type information
                    IWorkspaceFactory iwf = (IWorkspaceFactory)serverContext.CreateObject("esriGeoprocessing.ToolboxWorkspaceFactory");
                    IToolboxWorkspace itw = (IToolboxWorkspace)iwf.OpenFromFile(@"C:\Program Files\ArcGIS\DeveloperKit10.0\Samples\data\GP\RunBuffer\", 0);
                    IGPToolbox tbox = (IGPToolbox)itw.OpenToolbox("BufferTools");
                    IGPTool tool = (IGPTool)tbox.OpenTool("BufferPoints");
    
                    IVariantArray varray = (IVariantArray)serverContext.CreateObject("esriSystem.VarArray");
    
                    IArray parameters = tool.ParameterInfo;
    
                    // Iterate through parameters to get data types                
                    /*for (int j = 0; j < parameters.Count; j++)
                    {
                        IGPParameter gparam = (IGPParameter)parameters.get_Element(j);
    
                        System.Console.WriteLine("Parameter name: " + gparam.Name);
                        System.Console.WriteLine("Parameter Data Type Display Name: " + gparam.DataType.DisplayName);
                        System.Console.WriteLine("Parameter Data Type Name: " + gparam.DataType.Name);
                        System.Console.WriteLine("Is Parameter required?: " + gparam.ParameterType.ToString());
    
                        System.Console.WriteLine("Parameter Value Data Type: " + gparam.Value.DataType.Name);
                        System.Console.WriteLine("Parameter Value as Text: " + gparam.Value.GetAsText());
    
                    }*/
    
                    IGPParameter gpp1 = (IGPParameter)parameters.get_Element(0);
                    IGPRecordSet gprecset = (IGPRecordSet)gpp1.Value;
    
                    IRecordSet rs = gprecset.RecordSet;
    
                    IFields flds = rs.Fields;
                    int shpfldindex = flds.FindField("Shape");
    
                    IField fld = flds.get_Field(shpfldindex);
                    ISpatialReference inputsr = fld.GeometryDef.SpatialReference;
    
                    IRecordSetInit rsi = (IRecordSetInit)rs;
                    ICursor cur = rsi.Insert();
                    IRowBuffer rb = rsi.CreateRowBuffer();
                    IPoint ipnt = (IPoint)serverContext.CreateObject("esriGeometry.Point");
                    ipnt.PutCoords(1000000, 1000000);
                    rb.set_Value(shpfldindex, ipnt);
                    cur.InsertRow(rb);
    
                    varray.Add(gprecset);
    
                    IGPParameter gpp2 = (IGPParameter)parameters.get_Element(1);
                    IGPLinearUnit gpLU = (IGPLinearUnit)serverContext.CreateObject("esriGeoprocessing.GPLinearUnit");
                    gpLU.Units = ESRI.ArcGIS.esriSystem.esriUnits.esriMeters;
                    gpLU.Value = 100000;
    
                    varray.Add(gpLU);
    
                    gp.Execute(tool.Name, varray, null);
    
                    processGPMessages(gp);
    
    
                }
                catch (Exception ex)
                {
                    processGPMessages(gp);
                    System.Diagnostics.Debug.WriteLine(ex.Message);
                    System.Diagnostics.Debug.WriteLine(ex.StackTrace);
                }
            }
    
            public static void RunGeoprocessorExampleAddServerToolbox()
            {
    
                IServerContext serverContext = null;
                ESRI.ArcGIS.Geoprocessor.Geoprocessor gp = null;
                try
                {
                    GISServerConnection serverConnection;
                    serverConnection = new GISServerConnection();
                    serverConnection.Connect(servername);
                    IServerObjectManager serverManager = serverConnection.ServerObjectManager;
    
                    serverContext = serverManager.CreateServerContext("BufferTools", "GPServer");
    
                    //* GEOPROCESSOR SECTION
                    gp = new ESRI.ArcGIS.Geoprocessor.Geoprocessor(serverContext);
                    gp.AddToolbox(@"C:\Program Files\ArcGIS\DeveloperKit10.0\Samples\data\GP\RunBuffer\BufferTools.tbx");
                    gp.SetEnvironmentValue("scratchWorkspace", @"c:/temp");
                    gp.OverwriteOutput = true;
    
                    // Need reference to GPTool to get parameter type information
                    IWorkspaceFactory iwf = (IWorkspaceFactory)serverContext.CreateObject("esriGeoprocessing.ToolboxWorkspaceFactory");
                    IToolboxWorkspace itw = (IToolboxWorkspace)iwf.OpenFromFile(@"C:\Program Files\ArcGIS\DeveloperKit10.0\Samples\data\GP\RunBuffer\RunBuffer", 0);
                    IGPToolbox tbox = (IGPToolbox)itw.OpenToolbox("BufferTools");
                    IGPTool tool = (IGPTool)tbox.OpenTool("BufferPoints");
    
                    IVariantArray varray = (IVariantArray)serverContext.CreateObject("esriSystem.VarArray");
    
                    IArray parameters = tool.ParameterInfo;
                    // Iterate through parameters to get data types
    
                    for (int j = 0; j < parameters.Count; j++)
                    {
                        IGPParameter gparam = (IGPParameter)parameters.get_Element(j);
    
                        System.Console.WriteLine("Parameter name: " + gparam.Name);
                        System.Console.WriteLine("Parameter Data Type Display Name: " + gparam.DataType.DisplayName);
                        System.Console.WriteLine("Parameter Data Type Name: " + gparam.DataType.Name);
                        System.Console.WriteLine("Is Parameter required?: " + gparam.ParameterType.ToString());
    
                        System.Console.WriteLine("Parameter Value Data Type: " + gparam.Value.DataType.Name);
                        System.Console.WriteLine("Parameter Value as Text: " + gparam.Value.GetAsText());
    
                    }
    
                    IGPParameter gpp1 = (IGPParameter)parameters.get_Element(0);
                    IGPRecordSet gprecset = (IGPRecordSet)gpp1.Value;
    
                    IRecordSet rs = gprecset.RecordSet;
    
                    IFields flds = rs.Fields;
                    int shpfldindex = flds.FindField("Shape");
    
                    IField fld = flds.get_Field(shpfldindex);
                    ISpatialReference inputsr = fld.GeometryDef.SpatialReference;
    
                    IRecordSetInit rsi = (IRecordSetInit)rs;
                    ICursor cur = rsi.Insert();
                    IRowBuffer rb = rsi.CreateRowBuffer();
                    IPoint ipnt = (IPoint)serverContext.CreateObject("esriGeometry.Point");
                    ipnt.PutCoords(1000000, 1000000);
                    rb.set_Value(shpfldindex, ipnt);
                    cur.InsertRow(rb);
    
                    varray.Add(gprecset);
    
                    IGPParameter gpp2 = (IGPParameter)parameters.get_Element(1);
                    IGPLinearUnit gpLU = (IGPLinearUnit)serverContext.CreateObject("esriGeoprocessing.GPLinearUnit");
                    gpLU.Units = ESRI.ArcGIS.esriSystem.esriUnits.esriMeters;
                    gpLU.Value = 100000;
    
                    varray.Add(gpLU);
    
                    gp.Execute(tool.Name, varray, null);
    
                    processGPMessages(gp);
    
    
                }
                catch (Exception ex)
                {
                    processGPMessages(gp);
                    System.Diagnostics.Debug.WriteLine(ex.Message);
                    System.Diagnostics.Debug.WriteLine(ex.StackTrace);
                }
                finally
                {
                    serverContext.ReleaseContext();
                }
            }
    
    
            public static void RunGPServerExample()
            {
    
                IServerContext serverContext = null;
                try
                {
                    GISServerConnection serverConnection;
                    serverConnection = new GISServerConnection();
                    serverConnection.Connect(servername);
                    IServerObjectManager serverManager = serverConnection.ServerObjectManager;
    
                    serverContext = serverManager.CreateServerContext("BufferTools", "GPServer");
    
                    IGPServer gpserver = (IGPServer)serverContext.ServerObject;
                    string taskname = "BufferPoints";
                    IGPToolInfo task = gpserver.GetToolInfo(taskname);
                    IGPValues taskvals = (IGPValues)serverContext.CreateObject("esriGeoprocessing.GPValues");
                    IGPParameterInfos paramInfos = task.ParameterInfo;
                    IGPParameterInfo paramInfo;
    
                    string parameterNameString = string.Empty;
    
                    for (int i = 0; i < paramInfos.Count; i++)
                    {
                        // Data type available as part of IGPParameterInfo
                        paramInfo = paramInfos.get_Element(i);
                        taskvals.Add(paramInfo.Value);
    
                        //Add to parameter name array
                        parameterNameString += paramInfo.Name;
                        if (i != paramInfos.Count - 1)
                            parameterNameString += ";";
                    }
    
                    IGPRecordSet gprecset = (IGPRecordSet)taskvals.get_Element(0);
                    IQueryFilter qf = (IQueryFilter)serverContext.CreateObject("esriGeodatabase.QueryFilter");
                    gprecset.RecordSet.Table.DeleteSearchedRows(qf);
    
                    IRecordSet rs = gprecset.RecordSet;
    
                    IFields flds = rs.Fields;
                    int shpfldindex = flds.FindField("Shape");
    
                    IField fld = flds.get_Field(shpfldindex);
                    ISpatialReference inputsr = fld.GeometryDef.SpatialReference;
    
                    IRecordSetInit rsi = (IRecordSetInit)rs;
                    ICursor cur = rsi.Insert();
                    IRowBuffer rb = rsi.CreateRowBuffer();
                    IPoint ipnt = (IPoint)serverContext.CreateObject("esriGeometry.Point");
                    ipnt.PutCoords(1000000, 1000000);
                    rb.set_Value(shpfldindex, ipnt);
                    cur.InsertRow(rb);
    
                    IGPValues invals = (IGPValues)serverContext.CreateObject("esriGeoprocessing.GPValues");
                    invals.Add((IGPValue)gprecset);
    
                    IGPLinearUnit gpLU = (IGPLinearUnit)serverContext.CreateObject("esriGeoprocessing.GPLinearUnit");
                    gpLU.Units = ESRI.ArcGIS.esriSystem.esriUnits.esriMeters;
                    gpLU.Value = 1000000;
    
                    invals.Add((IGPValue)gpLU);
    
                    string JobID = gpserver.SubmitJob(taskname, invals);
    
                    while (gpserver.GetJobStatus(JobID) != esriJobStatus.esriJobSucceeded)
                    {
                        System.Threading.Thread.Sleep(5000);
                    }
    
                    IStringArray stringArray = (IStringArray)new ESRI.ArcGIS.esriSystem.StrArrayClass();
                    foreach (string paramName in parameterNameString.Split(';'))
                    {
                        stringArray.Add(paramName);
                    }
    
                    /* GetJobResult(): second parameter can be: 
                     * IStringArray of all parameters
                     * IStringArray of only output parameters
                     * null if you want all output parameters
                     */
    
                    //The resultant featureclass gets generated in folder uner <C:\arcgisserver\arcgisJobs\<abd9930839dg9330123
                    IGPResult result = gpserver.GetJobResult(JobID, stringArray, null);
                    if (result.Messages != null)
                    {
                        IJobMessages jobMsgs = result.Messages;
                        for (int i = 0; i < jobMsgs.Count; i++)
                        {
                            Console.WriteLine(jobMsgs.get_Element(i).Description);
                        }
                    }
    
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex.Message);
                    System.Diagnostics.Debug.WriteLine(ex.StackTrace);
                }
                finally
                {
                    serverContext.ReleaseContext();
                }
            }
        }
    }
    
  • 相关阅读:
    关于近期
    Tips on Importons and Irradiance Particles in mental ray
    给她的歌
    Fatal In Code Generation Of Visual C++
    kdtree vs octree
    疯子的胜利——记6.18毕业晚会
    转凉
    事件与委托的匿名方法使用方法示例
    VS2008使用技巧
    硬链接和软连接的区别
  • 原文地址:https://www.cnblogs.com/gisoracle/p/2097351.html
Copyright © 2011-2022 走看看