目标:
对点要素进行缓冲区分析
准备工作:
1.了解ArcGIS Server中的ValueObject和ComOjbect。
2.AO接口中缓冲区分析的编程方法。
3.重新回顾第一篇中ArcGIS Server开发的四种方法。
4.利用vs2005创建一个模板server应用--Web Mapping Application,并更改MapResourceManager属性。
![](/Article/UploadFiles/200901/20090113102938828.gif)
注意这里使用的map resource类型是ArcGIS Server Internet,在界面上增加一个新的panel,里面包括两个textbox和一个comand,textbox对应的分别是缓冲区中心点的x、y坐标,以该点为中心,一定半径做圆形缓冲区。
![](/Article/UploadFiles/200901/20090113102938641.gif)
思路:
缓冲区分析需要在AO接口中实现,输入的点应该是一个COM对象,而在页面中输入xy坐标点是一个SOAP API valueojbect,valueobject可以用于adf web controls,但不能用于AO接口,因此需要进行valueobject到comojbect的转换,在调用ITopologicalOperator接口的Buffer方法后会得到缓冲区分析的结果,即一个polygon,同理,该polygon是一个comobject,需要逆转换为valueobject才能显示到网页上。
代码实现:
新建一个类XYBuffer,缓冲功能的在其buffer方法中实现。首先设置textbox中输入点的渲染方式,该作为一个ESRI.ArcGIS.ADF.ArcGISServer.PointN对象,渲染方法如下:
![](/Article/UploadFiles/200901/20090113102938499.gif)
new ESRI.ArcGIS.ADF.ArcGISServer.PointN();
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
new ESRI.ArcGIS.ADF.ArcGISServer.RgbColor();
![](/Article/UploadFiles/200901/20090113102938499.gif)
0;
![](/Article/UploadFiles/200901/20090113102938499.gif)
0;
![](/Article/UploadFiles/200901/20090113102938499.gif)
20;
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
new ESRI.ArcGIS.ADF.ArcGISServer.SimpleMarkerSymbol();
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
20;
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
new ESRI.ArcGIS.ADF.ArcGISServer.MarkerElement();
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
然后用arcgis server local方式建立到datasource的连接,这点非常重要,主要是为了在这种连接状态下进行valueobject和comobject之间的转换。建立连接的用户应属于ArcGIS Server管理组。
![](/Article/UploadFiles/200901/20090113102938499.gif)
new ESRI.ArcGIS.ADF.Identity("user", "password", "localhost");
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
new ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection("localhost", identity);
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
这样我们就可以在arcgis server local连接方式下进行对象转换:
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
下面是AO中缓冲区分析的代码,熟悉AO编程的对下面代码应该很了解了:
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
6;
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
bufferPolygon就是缓冲区分析的结果,但它还不是我们最后想要的,因为ESRI.ArcGIS.Geometry.IPolygon无法在adf web control中显示,还需要做一次转换:
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
buffer_polyn就是我们最后想要的结果,定义一种渲染方式:
![](/Article/UploadFiles/200901/20090113102938499.gif)
new ESRI.ArcGIS.ADF.ArcGISServer.RgbColor();
![](/Article/UploadFiles/200901/20090113102938499.gif)
200;
![](/Article/UploadFiles/200901/20090113102938499.gif)
200;
![](/Article/UploadFiles/200901/20090113102938499.gif)
20;
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
new ESRI.ArcGIS.ADF.ArcGISServer.SimpleFillSymbol();
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
new ESRI.ArcGIS.ADF.ArcGISServer.PolygonElement();
![](/Article/UploadFiles/200901/20090113102938499.gif)
![](/Article/UploadFiles/200901/20090113102938499.gif)
最后将marker和polyelement1添加到ESRI.ArcGIS.ADF.ArcGISServer.GraphicElement对象数组中,传给当前MapFunctionality的CustomGraphics属性,刷新map控件,看看显示的效果图,缓冲区显示的样式为一系列水平的平行线:
![](/Article/UploadFiles/200901/20090113102938460.gif)
以上在ArcGIS Server中实现了缓冲区分析功能,虽然arcims也能实现(arcims分析功能也仅限于此),但是两者的本质有天然的差别,前者是基于AO,因此类推可以将AO中的分析功能全部引入server中,实现更多更复杂的分析功能。
最后,我们还有哪些需要考虑的呢?
1.ESRI.ArcGIS.ADF.ArcGISServer命名空间中我们用到了PointN类,但同样可以找到PointB类,对于其他几何类型也是如此,如PolylineN和PolylineB,它们之间有什么差别呢?
2.整个开发过程我们用到了Data Source Specific API,重新回想一下第一篇中提到的途径三和途径四两种开发方式。
3.例子中我们仅仅是将缓冲区显示出来,如果需要用缓冲区做进一步的分析,如一条街道向两侧拓展3米,有哪些房屋或建筑需要拆除或改建呢?这时需要做进一步的相交分析,同样可以调用AO接口实现,最后将结果转换为valueobject显示出来,这样可以在server中实现决策分析的功能模块。当然我们可以通过这个例子做更多更深入的延伸。
4.如何将显示的结果清除掉?