前段时间到北京去参加了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>");
预览效果如下:
至此,如果上面一切顺利的话,整个功能就完成了,单击确定 ,就可以弹出四川省的面积。
注意事项:
如果Server Object Extension注册到Arcgis Server以后,又启动了province服务,这个时候要重新生成DAANSOE的话,需要把province停掉,不然会抱错,然后重新使用regasm工具注册修改后的dll。
最后,我把以上几个例子的整个项目作为附件上传上来,这些例子都是我在本机调试通过的,大家下载以后需要对identity的参数作相应的修改,大家有什么问题可以在这里提出来!