目的:
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代码:
4.在Page_Load生成用户客户端调用的脚本段,具体代码如下:
1
public string m_Callback="";
2
protected void Page_Load(object sender, EventArgs e)
3
}
5.把页面切换到html视图,进行脚本事件的编写,首先编写查询按钮Button1的search()事件,代码和说明如下:2
3
1
function search()
2
}
6.接下在RaiseCallbackEvent方法中接收脚本方法search()发起的请求进行处理然后把结果返回给客户端更新页面显示,具体代码如下:2
1
string v = "";
2
NameValueCollection keyValColl = CallbackUtility.ParseStringIntoNameValueCollection(_callbackArg);
3
if (keyValColl["Type"].ToString() == "query")
4
v;
7.这样查询功能就完成了,运行然后输入“A”查询地图中STATE_NAME以A为开始的地理元素。2
3
4
8.查询完成后接下在做一个功能就是点击到查询的名称时把这个查询到的元素作为地图的中心进行显示。在生成上面的查询结果时已经为每个查询到的内容添加了一个gocenger的onclick事件,它有一个参数就是查询到元素的OBJECTID。切换到HTML视图添加gocenger脚本,具体如下:
1
function gocenger(id)
2
}
9.同样需要在RaiseCallbackEvent方法中对脚本这个方法gocenger发起的请求进行处理,对RaiseCallbackEvent方法进行修改添加,具体代码如下:2
{
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[i] == 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[i]["OBJECTID"].ToString();
string namev = datatable.Rows[i]["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[i] == 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[i].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;
}