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


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

    2009-10-19 21:07:48|  分类: Flex,arcgis |  标签: |字号 订阅

    前段时间到北京去参加了esri的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,代码如下:

    C#代码 复制代码
    1. <SPAN style="COLOR: #000000">using System;   
    2. using System.Collections.Generic;   
    3. using System.Text;   
    4. using System.EnterpriseServices;   
    5. using ESRI.ArcGIS.ADF.ArcGISServer;   
    6. using ESRI.ArcGIS.Server;   
    7. using System.Runtime.InteropServices;   
    8. using ESRI.ArcGIS.Carto;   
    9. using ESRI.ArcGIS.Geodatabase;   
    10. using ESRI.ArcGIS.Geometry;   
    11.   
    12.   
    13. namespace DAANSOE   
    14. {   
    15.     [Guid("560680E2-1DFB-438c-BA66-27A144BECE55")]   
    16.     public interface IActcArea   
    17.     {   
    18.         double GetArea(string sql);   
    19.     }   
    20.   
    21.     [AutomationProxy(true), ClassInterface(ClassInterfaceType.AutoDual), Guid("68F301BC-7A2F-44ea-A8B1-042431321719")]   
    22.     public class SOEServer : ServicedComponent, IActcArea, IServerObjectExtension   
    23.     {   
    24.   
    25.         private IServerObjectHelper m_SOH;  
    26.  
    27.  
    28.         #region IActcArea 成员   
    29.   
    30.         /*次方法为测试时候的方法  
    31.         public double GetArea(double x, double y)  
    32.         {  
    33.             return x + y;  
    34.         }  
    35.         */  
    36.   
    37.         public double GetArea(string sql)   
    38.         {   
    39.             IMapServer mapServer = m_SOH.ServerObject as IMapServer;   
    40.             IMapServerObjects mapServerObjs = mapServer as IMapServerObjects;   
    41.             IMap map = mapServerObjs.get_Map(mapServer.DefaultMapName);   
    42.             IFeatureLayer pflayer = map.get_Layer(0) as IFeatureLayer;   
    43.             IFeatureClass pfc = pflayer.FeatureClass;   
    44.   
    45.             ISpatialFilter psf = new SpatialFilterClass();   
    46.             psf.WhereClause = sql;   
    47.             psf.SpatialRel = ESRI.ArcGIS.Geodatabase.esriSpatialRelEnum.esriSpatialRelIntersects;   
    48.   
    49.             IFeatureCursor pfCursor = pfc.Search(psf as IQueryFilter, false);   
    50.             IFeature pfeature = pfCursor.NextFeature();   
    51.   
    52.             if (pfeature == null)   
    53.                 return -2;   
    54.             IPolygon polygon = pfeature.Shape as IPolygon;   
    55.   
    56.             IArea pArea = polygon as IArea;   
    57.   
    58.             return pArea.Area;   
    59.         }  
    60.  
    61.         #endregion  
    62.  
    63.         #region IServerObjectExtension 成员   
    64.   
    65.         void IServerObjectExtension.Init(IServerObjectHelper pSOH)   
    66.         {   
    67.             m_SOH = pSOH;   
    68.         }   
    69.   
    70.         void IServerObjectExtension.Shutdown()   
    71.         {   
    72.             m_SOH = null;   
    73.         }  
    74.  
    75.         #endregion   
    76.     }   
    77.   
    78. }   
    79. </SPAN>  
    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方法里添加如下代码:

    C#代码 复制代码
    1. <SPAN style="COLOR: #000000">Identity identity = new Identity("username""888888""domain");   
    2.             AGSServerConnection connection = new AGSServerConnection("fmc-pca187", identity);   
    3.             connection.Connect();   
    4.   
    5.             IServerObjectAdmin2 soa = connection.ServerObjectAdmin as IServerObjectAdmin2;   
    6.             IServerObjectExtensionType soe = soa.CreateExtensionType();   
    7.             soe.CLSID = "DAANSOE.SOEServer";   
    8.             soe.Name = "SOEServer";   
    9.             soe.Description = "Test Application";   
    10.             soa.AddExtensionType("MapServer", soe);</SPAN>  
    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事件里实现如下代码:

    C#代码 复制代码
    1. <SPAN style="COLOR: #000000">Identity identity = new Identity("username""888888""domain");   
    2.         AGSServerConnection connection = new AGSServerConnection("fmc-pca187", identity);   
    3.         connection.Connect();   
    4.   
    5.         IServerObjectManager som = connection.ServerObjectManager as IServerObjectManager;   
    6.         IServerContext serverContext = som.CreateServerContext("province""MapServer");   
    7.         IServerObjectExtensionManager soem = serverContext.ServerObject as IServerObjectExtensionManager;   
    8.         IServerObjectExtension soe = soem.FindExtensionByTypeName("SOEServer");   
    9.   
    10.         IActcArea pAear = soe as IActcArea;   
    11.         double area = pAear.GetArea(TextBox1.Text.ToString());   
    12.   
    13.         serverContext.ReleaseContext();   
    14.         Response.Write("<script>alert(" + area.ToString() + ");</script>");</SPAN>  
    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>");

     预览效果如下:

     

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

    注意事项:

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

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

    来自:http://feng10251225.blog.163.com/blog/static/63122798200991997484/

  • 相关阅读:
    linux下so动态库一些不为人知的秘密(中二)
    linux下so动态库一些不为人知的秘密(中)
    linux下so动态库一些不为人知的秘密(上)
    Linux下gcc编译控制动态库导出函数小结
    解决Linux动态库版本兼容问题
    MySQL按天,按周,按月,按时间段统计【转载】
    MySQL统计函数记录——按月、按季度、按日、时间段统计以及MySQL日期时间函数大全
    RequestMapping中produces属性作用
    出现 java.net.ConnectException: Connection refused 异常的原因及解决方法
    Springboot应用中@EntityScan和@EnableJpaRepositories的用法
  • 原文地址:https://www.cnblogs.com/gisoracle/p/2102158.html
Copyright © 2020-2023  润新知