目的:
1.arcgis server9.2 ADF实现实现点、线、面的MapTips。输入关键字查询出结果,然后给这些结果加上MapTips。
准备工作:
0.参考multimaptips-en.rtf。
1.用ArcGis Server Manager或者ArcCatalog发布一个叫usa的Map Service,并且把这个Service启动起来。
注:要为这个usa的地图添加一个点层名为New_Shapefile,因为maptips控件必须初始设置Layer属性不然会报错,这个控件真是问题多多了。
完成后的效果图:

开始:
1.新建名为myMapTips的ASP.NET Web应用程序,在页面上添加MapResourceManager1、Map1、MapTips1控件、Text1的input(输入查询关键字用)、Button1的input(搜索按钮)。
2.设置MapResourceManager1的属性,这里需要2个MapResourceItem,由上到下分别为maptips、usa。maptips的DataSourceType:GraphicsLayer;usa的DataSourceType:ArcGIS Server Local,就是连接上面发布的usa的Map Service。
3.设置MapTips1控件属性,map="Map1" BodyFormatString="{Id}" HeaderFormatString="{Id}" Layer="MapResourceManager1::usa::New_Shapefile" WhereClause="2>1" 上面的这些属性必须设置不然会报错了,这个控件设计的真是怪,还有一点了要在程序里动态设置MapTips1控件属性并且刷新必须设置 ShowOnlyWhenLayerIsVisible="False"不然也会报错。
4.Button1的input(搜索按钮),添加onclick事件:search(),其他的控件也做好相应的设置。
5.接下开始代码编写,首先实现ICallbackEventHandler接口,实现GetCallbackResult()和RaiseCallbackEvent(string eventArgument)两方法,具体代码如下:
public partial class TipsPage : System.Web.UI.Page, ICallbackEventHandler2
{3
public string m_Callback = "";4
protected void Page_Load(object sender, EventArgs e)5
{6
m_Callback = Page.ClientScript.GetCallbackEventReference(Page, "argument", "processCallbackResult", "context", "processCallbackError", true);7
}8

9
ICallbackEventHandler 成员23

24
private string RaiseCallbackEvent(string _callbackArg)25
{26
return "";27
}
<script>2
//搜索事件3
function search()4
{5
var v=document.getElementById("Text1").value;6
var argument = "ControlID=Map1&ControlType=Map&Type=query&EventArg=" + v;7
var context = "Map";8
var rv=<%= m_Callback %>;9
eval(rv);10

11
}12
13
function processCallbackError()14
{15
alert("错误啦!");16
}17
</script>8.接下来切换cs代码端处理search()的脚本方法发起的请求,具体在RaiseCallbackEvent(string _callbackArg)方法中进行请求处理并且把处理结果返回给客户端,具体代码和说明如下:
private string RaiseCallbackEvent(string _callbackArg)2
{3
CallbackResultCollection m_ADFCallbackResultCollection = new ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResultCollection();4
string v = "";5
NameValueCollection keyValColl = CallbackUtility.ParseStringIntoNameValueCollection(_callbackArg);6
if (keyValColl["Type"].ToString() == "query")7
{8
//查询结果数9
int featurecount = 0;10
//获取usa的MapFunctionality、Resource11
ESRI.ArcGIS.ADF.Web.UI.WebControls.Map map = (ESRI.ArcGIS.ADF.Web.UI.WebControls.Map)Map1;12
ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality mf = (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality)map.GetFunctionality("usa");13
ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gr = mf.Resource;14
ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality qf;15
string[] lids;16
string[] lnames;17
//创建QueryFunctionality18
qf = (ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)gr.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality), null);19
//查询图层id、名称20
qf.GetQueryableLayers(null, out lids, out lnames);21

22
//获取maptips的MapFunctionality、Resource23
ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality mf_maptips = (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality)map.GetFunctionality("maptips");24
ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource gr_matips = (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource)mf_maptips.Resource;25
//创建FeatureGraphicsLayer26
ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer gl_maptips = new ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer("maptips", ESRI.ArcGIS.ADF.Web.FeatureType.Point, new ESRI.ArcGIS.ADF.Web.Display.Renderer.SimpleRenderer(ESRI.ArcGIS.ADF.Web.FeatureType.Point, System.Drawing.Color.Red));27

28
//给新建的FeatureGraphicsLayer添加字段29
gl_maptips.Columns.Add("peid", typeof(Int32));30
gl_maptips.Columns.Add("objectid", typeof(Int32));31
gl_maptips.Columns.Add("name", typeof(string));32
gr_matips.Graphics.Tables.Clear();33

34
IMapFunctionality pMapfun;35
DataTable dt4 = null;36
ESRI.ArcGIS.ADF.Web.SpatialFilter sfilter = new ESRI.ArcGIS.ADF.Web.SpatialFilter();37
//获取查询关键字38
string Input = keyValColl["EventArg"];39
for (int i = 0; i < lids.Length; i++)40
{41
//设置过滤条件42
sfilter.ReturnADFGeometries = true;43
sfilter.MaxRecords = 100;44
sfilter.Geometry = null;45
sfilter.WhereClause = "NAME LIKE '" + Input + "%'";46
//查询并且把结果放在dt4中47
dt4 = qf.Query(null, lids[i], sfilter);48
if (dt4 != null)49
{50
//累加查询到的结果数51
featurecount += dt4.Rows.Count;52

53
//对查询到结果进行遍历,更加不同的类型在FeatureGraphicsLayer中生成显示点54
foreach (DataRow dr in dt4.Rows)55
{56
int objectid = Int32.Parse(dr["objectid"].ToString());57
int layerid = Int32.Parse(lids[i]);58
pMapfun = mf;59
if (pMapfun.Resource is ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal)60
{61
ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal pLocal = pMapfun.Resource as ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal;62
ESRI.ArcGIS.Carto.IMapServer pMapServer = (ESRI.ArcGIS.Carto.IMapServer)pLocal.MapServer;63
//获取Objects64
ESRI.ArcGIS.Carto.IMapServerObjects pMapServerObjects = pMapServer as ESRI.ArcGIS.Carto.IMapServerObjects;65
//用Objects的方法获取FeatureLayer66
ESRI.ArcGIS.Carto.IFeatureLayer pFLayer = pMapServerObjects.get_Layer(pMapServer.get_MapName(0), layerid) as ESRI.ArcGIS.Carto.IFeatureLayer;67
ESRI.ArcGIS.Geodatabase.IFeatureClass pFClass = pFLayer.FeatureClass;68
//根据objectid获取Feature69
ESRI.ArcGIS.Geodatabase.IFeature pFeature = pFClass.GetFeature(objectid);70
//获取Geometry71
ESRI.ArcGIS.Geometry.IGeometry pGeometry = pFeature.Shape;72
//查询结果为点的时候73
if (pGeometry.GeometryType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint)74
{75
//新建点并且添加到FeatureGraphicsLayer76
IPoint ippoint = pGeometry as IPoint;77
ESRI.ArcGIS.ADF.Web.Geometry.Point adfpt = ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.Converter.FromIPoint(ippoint);78
DataRow dtr = gl_maptips.Add(adfpt);79
//添加属性值80
try81
{82
dtr["objectid"] = objectid;83
dtr["peid"] = dr["peid"];84
dtr["name"] = dr["name"];85
}86
catch87
{88
dtr["objectid"] = objectid;89
dtr["peid"] = 0;90
dtr["name"] = dr["name"];91
}92
}93
//查询结果为线的时候94
if (pGeometry.GeometryType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline)95
{96
IPolyline ippolyline = pGeometry as IPolyline;97
ESRI.ArcGIS.Geometry.IPointCollection com_pointcollection = (ESRI.ArcGIS.Geometry.IPointCollection)ippolyline;98
ESRI.ArcGIS.ADF.Web.Geometry.Point[] new_adf_points = ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.Converter.FromIPointCollection(com_pointcollection);99
ESRI.ArcGIS.ADF.Web.Geometry.Point adfpt = new ESRI.ArcGIS.ADF.Web.Geometry.Point();100
//获取线的中间一个点101
adfpt = new_adf_points[new_adf_points.Length / 2];102
DataRow dtr = gl_maptips.Add(adfpt);103
try104
{105
dtr["objectid"] = objectid;106
dtr["peid"] = dr["peid"];107
dtr["name"] = dr["name"];108
}109
catch110
{111
dtr["objectid"] = objectid;112
dtr["peid"] = 0;113
dtr["name"] = dr["name"];114
}115

116
}117
//查询结果为面的时候118
if (pGeometry.GeometryType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon)119
{120
IPolygon ippolygon = pGeometry as IPolygon;121
//面曲线的开始点122
ESRI.ArcGIS.Geometry.IPoint ippoint = ippolygon.FromPoint;123
ESRI.ArcGIS.ADF.Web.Geometry.Point adfpt = ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.Converter.FromIPoint(ippoint);124
DataRow dtr = gl_maptips.Add(adfpt);125
try126
{127
dtr["objectid"] = objectid;128
dtr["peid"] = dr["peid"];129
dtr["name"] = dr["NAME"];130
}131
catch132
{133
dtr["objectid"] = objectid;134
dtr["peid"] = 0;135
dtr["name"] = dr["NAME"];136
}137

138
}139
}//end if140
}//end foreach141
}142
143
}// end for144
//把FeatureGraphicsLayer添加到maptips145
gr_matips.Graphics.Tables.Add(gl_maptips);146
if (featurecount > 0)147
{148
//设置地图视图范围149
ESRI.ArcGIS.ADF.Web.Geometry.Geometry geom;150
ESRI.ArcGIS.ADF.Web.Geometry.Envelope env = new ESRI.ArcGIS.ADF.Web.Geometry.Envelope(double.MaxValue, double.MaxValue, double.MinValue, double.MinValue);151
foreach (DataRow row in gl_maptips.Rows)152
{153
geom = gl_maptips.GeometryFromRow(row);154
env.Union(geom);155
}156
int percent = 20;157
double newwidth, newheight;158
newwidth = map.GetFullExtent().Width * (percent / 100);159
newheight = map.GetFullExtent().Height * (percent / 100);160
env.XMin -= newwidth;161
env.XMax += newwidth;162
env.YMin -= newheight;163
env.YMax += newheight;164
map.Extent = env;165

166
//设置MapTips1的属性167
MapTips1.FeatureLimit = 20;168
MapTips1.Layer = "MapResourceManager1::maptips::maptips";169
MapResourceManager mr = MapResourceManager1;170
MapTips1.HeaderFormatString = "{objectid}";171
MapTips1.BodyFormatString = "{name}";172
MapTips1.Features = null;173
MapTips1.WhereClause = "2>1";174
MapTips1.Map = map.ClientID;175
//刷新MapTips1176
MapTips1.Refresh();177
178
m_ADFCallbackResultCollection.Add(MapTips1.CallbackResults[0]);179
m_ADFCallbackResultCollection.Add(Map1.CallbackResults[0]);180
}181
}182

183
return m_ADFCallbackResultCollection.ToString();184
}
