免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 3472|回复: 2
收起左侧

ArcGIS.Server.9.2.DotNet 查询地图元素进行定位显示

[复制链接]

48

主题

4233

铜板

19

好友

地信贵宾

贴心369购物导航-淘宝购物导航第

Rank: 13Rank: 13Rank: 13Rank: 13

积分
1648

斑竹勋章爱心勋章活跃勋章

发表于 2010-6-21 13:09 | 显示全部楼层 |阅读模式
目的:
1.arcgis server9.2 ADF实现查询结果定位到地图中心显示功能

准备工作:
1.用ArcGis Server Manager或者ArcCatalog发布一个叫usa的Map Service,并且把这个Service启动起来。

开始:
1.新建名为QueryCenter的ASP.NET Web应用程序,在页面上添加MapResourceManager1、Map1控件,然后做相应的设置把上面发布的usa的Map Service作为MapResourceItem。这些设置比较简单不详细说明,可以参考前面的文章《ArcGIS.Server.9.2.DotNet自带例子分析(一、一)》。
2.然后在页面上添加一个输入框Text1,用来输入查询关键字。添加一个查询按钮Button1,并且给它添加onclick="search()"。添加一个id为list1的div用来显示查询结果。具体的显示看如下的html代码:
Code

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> 1<body>
 2    <form id="form1" runat="server">
 3    <div>
 4        <table border="1">
 5            <tr>
 6                <td colspan="2">
 7                    输入关键字<input id="Text1" type="text" value="A" />
 8                    <input id="Button1" style="width: 61px" type="button" value="查询" onclick="search()" /></td>
 9            </tr>
10            <tr>
11                <td style="width: 483px" >
12                    <esri:Map ID="Map1" runat="server" Height="393px" MapResourceManager="MapResourceManager1" Width="478px">
13                    </esri:Map>
14                </td>
15                <td valign="top" style="width: 150px" >
16                查询结果:<br />
17                <div id="list1"></div>
18                </td>
19            </tr>
20        </table>
21    
22    </div>
23        <esri:MapResourceManager ID="MapResourceManager1" runat="server">
24            <ResourceItems>
25                <esri:MapResourceItem Definition="<Definition DataSourceDefinition="jh-53a435fbc0e8" DataSourceType="ArcGIS Server Local" Identity="To set, right-click project and 'Add ArcGIS Identity'" ResourceDefinition="(default)@usa" DataSourceShared="True" />"
26                    DisplaySettings="visible=True:transparency=0:mime=True:imgFormat=PNG8:height=100:width=100:dpi=96:color=:transbg=False:displayInToc=True"
27                    Name="MapResourceItem0" />
28            </ResourceItems>
29        </esri:MapResourceManager>
30    </form>
31</body>
3.接下来编写代码,需要实现ICallbackEventHandler的接口,实现GetCallbackResult和RaiseCallbackEvent两个方法。
4.在Page_Load生成用户客户端调用的脚本段,具体代码如下:

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->1public string m_Callback="";
2protected void&#160age_Load(object sender, EventArgs e)
3
{
4//生成客户端脚本段
5 m_Callback = Page.ClientScript.GetCallbackEventReference(Page, "argument", "processCallbackResult", "context", true);
6}
5.把页面切换到html视图,进行脚本事件的编写,首先编写查询按钮Button1的search()事件,代码和说明如下:

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> 1function search()
 2    
{
 3       //获取输入的查询关键字
 4 var v=document.getElementById("Text1").value;
 5       //生成请求字符串
 6 var argument = "ControlID=Map1&ControlType=Map&Type=query&EventArg=" + v;
 7       var context = "Map";
 8       //m_Callback 由服务端的Page_load事件中生成的,用于请求服务端的js代码
 9 var script=<%= m_Callback %>
10       //用eval执行字符串
11       eval(script);
12    }
6.接下在RaiseCallbackEvent方法中接收脚本方法search()发起的请求进行处理然后把结果返回给客户端更新页面显示,具体代码如下:

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> 1 string v = "";
 2            NameValueCollection keyValColl = CallbackUtility.ParseStringIntoNameValueCollection(_callbackArg);
 3            if (keyValColl["Type"].ToString() == "query")
 4            
{
 5                System.Text.StringBuilder sb = new System.Text.StringBuilder();
 6                string Input = keyValColl["EventArg"];
 7                string str = "";
 8                string targetlayername = "states";
 9                //获取Data Layers的MapFunctionality
10                ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality mf = (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality)Map1.GetFunctionality(0);
11                ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gisresource = mf.Resource;
12                //是否支持QueryFunctionality
13 bool supported = gisresource.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality));
14                if (supported)
15                
{
16                    //创建QueryFunctionality
17                    ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality qfunc = (ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)gisresource.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality), null);
18                    string[] lids;
19                    string[] lnames;
20                    //查询图层的id和名称
21                    qfunc.GetQueryableLayers(null, out lids, out lnames);
22
23                    int layer_index = 0;
24                    //获取目标图层的index
25 for (int i = 0; i < lnames.Length; i++)
26                    
{
27                        if (lnames == targetlayername)
28                        
{
29                            layer_index = i;
30                            break;
31                        }
32                    }
33                    //空间过滤
34                    ESRI.ArcGIS.ADF.Web.SpatialFilter spatialfilter = new ESRI.ArcGIS.ADF.Web.SpatialFilter();
35                    //是否返回地理元素
36                    spatialfilter.ReturnADFGeometries = false;
37                    //返回最大记录数
38                    spatialfilter.MaxRecords = 1000;
39                    spatialfilter.Geometry = Map1.GetFullExtent();
40                    //查询目标图层并且把结果存入DataTable
41                    //查询语句
42                    spatialfilter.WhereClause = "STATE_NAME LIKE '" + Input + "%'";
43                    System.Data.DataTable datatable = qfunc.Query(null, lids[layer_index], spatialfilter);
44                    //组成显示内容
45 for (int i = 0; i < datatable.Rows.Count; i++)
46                    
{
47                        string idv = datatable.Rows["OBJECTID"].ToString();
48                        string namev = datatable.Rows["STATE_NAME"].ToString();
49                        if (i == 0)
50                        
{
51                            str = "<a href='#' onclick=gocenger('" + idv + "')>" + namev + "</a>";
52                        }
53                        else
54                        
{
55                            str = str + "<br/>" + "<a href='#' onclick=gocenger('" + idv + "')>" + namev + "</a>";
56                        }
57
58                    }
59
60
61                }
62
63                //把内容返回给客户端,客户端的processCallbackResult方法会把内容显示在list1中
64                sb.AppendFormat("div:::{0}:::content:::{1}", "list1", str);
65                v = sb.ToString();
66            }
67return v;
7.这样查询功能就完成了,运行然后输入“A”查询地图中STATE_NAME以A为开始的地理元素。
8.查询完成后接下在做一个功能就是点击到查询的名称时把这个查询到的元素作为地图的中心进行显示。在生成上面的查询结果时已经为每个查询到的内容添加了一个gocenger的onclick事件,它有一个参数就是查询到元素的OBJECTID。切换到HTML视图添加gocenger脚本,具体如下:


Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->1function gocenger(id)
2    
{
3       //请求字符串
4 var argument = "ControlID=Map1&ControlType=Map&Type=center&EventArg=" + id;
5       var context = "Map";
6       var script=<%= m_Callback %>
7       eval(script);
8    }
9.同样需要在RaiseCallbackEvent方法中对脚本这个方法gocenger发起的请求进行处理,对RaiseCallbackEvent方法进行修改添加,具体代码如下:
Code

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->private string RaiseCallbackEvent(string _callbackArg)
        {
           
            string v 
= "";
            NameValueCollection keyValColl 
= CallbackUtility.ParseStringIntoNameValueCollection(_callbackArg);
            
if (keyValColl["Type"].ToString() == "query")
            {
                System.Text.StringBuilder sb 
= new System.Text.StringBuilder();
                string Input 
= keyValColl["EventArg"];
                string str 
= "";
                string targetlayername 
= "states";
                
//获取Data Layers的MapFunctionality
                ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality mf = (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality)Map1.GetFunctionality(0);
                ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gisresource 
= mf.Resource;
                
//是否支持QueryFunctionality
                bool supported = gisresource.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality));
                
if (supported)
                {
                    
//创建QueryFunctionality
                    ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality qfunc = (ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)gisresource.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality), null);
                    string[] lids;
                    string[] lnames;
                    
//查询图层的id和名称
                    qfunc.GetQueryableLayers(null, out lids, out lnames);

                    
int layer_index = 0;
                    
//获取目标图层的index
for (int i = 0; i < lnames.Length; i++)
                    {
                        
if (lnames == targetlayername)
                        {
                            layer_index 
= i;
                            
break;
                        }
                    }
                    
//空间过滤
                    ESRI.ArcGIS.ADF.Web.SpatialFilter spatialfilter = new ESRI.ArcGIS.ADF.Web.SpatialFilter();
                    
//是否返回地理元素
                    spatialfilter.ReturnADFGeometries = false;
                    
//返回最大记录数
                    spatialfilter.MaxRecords = 1000;
                    spatialfilter.Geometry 
= Map1.GetFullExtent();
                    
//查询目标图层并且把结果存入DataTable
//查询语句
                    spatialfilter.WhereClause = "STATE_NAME LIKE '" + Input + "%'";
                    System.Data.DataTable datatable 
= qfunc.Query(null, lids[layer_index], spatialfilter);
                    
//组成显示内容
for (int i = 0; i < datatable.Rows.Count; i++)
                    {
                        string idv 
= datatable.Rows["OBJECTID"].ToString();
                        string namev 
= datatable.Rows["STATE_NAME"].ToString();
                        
if (i == 0)
                        {
                            str 
= "<a href='#' onclick=gocenger('" + idv + "')>" + namev + "</a>";
                        }
                        
else
                        {
                            str 
= str + "<br/>" + "<a href='#' onclick=gocenger('" + idv + "')>" + namev + "</a>";
                        }

                    }


                }

                
//
                sb.AppendFormat("div:::{0}:::content:::{1}", "list1", str);
                v 
= sb.ToString();
            }
            
else if (keyValColl["Type"].ToString() == "center")
            {
                string Input 
= keyValColl["EventArg"];
                string str 
= "";
                string targetlayername 
= "states";
                
//获取Data Layers的MapFunctionality
                ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality mf = (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality)Map1.GetFunctionality(0);
                ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gisresource 
= mf.Resource;
                
//是否支持QueryFunctionality
                bool supported = gisresource.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality));
                
if (supported)
                {
                    
//创建QueryFunctionality
                    ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality qfunc = (ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)gisresource.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality), null);
                    string[] lids;
                    string[] lnames;
                    
//查询图层的id和名称
                    qfunc.GetQueryableLayers(null, out lids, out lnames);

                    
int layer_index = 0;
                    
//获取目标图层的index
for (int i = 0; i < lnames.Length; i++)
                    {
                        
if (lnames == targetlayername)
                        {
                            layer_index 
= i;
                            
break;
                        }
                    }
                    
//空间过滤
                    ESRI.ArcGIS.ADF.Web.SpatialFilter spatialfilter = new ESRI.ArcGIS.ADF.Web.SpatialFilter();
                    
//是否返回地理元素
                    spatialfilter.ReturnADFGeometries = true;
                    
//返回最大记录数
                    spatialfilter.MaxRecords = 1000;
                    spatialfilter.Geometry 
= Map1.GetFullExtent();
                    
//查询目标图层并且把结果存入DataTable
//查询语句
                    spatialfilter.WhereClause = "OBJECTID = " + Input ;
                    System.Data.DataTable datatable 
= qfunc.Query(null, lids[layer_index], spatialfilter);

                    DataRowCollection drs 
= datatable.Rows;

                    
int shpind = -1;
                    
for (int i = 0; i < datatable.Columns.Count; i++)
                    {
                        
if (datatable.Columns.DataType == typeof(ESRI.ArcGIS.ADF.Web.Geometry.Geometry))
                        {
                            shpind 
= i;
                            
break;
                        }
                    }

                    foreach (DataRow dr 
in drs)
                    {
                        
//获取Geometry
                        ESRI.ArcGIS.ADF.Web.Geometry.Geometry geo = (ESRI.ArcGIS.ADF.Web.Geometry.Geometry)dr[shpind];
                        
//获取查询到的这个Geometry的中心点
                        ESRI.ArcGIS.ADF.Web.Geometry.Point centerpoint = ESRI.ArcGIS.ADF.Web.Geometry.Geometry.GetCenterPoint(geo);
                        
//以这个中心点重新设置地图的中心
                        Map1.CenterAt(centerpoint);
                        
//把CallbackResults字符串返回客户端用来更新地图显示
                        v = Map1.CallbackResults.ToString();

                    }
                }
            }

            
return v;
        }

10.完成了全部功能的开发,运行查看效果。
交流、学习,提升自己!

1145

主题

10万

铜板

2

好友

传奇会员

Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30Rank: 30

积分
21817

灌水勋章活跃勋章冰雪节勋章

QQ
发表于 2013-11-7 19:10 | 显示全部楼层
进来学习学习

评分

参与人数 1铜板 +1 收起 理由
admin + 1 亲,你好快哦~~~

查看全部评分

加强科技支撑和引领  实现地质找矿新突破 。     
回复 支持 反对

使用道具 举报

37

主题

2万

铜板

111

好友

钻石会员

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
5763
发表于 2022-3-7 11:32 | 显示全部楼层
难度比较大,看看
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表