北京ArcGis Server开发培训例子(整理)

前段时间到北京去参加了ArcGis Server应用开发的培训,发现基本上的例子都和Flyingis上面的Arcgsi Server 开发系列的文章一样,只有最后两个例子没有。由于培训方不提供源代码,所有在培训时做的试验例子都无法拷出来。唉,没有办法,只有培训完回来以后,重新整理一下放上来,以备查!

 

整理的例子包括

1、Web ADF 编程——查询功能的实现

2、Graphics data sources——高亮功能的实现

3、ArcGIS Server data sources——Buffer功能的实现

4、自定义Tool

5、自定义Task

6、扩展Arcgis Server

 

由于前面5个例子在Flyingis的博客里都作了详细的介绍,我这里就不作介绍了,这里主要介绍最后一个例子,扩展Arcgis Server。

 

目标:

扩展Arcgis Server,根据省份名称,得到省份面积

当然这里只是一个例子,大家可以做很复杂的扩展

 

试验前准备:

1、准备一个全国各省的地图数据

2、创建一个province的地图文档

3、通过province的地图文档发布一个地图服务

 

试验步骤:

1、编写实现IServerObjectExtension的类,也就是你想添加的功能,新建DAANSOE项目,添加一个class文件,改名为GetArea.cs,代码如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.EnterpriseServices;
using ESRI.ArcGIS.ADF.ArcGISServer;
using ESRI.ArcGIS.Server;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;


namespace DAANSOE
{
    [Guid("560680E2-1DFB-438c-BA66-27A144BECE55")]
    public interface IActcArea
    {
        double GetArea(string sql);
    }

    [AutomationProxy(true), ClassInterface(ClassInterfaceType.AutoDual), Guid("68F301BC-7A2F-44ea-A8B1-042431321719")]
    public class SOEServer : ServicedComponent, IActcArea, IServerObjectExtension
    {

        private IServerObjectHelper m_SOH;


        #region IActcArea 成员

        /*次方法为测试时候的方法
        public double GetArea(double x, double y)
        {
            return x + y;
        }
        */

        public double GetArea(string sql)
        {
            IMapServer mapServer = m_SOH.ServerObject as IMapServer;
            IMapServerObjects mapServerObjs = mapServer as IMapServerObjects;
            IMap map = mapServerObjs.get_Map(mapServer.DefaultMapName);
            IFeatureLayer pflayer = map.get_Layer(0) as IFeatureLayer;
            IFeatureClass pfc = pflayer.FeatureClass;

            ISpatialFilter psf = new SpatialFilterClass();
            psf.WhereClause = sql;
            psf.SpatialRel = ESRI.ArcGIS.Geodatabase.esriSpatialRelEnum.esriSpatialRelIntersects;

            IFeatureCursor pfCursor = pfc.Search(psf as IQueryFilter, false);
            IFeature pfeature = pfCursor.NextFeature();

            if (pfeature == null)
                return -2;
            IPolygon polygon = pfeature.Shape as IPolygon;

            IArea pArea = polygon as IArea;

            return pArea.Area;
        }

        #endregion

        #region IServerObjectExtension 成员

        void IServerObjectExtension.Init(IServerObjectHelper pSOH)
        {
            m_SOH = pSOH;
        }

        void IServerObjectExtension.Shutdown()
        {
            m_SOH = null;
        }

        #endregion
    }

}

 

2、使用Regasm注册Server Object Extension

进入vs2005的命令提示框:

E:\Program Files\Microsoft Visual Studio 8\VC>

 

将当前目录切换到你上面那个dll所在的目录:

E:\project\北京培训\BeiJingTraining\Exercise11\DAANSOE\bin\Debug>

 

执行如下命令进行注册:

regasm /tlb:DAANSOE.tlb /codebase DAANSOE.dll

 

执行完成后可以到dll目录下验证相应的.tlb是否生成

 

(如果要注销注册,使用 regasm /u DAANSOE.dll /tlb DAANSOE.tlb /codebase 命令)

 

3、注册Server Object Extension到Gis Server

我们将通过一段代码将Server Object Extension注册到Gis Server中。

新建一个Console项目,命令为RegisterToGisServer,在Main方法里添加如下代码:

Identity identity = new Identity("username", "888888", "domain");
            AGSServerConnection connection = new AGSServerConnection("fmc-pca187", identity);
            connection.Connect();

            IServerObjectAdmin2 soa = connection.ServerObjectAdmin as IServerObjectAdmin2;
            IServerObjectExtensionType soe = soa.CreateExtensionType();
            soe.CLSID = "DAANSOE.SOEServer";
            soe.Name = "SOEServer";
            soe.Description = "Test Application";
            soa.AddExtensionType("MapServer", soe);

 运行这段代码,执行完后可以到<ArcGIS Server Install Location>\server\system folder 打开ServerTypesExt.dat进行验证

 

4、停止province服务,右键切换到Service Properties的Capabilities,将SOEServer打上钩,重新启动province服务

 

5、使用Server Object Extension

新建一个web应用,新建一个aspx页面,改名为UseExtensionGisServer.aspx,加入相应控件,在button的click事件里实现如下代码:

Identity identity = new Identity("username", "888888", "domain");
        AGSServerConnection connection = new AGSServerConnection("fmc-pca187", identity);
        connection.Connect();

        IServerObjectManager som = connection.ServerObjectManager as IServerObjectManager;
        IServerContext serverContext = som.CreateServerContext("province", "MapServer");
        IServerObjectExtensionManager soem = serverContext.ServerObject as IServerObjectExtensionManager;
        IServerObjectExtension soe = soem.FindExtensionByTypeName("SOEServer");

        IActcArea pAear = soe as IActcArea;
        double area = pAear.GetArea(TextBox1.Text.ToString());

        serverContext.ReleaseContext();
        Response.Write("<script>alert(" + area.ToString() + ");</script>");

 预览效果如下:

 北京ArcGis Server开发培训例子(整理)

至此,如果上面一切顺利的话,整个功能就完成了,单击确定 ,就可以弹出四川省的面积。

 

注意事项:

如果Server Object Extension注册到Arcgis Server以后,又启动了province服务,这个时候要重新生成DAANSOE的话,需要把province停掉,不然会抱错,然后重新使用regasm工具注册修改后的dll。

 

最后,我把以上几个例子的整个项目作为附件上传上来,这些例子都是我在本机调试通过的,大家下载以后需要对identity的参数作相应的修改,大家有什么问题可以在这里提出来!

 

 

你可能感兴趣的:(sql,sql,编程,server,vc++,SOA)