gisempire100
捉鬼专家
捉鬼专家
  • 注册日期2004-08-13
  • 发帖数552
  • QQ
  • 铜币2462枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:2622回复:1

ArcGIS Server 开发系列(四)--ArcGIS Server data sources 开发

楼主#
更多 发布于:2008-03-06 20:25
<P>   ArcGIS Server开发系列前几篇文章搭建了一个基本的webgis开发框架,包括模板应用程序搭建、属性查询、查询结果高亮显示,在arcims中,不论是使用9.2之前的javaconnector、.net_link、htmlviewer、还是9.2里的adf,这些功能都可以轻松实现,从软件成本上来看,ArcGIS Server企业版要比ArcIMS高出不少,如何体现ArcGIS Server价值呢?我们就从这一篇开始挖掘ArcGIS Server的价值,从ArcGIS Server data sources启航……<BR><BR>    目标:<BR><BR>    对点要素进行缓冲区分析<BR><BR>    准备工作:<BR><BR>1.了解ArcGIS Server中的ValueObject和ComOjbect。<BR>2.AO接口中缓冲区分析的编程方法。<BR>3.重新回顾第一篇中ArcGIS Server开发的四种方法。<BR>4.利用vs2005创建一个模板server应用--Web Mapping Application,并更改MapResourceManager属性。<BR><IMG src="http://www.cnblogs.com/images/cnblogs_com/flyingis/server601.gif" border=0><BR><BR>    注意这里使用的map resource类型是ArcGIS Server Internet,在界面上增加一个新的panel,里面包括两个textbox和一个comand,textbox对应的分别是缓冲区中心点的x、y坐标,以该点为中心,一定半径做圆形缓冲区。<BR><IMG src="http://www.cnblogs.com/images/cnblogs_com/flyingis/server602.gif" border=0><BR>    <BR>    思路:<BR><BR>    缓冲区分析需要在AO接口中实现,输入的点应该是一个COM对象,而在页面中输入xy坐标点是一个SOAP API valueojbect,valueobject可以用于adf web controls,但不能用于AO接口,因此需要进行valueobject到comojbect的转换,在调用ITopologicalOperator接口的Buffer方法后会得到缓冲区分析的结果,即一个polygon,同理,该polygon是一个comobject,需要逆转换为valueobject才能显示到网页上。<BR><BR>    代码实现:<BR><BR>    新建一个类XYBuffer,缓冲功能的在其buffer方法中实现。首先设置textbox中输入点的渲染方式,该作为一个ESRI.ArcGIS.ADF.ArcGISServer.PointN对象,渲染方法如下:<BR>ESRI.ArcGIS.ADF.ArcGISServer.PointN pt = new ESRI.ArcGIS.ADF.ArcGISServer.PointN();<BR>pt.X = x;<BR>pt.Y = y;</P>
<P>// 设置点的颜色<BR>ESRI.ArcGIS.ADF.ArcGISServer.RgbColor rgb = new ESRI.ArcGIS.ADF.ArcGISServer.RgbColor();<BR>rgb.Red = 0;<BR>rgb.Blue = 0;<BR>rgb.Green = 20;</P>
<P>// 设置点的符号<BR>ESRI.ArcGIS.ADF.ArcGISServer.SimpleMarkerSymbol sms = new ESRI.ArcGIS.ADF.ArcGISServer.SimpleMarkerSymbol();<BR>sms.Style = ESRI.ArcGIS.ADF.ArcGISServer.esriSimpleMarkerStyle.esriSMSCircle;<BR>sms.Color = rgb;<BR>sms.Size = 20;</P>
<P>ESRI.ArcGIS.ADF.ArcGISServer.MarkerElement marker = new ESRI.ArcGIS.ADF.ArcGISServer.MarkerElement();<BR>marker.Symbol = sms;<BR>marker.Point = pt;<BR>    然后用arcgis server local方式建立到datasource的连接,这点非常重要,主要是为了在这种连接状态下进行valueobject和comobject之间的转换。建立连接的用户应属于ArcGIS Server管理组。<BR>ESRI.ArcGIS.ADF.Identity identity = new ESRI.ArcGIS.ADF.Identity("user", "password", "localhost");<BR>ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection agsconnection;<BR>agsconnection = new ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection("localhost", identity);<BR>agsconnection.Connect();<BR>ESRI.ArcGIS.Server.IServerObjectManager som = agsconnection.ServerObjectManager;<BR>ESRI.ArcGIS.Server.IServerContext serverContext = som.CreateServerContext("Redlands", "MapServer");<BR>    这样我们就可以在arcgis server local连接方式下进行对象转换:<BR>// 定义COM对象的点<BR>ESRI.ArcGIS.Geometry.IPoint ipnt;<BR>// 进行valueobject到comobject之间的转换<BR>ipnt = (ESRI.ArcGIS.Geometry.IPoint)ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.Converter.ValueObjectToComObject(pt, serverContext);<BR>    下面是AO中缓冲区分析的代码,熟悉AO编程的对下面代码应该很了解了:<BR>ESRI.ArcGIS.Geometry.ITopologicalOperator topop = (ESRI.ArcGIS.Geometry.ITopologicalOperator)ipnt;<BR>double bufferDistance = map.Extent.Width / 6;<BR>ESRI.ArcGIS.Geometry.IPolygon bufferPolygon;<BR>bufferPolygon = (ESRI.ArcGIS.Geometry.IPolygon)topop.Buffer(bufferDistance);<BR>    bufferPolygon就是缓冲区分析的结果,但它还不是我们最后想要的,因为ESRI.ArcGIS.Geometry.IPolygon无法在adf web control中显示,还需要做一次转换:<BR>// 定义valueobject的点<BR>ESRI.ArcGIS.ADF.ArcGISServer.PolygonN buffer_polyn;<BR>// 进行comobject到valueobject之间的转换<BR>buffer_polyn = (ESRI.ArcGIS.ADF.ArcGISServer.PolygonN)ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.Converter.ComObjectToValueObject(bufferPolygon, serverContext, typeof(ESRI.ArcGIS.ADF.ArcGISServer.PolygonN));<BR>    buffer_polyn就是我们最后想要的结果,定义一种渲染方式:<BR>ESRI.ArcGIS.ADF.ArcGISServer.RgbColor rgb1 = new ESRI.ArcGIS.ADF.ArcGISServer.RgbColor();<BR>rgb1.Red = 200;<BR>rgb1.Green = 200;<BR>rgb1.Blue = 20;<BR>// 设置区的填充色<BR>ESRI.ArcGIS.ADF.ArcGISServer.SimpleFillSymbol sfs1 = new ESRI.ArcGIS.ADF.ArcGISServer.SimpleFillSymbol();<BR>sfs1.Style = ESRI.ArcGIS.ADF.ArcGISServer.esriSimpleFillStyle.esriSFSHorizontal;<BR>sfs1.Color = rgb1;</P>
<P>ESRI.ArcGIS.ADF.ArcGISServer.PolygonElement polyelement1 = new ESRI.ArcGIS.ADF.ArcGISServer.PolygonElement();<BR>polyelement1.Symbol = sfs1;<BR>polyelement1.Polygon = buffer_polyn;</P>
<P><FONT face=Verdana size=2> 最后将marker和polyelement1添加到ESRI.ArcGIS.ADF.ArcGISServer.GraphicElement对象数组中,传给当前MapFunctionality的CustomGraphics属性,刷新map控件,看看显示的效果图,缓冲区显示的样式为一系列水平的平行线:</FONT></P>
<P><FONT face=Verdana size=2>ESRI.ArcGIS.ADF.ArcGISServer.GraphicElement[] ges = new ESRI.ArcGIS.ADF.ArcGISServer.GraphicElement[2]; <BR>ges[0] = marker; <BR>ges[1] = polyelement1; <BR><BR>ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapFunctionality mf = (ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapFunctionality)map.GetFunctionality(0); <BR>ESRI.ArcGIS.ADF.ArcGISServer.MapDescription mapDescription = mf.MapDescription; <BR>mapDescription.CustomGraphics = ges; </FONT></P>
<P><FONT face=Verdana size=2><BR><IMG src="http://www.cnblogs.com/images/cnblogs_com/flyingis/server603.gif" border=0><BR><BR>    以上在ArcGIS Server中实现了缓冲区分析功能,虽然arcims也能实现(arcims分析功能也仅限于此),但是两者的本质有天然的差别,前者是基于AO,因此类推可以将AO中的分析功能全部引入server中,实现更多更复杂的分析功能。<BR><BR>    最后,我们还有哪些需要考虑的呢?<BR><BR>1.ESRI.ArcGIS.ADF.ArcGISServer命名空间中我们用到了PointN类,但同样可以找到PointB类,对于其他几何类型也是如此,如PolylineN和PolylineB,它们之间有什么差别呢?<BR><BR>2.整个开发过程我们用到了Data Source Specific API,重新回想一下第一篇中提到的途径三和途径四两种开发方式。<BR><BR>3.例子中我们仅仅是将缓冲区显示出来,如果需要用缓冲区做进一步的分析,如一条街道向两侧拓展3米,有哪些房屋或建筑需要拆除或改建呢?这时需要做进一步的相交分析,同样可以调用AO接口实现,最后将结果转换为valueobject显示出来,这样可以在server中实现决策分析的功能模块。当然我们可以通过这个例子做更多更深入的延伸。<BR><BR>4.如何将显示的结果清除掉?</FONT><BR></P>
喜欢0 评分0
A friend is never known till a man has need. ...CL
zgsdjn888
路人甲
路人甲
  • 注册日期2008-03-27
  • 发帖数2
  • QQ
  • 铜币112枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2008-04-29 18:04
好咚咚,学习一下
举报 回复(0) 喜欢(0)     评分
游客

返回顶部