您的位置:首页 > 其它

ArcGIS Server 开发系列(五)--自定义 Toolbar 工具 (转载于Flyingis)

2007-09-17 09:13 615 查看
前面的开发系列均是使用server开发模板程序Web Mapping Application,工具条上的基本工具是已经在模板中定制好的,在实际项目应用中,我们需要的工具远远不仅如此,如何在工具条中增加新的自定义工具是开发系列(五)所要描述的,其中使用ASP.Net 2.0 Callback framework进行异步刷新地图是重点。

目标:

自定义工具按钮进行矩选查询,高亮显示所选择的地图要素,页面下方的Gridview显示所选择要素的属性信息。

准备工作:

1.了解ESRI.ArcGIS.Server.WebControls.IMapServerToolAction接口

2.了解ASP.Net 2.0 Callback framework

3.新建一个网站,在ArcGIS Web Controls控件中拖动如下控件:Toolbar、Map、Toc、MapResourceManager,以及常用控件Label、DropDownList、Gridview。

4.设置控件属性,Toolbar、Toc的BuddyControls均为Map1,Toolbar的BuddyControlType为Map,Map控件的MapResourceManager为MapResourceManager1。

5.更改MapResourceManager属性,添加两个Resource:Selection和NorthAmerica,类型分别是Graphics Layer和ArcGIS Server Internet。

最后视图效果:

Map mapctrl = null;

mapctrl = (Map)args.Control;

// 获取下拉框中的数据,在后面实现

string targetlayername = (string)mapctrl.Page.Session["TargetLayer"];

RectangleEventArgs rectargs = null;

// 强制类型转换为RectangleEventArgs

rectargs = (RectangleEventArgs)args;

// 获取矩形选择框的屏幕坐标

System.Drawing.Rectangle rect = rectargs.ScreenExtent;

ESRI.ArcGIS.ADF.Web.Geometry.Point minpnt = ESRI.ArcGIS.ADF.Web.Geometry.Point.ToMapPoint(rect.Left, rect.Bottom, mapctrl.Extent, (int)mapctrl.Width.Value, (int)mapctrl.Height.Value);

ESRI.ArcGIS.ADF.Web.Geometry.Point maxpnt = ESRI.ArcGIS.ADF.Web.Geometry.Point.ToMapPoint(rect.Right, rect.Top, mapctrl.Extent, (int)mapctrl.Width.Value, (int)mapctrl.Height.Value);

ESRI.ArcGIS.ADF.Web.Geometry.Envelope mappoly = null;

// minpnt、maxpnt分别是左下、右上坐标点

mappoly = new ESRI.ArcGIS.ADF.Web.Geometry.Envelope(minpnt, maxpnt);

所有的信息都是通过args获取,它是一个ESRI.ArcGIS.ADF.Web.UI.WebControls.ToolEventArgs对象,包含了客户端Map控件和当前客户端工具的信息,RectangleEventArgs是它的子类,强制性转换后得到矩选的矩形坐标,最后得到一个 Envelope,用于spatialfilter.Geometry属性。

2.查询所选择的要素并对Graphics Layer进行渲染实现高亮

这部分内容完全可以参考《ArcGIS Server 开发系列(三)--漫游 Graphics data sources》,只需要注释掉WhereClause属性赋值,再增加一行代码:

ESRI.ArcGIS.ADF.Web.SpatialFilter spatialfilter = new ESRI.ArcGIS.ADF.Web.SpatialFilter();

spatialfilter.ReturnADFGeometries = false;

spatialfilter.MaxRecords = 1000;

//spatialfilter.WhereClause = txtQuery.Text;

spatialfilter.Geometry = mappoly;

3.异步刷新Gridview显示地图要素的属性

GridView gdview = (GridView)mapctrl.Page.FindControl("GridView1");

object[] oa = new object[1];

string showtable = "'visible'";

// datatable为矩选时所选择的地图要素,绑定到gridview

gdview.DataSource = datatable;

gdview.DataBind();

string returnstring = null;

using (System.IO.StringWriter sw = new System.IO.StringWriter())

// innercontent相当于innerhtml

CallbackResult cr = new CallbackResult("div", "griddiv", "innercontent", returnstring);

// 通过回调将信息从服务器端传输到客户端

mapctrl.CallbackResults.Add(cr);

if (datatable.Rows.Count > 1)

else

string sa = "var griddiv = document.getElementById('griddiv');";

sa += "griddiv.style.visibility = " + showtable + ";";

oa[0] = sa;

CallbackResult cr1 = new CallbackResult(null, null, "javascript", oa);

mapctrl.CallbackResults.Add(cr1);

这段代码最关键的类是CallbackResult,它简化了web adf framework中客户端回调的处理,不用再创建自己的客户端和服务器端逻辑,使用CallbackResult就可以将信息传回客户端,更新客户端页面的内容、图片或执行js脚本。关于CallbackResult构造方法第三个参数,下面js代码写的很详细:

else if (action=="image")

if (!IsPostBack)

protected void Page_Load(object sender, EventArgs e)

public void ChangeDropDownListServer(string ea)

<script type="text/javascript" language="javascript">

var context;

function ChangeLayer()

</script>

运行程序:



其中黄色区域就是Select Features按钮矩选的要素,下方gridview显示了查询到的属性结果。

程序中有两个地方用到了异步刷新,一个是ASP.Net 2.0原有接口ICallbackEventHandler,另一个是Web ADF framework的CallbackResult类,最初认为简单异步刷新用自己写的XMLHttpRequest请求更为简单,如上例中对 session存储值的改变,不用ICallbackEventHandler,但是在server地图互操作的过程中, ICallbackEventHandler给我们提供了更多的便利。

继续思考:

1.本例实现了根据地图查询属性,反过来根据属性查询几何图形怎么实现呢?其实前面《ArcGIS Server 开发系列(三)--漫游 Graphics data sources》已经讲到了,只不过需要将条件查询的信息,更改为在gridview或其他地方选择的属性信息,然后高亮显示相应的几何要素。

2.这种几何要素图形和属性信息的关联可以应用于各种不同的业务需求中,如图形和属性的同步删除、位置定位、类似结果查询等等。

3.如何改进或提升这种图形和属性的异步刷新带来的用户体验?

作者:Flyingis
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐