ArcGIS API for Silverlight开发入门(9)外传:在程序中调用AO
2010-02-24 10:53
621 查看
SilverlightAPI的开发入门系列的文章上回已经结束,但其实能讲的东西还有很多,实在不能面面俱到。这次再补充一个比较重要的功能,就是在SilverlightAPI程序中调用ArcObjects,来完成一些复杂的geoprocess功能。 ADF之所以强大,除了其本身的类库外,它还能在服务器端调用AO,来完成比如在线编辑或者Geoemtry的处理工作;而ESRI官方的说法,建立在REST服务基础上的程序目前都不具备在线编辑的功能(因为要与服务器端的数据库打交道),但他们把这项功能作为日程,提到了研发计划内。目前而言,要在SilverlightAPI中完成数据编辑工作,他们的劝告是,“如果你不怕把你的双手弄脏,那就去做吧”。 言归。AO本身是COM组件,.NET是利用COMInterop技术与其打交道的,这显然是Silverlight的客户端环境办不到的。这就需要与服务器端进行通信。Silverlight与服务器端通信,最常用的是WebClient类,稍复杂的还有HttpWebRequest类,而传统的ASP.NET WebService与更强大的WCF则为远程调用AO提供了可能。下面还是来看一个实例,功能是在程序中向数据库中添加一个点,以WebService为例(关于如何使用Web Service可以查资料,这里不做讲解)。 在Silverlight所在的ASP.NET工程中新建一个ASP.NET Web Service,添加一个WebMethod,如下:
public class WS_AOAddPoint : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return “Hello World”;
}
[WebMethod]
public bool AddPointToFileGDB(double x, double y)
{
IAoInitialize aoInit = new AoInitializeClass();
aoInit.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);
IWorkspaceFactory pWSF = new ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactoryClass() as IWorkspaceFactory;
ESRI.ArcGIS.esriSystem.IPropertySet pPropertySet = new ESRI.ArcGIS.esriSystem.PropertySetClass();
pPropertySet.SetProperty(”DATABASE”, @”E:/arcgisserver/ags/edit_simpleaddpoint/china_airlines.gdb”);
IFeatureWorkspace pFW = pWSF.Open(pPropertySet, 0) as IFeatureWorkspace;
IPoint pPoint = new PointClass();
pPoint.X = x;
pPoint.Y = y;
IFeatureClass pFC = pFW.OpenFeatureClass(”省会城市”);
IFeature pF = pFC.CreateFeature();
pF.Shape = pPoint;
pF.Store();
return true;
}
}
该方法传入两个double参数,作为新建点的坐标,这两个参数可在客户端的Draw_Complete事件中获取。为该工程设置一个固定的端口,然后在Silverlight程序中添加对该Web Service的引用。之后在Page.xaml.cs中,添加如下代码:
private void Draw1_DrawComplete(object sender,DrawEventArgs args)
{
GraphicsLayer glayer = Map1.Layers["glayer"] as GraphicsLayer;
Graphic g = new Graphic()
{
Symbol = markerSymbol,
Geometry = args.Geometry
};
glayer.Graphics.Add(g);
WS.WS_AOAddPointSoapClient client = new WS.WS_AOAddPointSoapClient();
client.AddPointToFileGDBCompleted+=new EventHandler(client_AddPointToFileGDBCompleted);
client.AddPointToFileGDBAsync((args.Geometry as ESRI.ArcGIS.Geometry.MapPoint).X, (args.Geometry as ESRI.ArcGIS.Geometry.MapPoint).Y);
}
private void client_AddPointToFileGDBCompleted(object sender, WS.AddPointToFileGDBCompletedEventArgs args)
{
MessageBox.Show(args.Result.ToString());
}
需要补充一下,在Web Service的方法中,如果不添加AO初始化的语句,会报The remote serverreturned an error: NotFound的错误;而调试该Web Service的方法,返回http 500错误;在ie,将高级里面的“显示友好错误提示”勾掉,返回真正的错误是System.Runtime.InteropServices.COMException: Exception from HRESULT:0×80040228,由此断定需要对AO license进行初始化工作。
可以看出,这里对AO的调用甚至比ADF里都要简单,创建对象直接用new关键字即可。此例中仅仅添加了一个点,但线和面的编辑工作也可以通过点来完成;一些简单的Geoprocessing工作也可以通过代码而不是GP Service来完成了。
svc与asmx的调用大同小异。至此,Silverlight API的程序又多了一个强大的靠山。
public class WS_AOAddPoint : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return “Hello World”;
}
[WebMethod]
public bool AddPointToFileGDB(double x, double y)
{
IAoInitialize aoInit = new AoInitializeClass();
aoInit.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngine);
IWorkspaceFactory pWSF = new ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactoryClass() as IWorkspaceFactory;
ESRI.ArcGIS.esriSystem.IPropertySet pPropertySet = new ESRI.ArcGIS.esriSystem.PropertySetClass();
pPropertySet.SetProperty(”DATABASE”, @”E:/arcgisserver/ags/edit_simpleaddpoint/china_airlines.gdb”);
IFeatureWorkspace pFW = pWSF.Open(pPropertySet, 0) as IFeatureWorkspace;
IPoint pPoint = new PointClass();
pPoint.X = x;
pPoint.Y = y;
IFeatureClass pFC = pFW.OpenFeatureClass(”省会城市”);
IFeature pF = pFC.CreateFeature();
pF.Shape = pPoint;
pF.Store();
return true;
}
}
该方法传入两个double参数,作为新建点的坐标,这两个参数可在客户端的Draw_Complete事件中获取。为该工程设置一个固定的端口,然后在Silverlight程序中添加对该Web Service的引用。之后在Page.xaml.cs中,添加如下代码:
private void Draw1_DrawComplete(object sender,DrawEventArgs args)
{
GraphicsLayer glayer = Map1.Layers["glayer"] as GraphicsLayer;
Graphic g = new Graphic()
{
Symbol = markerSymbol,
Geometry = args.Geometry
};
glayer.Graphics.Add(g);
WS.WS_AOAddPointSoapClient client = new WS.WS_AOAddPointSoapClient();
client.AddPointToFileGDBCompleted+=new EventHandler(client_AddPointToFileGDBCompleted);
client.AddPointToFileGDBAsync((args.Geometry as ESRI.ArcGIS.Geometry.MapPoint).X, (args.Geometry as ESRI.ArcGIS.Geometry.MapPoint).Y);
}
private void client_AddPointToFileGDBCompleted(object sender, WS.AddPointToFileGDBCompletedEventArgs args)
{
MessageBox.Show(args.Result.ToString());
}
需要补充一下,在Web Service的方法中,如果不添加AO初始化的语句,会报The remote serverreturned an error: NotFound的错误;而调试该Web Service的方法,返回http 500错误;在ie,将高级里面的“显示友好错误提示”勾掉,返回真正的错误是System.Runtime.InteropServices.COMException: Exception from HRESULT:0×80040228,由此断定需要对AO license进行初始化工作。
可以看出,这里对AO的调用甚至比ADF里都要简单,创建对象直接用new关键字即可。此例中仅仅添加了一个点,但线和面的编辑工作也可以通过点来完成;一些简单的Geoprocessing工作也可以通过代码而不是GP Service来完成了。
svc与asmx的调用大同小异。至此,Silverlight API的程序又多了一个强大的靠山。
相关文章推荐
- ArcGIS API for Silverlight开发入门(8):在程序中使用Virtual Earth的服务
- ArcGIS API for Silverlight开发入门(8):在程序中使用Virtual Earth
- ArcGIS API for Silverlight开发入门(8):在程序中使用Virtual Earth的服务
- ArcGIS API for Silverlight开发入门(8):在程序中使用Virtual Earth的服务
- ArcGIS API for Silverlight开发入门(8):在程序中使用Virtual Earth的服务
- ArcGIS API for Silverlight开发入门(8):在程序中使用Virtual Earth的服务<转>
- ArcGIS API for Silverlight开发入门(1):Getting Started
- ArcGIS API for Silverlight开发入门(3):Widgets
- [专家讲座] ArcGIS API for Silverlight开发入门(4):用户与地理信息之间的桥梁--GraphicsLayer(转)
- ArcGIS API for Silverlight开发入门(1):Getting Started
- ArcGIS API for Silverlight开发入门(0):为什么要用Silverlight API?
- ArcGIS API for Silverlight开发入门(7):使用非AGS数据源的图层
- ArcGIS API for Silverlight开发入门(0):为什么要用Silverlight API?
- [专家讲座] ArcGIS API for Silverlight开发入门(4):用户与地理信息之间的桥梁--GraphicsLayer(转)
- ArcGIS API for Silverlight开发入门(4):用户与地理信息之间的桥梁--GraphicsLayer
- ArcGIS API for Silverlight开发入门(4):用户与地理信息之间的桥梁--GraphicsLayer
- [专家讲座] ArcGIS API for Silverlight开发入门(5):任务外包——Tasks(转)
- ArcGIS API for Silverlight开发入门(2):一个基础地图实例
- ArcGIS API for Silverlight/开发入门 环境搭建
- ArcGIS For Silverlight API 开发中利用WebService调用ArcObjects