《第8课矩形和多边形查询.ppt》由会员分享,可在线阅读,更多相关《第8课矩形和多边形查询.ppt(49页珍藏版)》请在课桌文档上搜索。
1、矩形和多边形查询,主要内容,自定义矩形查询自定义多边形查询弥补自定义点查询编程实现,自定义矩形,用户自行指定的矩形区域,和自定义点有何不同?,点所在的区域和矩形有所重叠的区域,是哪一个矩形?,是哪一个矩形?,从屏幕上的矩形到地图层面的矩形思路:(1)得到屏幕上的矩形;(2)得到对角线上的顶点;(3)把屏幕上的顶点转换成地图上的顶点;(4)由地图上顶点构成地图上的矩形。,得到屏幕上的矩形,把屏幕上的矩形转换成地图上的矩形,Point 点对象,由(x,y)确定位置矩形对象的创建包络对象的创建Envelope env1=new Envelope();Envelope env1=new Envelop
2、e(左上角,右下角);,空间查询,和矩形有所重叠的区域,空间查询,使用查询功能对象,以及空间过滤对象查询功能对象IQueryFuncitionality func=资源对象.CreateFunctionality();,如何查询使用空间过滤对象,空间过滤对象SpatialFilter对象,在ESRI.ArcGIS.ADF.Web命名空间中SpatialFilter 对象名=new SpatialFilter();设置其属性对象名.Geometry=地图上指定的图形对象名.MaxRecords=结果集中能容纳的数量,主要编程步骤,地图控件地图资源对象功能对象(查询)查询功能经过空间过滤对象空间要
3、素集转换成htm标记并在地图上高亮度显示。,编程结构,一个对事件的响应类IdentifyRectangle一个辅助类IdentifyHelper,用于作为类库,具体实现,得到地图服务项目的功能得到查询功能,具体实现,创建空间过滤对象,并设置其,具体实现,得到图层对象在各个图层中进行空间查询,结果放在一个dataTable对象中,具体实现,把表转换成html标记,并在地图上显示出,主要步骤,1增加ToolBar上面的按钮,设置其属性2增加必要的类IdenfifyRectangle,实现IMapServerToolAction.ServerAction方法。用于把矩形对角的两个点坐标从屏幕转换到地
4、图坐标。再利用Envelope类的构造函数构造一个地图坐标的矩形对象。3在IdentifyHelper中增加相应的方法Identify,用来实现矩形的查询。31 获取控件对象32 得到目标对象的空间矩形,主要步骤,4在IdentifyHelper中增加相应的方法41 判别资源是否可用,是否具有查询功能42 若资源具有查询功能,则得到其查询功能。43 依据原有的矩形,构造一个空间查询矩形对象。44 取出可查询图层,到一个查询结果图层数组。45 从可查询图层中,查询每个图层中的对象。46 送到网页上显示。,主要步骤,5其他辅助函数51 编写一个函数,利用GridView将数据表中内容显示到表格中,
5、其中借助HtmlTextWriter类,将表格的内容转换成html格式的字符串。52 编写另一个函数,将数据表转换成html表格格式的字符串,并把该字符串赋值给地图网页上的一个隐藏的文本框控件,调用open方法,弹出“属性查询页面”。53 通过地图控件的CallBackResults属性中设定事件响应机制,设定响应的事件,以及事件响应函数。6编写一个弹出信息属性窗口的网页,课堂实践,自定义矩形查询:P93-P96补:自定义点查询编程实现,课堂实践,自定义矩形查询:P93-P96,自定义多边型查询,实现步骤,1.给自定义Tool增加一个地图关联事件,设定关联的响应。2.响应之处实现一个IMapS
6、erverToolAction接口的ServerAction函数:(1)得到地图控件(2)得到地图控件上被指定的图形。(3)得到图形所对应或覆盖到的对象。(4)把屏幕对象映射到地图对象。(5)得到地图对象位置所对应的图层的各个对象。(6)把结果送给网页窗口显示。(7)接收并把结果转换成html格式的字符串,通过地图控件的回传处理函数,把字符串显示在弹出的网页上。,自定义,自定义多边形的获取从屏幕上的多边形得到地图上的多边形以多边形为过滤条件进行空间查询,自定义多边形的获取,从屏幕上的多边形得到地图上的多边形,从屏幕上的多边形得到各个拐点(点的集合)把屏幕上各点转换成地图上的对应点把地图上的各点
7、形成地图上的多边形,多边形转换,从屏幕上的多边形得到各个拐点(点的集合),把屏幕上各点转换成地图上的对应点,多边形转换,把地图上的各点形成地图上的多边形知识:从地图上的点集合,形成到地图上的环,到地图上的多边形Ring是ESRI.ArcGIS.ADF.Web.Geometry.RingRingCollection是ESRI.ArcGIS.ADF.Web.Geometry.RingCollection,后续任务,空间查询,得到查询结果集查询结果集转换、显示,自定义多边形查询属性的实现,仍然需要一个响应类,和支持类的辅助。对于自定义多变形查询来说,需要增加一个函数,实现多边形坐标系统的转换。,响应
8、类,public class IdentifyPolygon:IMapServerToolActionvoid IMapServerToolAction.ServerAction(ToolEventArgs args)Map map=args.Control as Map;PolygonEventArgs polyArgs=(PolygonEventArgs)args;Polygon mapPoly=GeometryHelper.GetMapPolygon(map,polyArgs);IdentifyHelper.Identify(map,mapPoly);,自定义多边形查询属性的实现,仍然需
9、要一个响应类,和支持类(共2个IdentifyHelpe、GeometryHelper)的辅助。对于自定义多变形查询来说,需要增加一个函数,实现多边形坐标系统的转换。,响应类,public class IdentifyPolygon:IMapServerToolActionvoid IMapServerToolAction.ServerAction(ToolEventArgs args)Map map=args.Control as Map;PolygonEventArgs polyArgs=(PolygonEventArgs)args;Polygon mapPoly=GeometryHelp
10、er.GetMapPolygon(map,polyArgs);IdentifyHelper.Identify(map,mapPoly);,支持类的成员,public static void Identify(Map map,ESRI.ArcGIS.ADF.Web.Geometry.Geometry mapGeometry)public static void ShowIdentifyResult(Map map,DataTableCollection dtc)public static string GetHtmlFromDataTable(DataTable dt)public static
11、 void AddJavaScriptCallback(Map map,string executeString),Identify()方法的作用及组成步骤,IdentifyHelper.Identify(mapCtrl,mapGeometry),接受传递而来的参量数值。判别资源是否可用,是否具有查询功能,若资源具有查询功能,则得到其查询功能。依据原有的形状对象,构造一个空间查询对象。利用该查询对象从可查询图层中过滤出查询结果图层数组。从可查询图层数组中查询每个图层中的对象(遍历),送到一个dataSet中。再把dataSet的Table送到DataTableCollection对象中。形成H
12、tml字符串,送给浏览器显示。,对比在响应类中的处理部分,Map map=args.Control as Map;点查询:PointEventArgs pea=(PointEventArgs)args;System.Drawing.Point screen_point=pea.ScreenPoint;Point point=Point.ToMapPoint();矩形查询RectangleEventArgs rectargs=(RectangleEventArgs)args;System.Drawing.Rectangle myrect=rectargs.ScreenExtent;顶点坐标转换;
13、形成地图上的矩形;IdentifyHelper.Identify(mapCtrl,mapGeometry);多边形查询 PolygonEventArgs polyArgs=(PolygonEventArgs)args;Polygon mapPoly=GeometryHelper.GetMapPolygon(map,polyArgs);IdentifyHelper.Identify(map,mapPoly);圆查询CircleEventArgs circleArgs=(CircleEventArgs)args;Polygon mapPoly=GeometryHelper.GetMapPolygo
14、n(map,circleArgs);IdentifyHelper.Identify(map,map mapGeometry);,课堂实践,自定义多边形查询:P96-P97补:自定义点查询编程实现 自定义矩形查询编程实现,课堂实践,自定义矩形查询:P93-P96自定义多边形查询:P96-P97程序录入:建立一个类库GisFunctionality,在其中输入函数P103(2)、P104(2)、P105(5),自定义圆查询的实现,程序实现机制和自定义多边形查询属性一致。程序结构是:响应类、支持类、图形转换类、弹出网页。,响应类,IdentifyCircle类public class Identif
15、yCircle:IMapServerToolAction void IMapServerToolAction.ServerAction(ToolEventArgs args)Map map=args.Control as Map;CircleEventArgs circleArgs=(CircleEventArgs)args;Polygon mapPoly=GeometryHelper.GetMapPolygon(map,circleArgs);IdentifyHelper.Identify(map,mapPoly);,需要使用类的介绍,GraphicsPath类,表示一系列相互连接的直线和曲
16、线。GraphicsPath.Flatten(),将此路径中的各段曲线转换成相连的线段序列。Matrix类,是一个矩阵类,Matrix.Translate()方法用于实现一个矩阵转换。,public static ESRI.ArcGIS.ADF.Web.Geometry.Polygon GetMapPolygon(Map map,CircleEventArgs circleArgs)System.Drawing.Point screenPointCenter=new System.Drawing.Point(int)circleArgs.CenterPoint.X,(int)circleArg
17、s.CenterPoint.Y);System.Drawing.Point screenPointBrink=new System.Drawing.Point(int)circleArgs.CenterPoint.X,(int)circleArgs.CenterPoint.Y+(int)circleArgs.Radius);,从屏幕坐标转换到地图坐标 Point mapPointCenter=Point.ToMapPoint(screenPointCenter,map.Extent,(int)map.Width.Value,(int)map.Height.Value);Point mapPoi
18、ntBrink=Point.ToMapPoint(screenPointBrink,map.Extent,(int)map.Width.Value,(int)map.Height.Value);得到地图坐标中的半径double radius=Math.Sqrt(mapPointCenter.X-mapPointBrink.X)*(mapPointCenter.X-mapPointBrink.X)+(mapPointCenter.Y-mapPointBrink.Y)*(mapPointCenter.Y-mapPointBrink.Y);,思路:以圆心为中心画一个椭圆,椭圆边上分为若干段,再将地图
19、上的点集合,集中到地图上的线,再到地图上的多边形。,GraphicsPath gpath=new GraphicsPath();gpath.AddEllipse(float)(mapPointCenter.X-radius),(float)(mapPointCenter.Y-radius),(float)(2*radius),(float)(2*radius);Matrix translateMatrix=new Matrix();translateMatrix.Translate(0,0);float flattening=(float)(radius/1000);gpath.Flatten
20、(translateMatrix,flattening);,PointCollection pc=new PointCollection();foreach(System.Drawing.PointF dpnt in gpath.PathPoints)pc.Add(new ESRI.ArcGIS.ADF.Web.Geometry.Point(dpnt.X,dpnt.Y);Ring ring=new Ring();ring.Points=pc;RingCollection rings=new RingCollection();rings.Add(ring);Polygon mapPoly=new Polygon();mapPoly.Rings=rings;return mapPoly;,课堂实践,自定义矩形查询:P93-P96自定义多边形查询:P96-P97程序录入:建立一个类库GisFunctionality,在其中输入函数P103(2)、P104(2)、P105(5),