转:利用JavaScript实现图片标注——SearchMapIdentityTask

摘要:
功能:功能实现了现在网络流行的定位后在地图上画一个图标,点击图标后弹出消息框。

功能:功能实现了现在网络流行的定位后在地图上画一个图标,点击图标后弹出消息框。

思路:根据查询条件获得一个点的地图坐标,然后转换为屏幕坐标,利用js脚本动态图片到相应位置。

效果图如下:

转:利用JavaScript实现图片标注——SearchMapIdentityTask第1张

主要实现步骤:

1、SearchMapIdentity.cs,该类主要实现查询获取点的地图坐标,地图坐标转换为屏幕坐标的方法,点击小图标时的回发调用,代码如下

1usingSystem;
2usingSystem.Data;
3usingSystem.Collections;
4usingSystem.Collections.Specialized;
5usingSystem.Configuration;
6usingSystem.Web;
7usingSystem.Web.Security;
8usingSystem.Web.UI;
9usingSystem.Web.UI.WebControls;
10usingSystem.Web.UI.WebControls.WebParts;
11usingSystem.Web.UI.HtmlControls;
12usingESRI.ArcGIS.ADF.Web;
13usingESRI.ArcGIS.ADF.Web.UI.WebControls;
14usingESRI.ArcGIS.ADF.Web.DataSources;
15usingESRI.ArcGIS.ADF.Web.Geometry;
16usingESRI.ArcGIS.ADF.Web.Display.Graphics;
17usingSystem.Collections.Generic;
18
19namespaceSearchMapIdentityTask{
20
21publicclassSearchMapIdentity
22{
23#region私有字段
24privatePagem_page;
25privateMapm_map;
26privateArrayListmapPoints=null;
27privatestringcontent;
28
29privatestringm_callbackInvocation="";
30privatestringm_filePath="";
31privatestringqueryText="";
32privateDataTablequeryResult=null;
33privatestringqueryField="";
34privatestringreadFields="";
35#endregion
36
37#region相关属性
38publicMapMap
39{
40get{returnm_map;}
41set{m_map=value;}
42}
43
44publicPagePage
45{
46get{returnm_page;}
47set{m_page=value;}
48}
49
50
51publicstringClientCallbackInvocation
52{
53get{returnm_callbackInvocation;}
54set{m_callbackInvocation=value;}
55}
56
57publicstringFilePath
58{
59get{returnm_filePath;}
60set{m_filePath=value;}
61}
62
63publicstringQueryText
64{
65get{returnqueryText;}
66set{queryText=value;}
67}
68
69publicArrayListMapPoints
70{
71get{returnmapPoints;}
72set{mapPoints=value;}
73}
74publicstringContent
75{
76get{returncontent;}
77set{content=value;}
78}
79
80publicDataTableQueryResult
81{
82get{returnqueryResult;}
83set{queryResult=value;}
84}
85//需要用来作为Where条件的查询字段86publicstringQueryField
87{
88get{returnqueryField;}
89set{queryField=value;}
90}
91//需要显示在详细信息里的字段92publicstringReadFields
93{
94get{returnreadFields;}
95set{readFields=value;}
96}
97#endregion
98
99#region构造函数
100
101publicSearchMapIdentity()
102{
103}
104
105publicSearchMapIdentity(Mapmap)
106{
107if(map!=null)
108{
109m_map=map;
110}
111}
112
113publicSearchMapIdentity(Mapmap,stringfilePath)
114{
115m_map=map;
116m_filePath=filePath;
117
118}
119#endregion
120
121#region处理点击查询回调的函数
122
123publicvoidIdentify(boolisFirstIdentify,stringlayername)
124{
125intx=0;
126inty=0;
127ArrayListxy=null;
128if(this.MapPoints==null||isFirstIdentify==true)
129{
130xy=GetXY(this.Map,layername);
131}
132else
133{
134xy=this.MapPointsasArrayList;
135}
136foreach(objectoinxy)
137{
138object[]arrayPoints=oasobject[];
139ESRI.ArcGIS.ADF.Web.Geometry.Pointp=(ESRI.ArcGIS.ADF.Web.Geometry.Point)arrayPoints[0];
140System.Drawing.PointscreenPoint=MapToScreenPoint(p.X,p.Y);
141x=screenPoint.X;
142y=screenPoint.Y;
143stringcontent=arrayPoints[1]asstring;
144stringoa=string.Format("ReDrawZommToPoint({0},{1},{2},{3},\'{4}\');",x,y,p.X,p.Y,content);
145CallbackResultcr1=newCallbackResult(null,null,"javascript",oa);
146this.Map.CallbackResults.Add(cr1);
147}
148}
149#endregion
150
151#region处理点击小图片时回调的函数
152publicvoidDrawInfoWin(doublemapX,doublemapY,stringcontent)
153{
154System.Drawing.Pointscreen_point=MapToScreenPoint(mapX,mapY);
155int[]rate={screen_point.X,screen_point.Y-38};
156object[]oa=newobject[1];
157stringsa="showInfoWindow("+rate[0].ToString()+","+rate[1].ToString()+",'"+content+"');";
158oa[0]=sa;
159CallbackResultcr1=newCallbackResult(null,null,"javascript",oa);
160this.Map.CallbackResults.Add(cr1);
161}
162#endregion
163
164#region获得查询点的结果集
165publicArrayListGetXY(MapMap1,stringlayername)
166{
167ArrayListXY=newArrayList();
168IEnumerablefunc_enum=Map1.GetFunctionalities();
169System.Data.DataTabledatatable=null;
170
171foreach(ESRI.ArcGIS.ADF.Web.DataSources.IGISFunctionalitygisfunctionalityinfunc_enum)
172{
173ESRI.ArcGIS.ADF.Web.DataSources.IGISResourcegisresource=gisfunctionality.Resource;
174
175if(gisfunctionality.Resource.DataSource.DataSourceDefinition=="InMemory")
176{
177continue;
178}
179
180boolsupported=gisresource.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality));
181
182if(supported)
183{
184ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionalityqfunc;
185
186qfunc=(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)gisresource.CreateFunctionality(
187typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality),null);
188
189string[]lids;
190string[]lnames;
191qfunc.GetQueryableLayers(null,outlids,outlnames);
192
193intlayer_index=-1;
194for(inti=0;i<lnames.Length;i++)
195{
196if(lnames[i]==layername)
197{
198layer_index=i;
199break;
200}
201}
202
203if(layer_index==-1)
204{
205continue;
206}
207
208ESRI.ArcGIS.ADF.Web.SpatialFilterspatialfilter=newESRI.ArcGIS.ADF.Web.SpatialFilter();
209spatialfilter.Geometry=Map1.GetFullExtent();
210spatialfilter.ReturnADFGeometries=true;
211spatialfilter.MaxRecords=1000;
212spatialfilter.WhereClause=this.QueryField+"like'%"+this.QueryText+"%'";//txtSearch.Text;查询条件213
214datatable=qfunc.Query(null,lids[layer_index],spatialfilter);
215this.QueryResult=datatable;
216
217if(datatable!=null)
218{
219intintShape=-1;
220foreach(System.Data.DataColumncolindatatable.Columns)
221{
222if(col.DataType==typeof(Geometry))
223{
224intShape=col.Ordinal;
225break;
226}
227}
228
229for(inti=0;i<datatable.Rows.Count;i++)
230{
231ESRI.ArcGIS.ADF.Web.Geometry.Pointpoint2=(ESRI.ArcGIS.ADF.Web.Geometry.Point)datatable.Rows[i].ItemArray[intShape];
232//让地图以某个点居中233this.Map.CenterAt(point2);
234ArrayreadFieldPairs=this.ReadFields.Split(";".ToCharArray());
235string[]readFieldValue;
236//循环构造Content属性237if(readFieldPairs.Length>0)
238{
239for(intj=0;j<readFieldPairs.Length-1;j++)
240{
241readFieldValue=readFieldPairs.GetValue(j).ToString().Split(":".ToCharArray());
242this.Content+=readFieldValue[0]+":"+datatable.Rows[i][readFieldValue[1]].ToString()+"<br>";
243}
244}
245object[]arraryPoint=newobject[2];
246arraryPoint[0]=point2;
247arraryPoint[1]=this.Content;
248//将Content属性清空249this.Content="";
250XY.Add(arraryPoint);
251}
252}
253}
254}
255this.MapPoints=XY;
256returnXY;
257
258}
259#endregion
260
261#region由地图坐标经过转换得到屏幕坐标的点
262publicSystem.Drawing.PointMapToScreenPoint(doublemapX,doublemapY)
263{
264ESRI.ArcGIS.ADF.Web.Geometry.Pointadf_point=newESRI.ArcGIS.ADF.Web.Geometry.Point(mapX,mapY);
265ESRI.ArcGIS.ADF.Web.Geometry.TransformationParamstransformationParameters=this.Map.GetTransformationParams(ESRI.ArcGIS.ADF.Web.Geometry.TransformationDirection.ToScreen);
266System.Drawing.Pointscreen_point=adf_point.ToScreenPoint(transformationParameters);
267returnscreen_point;
268}
269
270#endregion
271
272}
273}

2、SearchMapIdentityTask.cs,这个就是包装Task的类,主要代码如下

1usingSystem;
2usingSystem.Collections.Generic;
3usingSystem.Text;
4usingSystem.Web;
5usingESRI.ArcGIS.ADF.Web.UI.WebControls;
6usingESRI.ArcGIS.ADF.Web.DataSources;
7usingSystem.Web.UI.WebControls;
8usingSystem.Web.UI.HtmlControls;
9usingSystem.Web.UI;
10usingSystem.Collections;
11usingSystem.Collections.Specialized;
12usingSystem.Data;
13usingSystem.ComponentModel;
14usingSystem.Text.RegularExpressions;
15
16namespaceSearchMapIdentityTask
17{
18
19publicclassSearchMapIdentityTask:FloatingPanelTask
20{
21privateTextBoxtextBox=null;
22privateHtmlInputButtonbutton=null;
23privateHtmlSelectselLayers=null;
24privateHtmlInputButtonclear=null;
25
26SearchMapIdentitysearchMapIdentity=null;
27privatestringqueryField="";
28privatestringreadFileds="";
29
30#region相关属性
31[Description("用户where条件中要查询的字段")]
32publicstringQueryField
33{
34get{returnqueryField;}
35set{queryField=value;}
36}
37[Description("设置需要在详细信息中显示的字段,格式为(字段1中文名:字段1数据库表名;字段2中文名:字段2数据库表名)")]
38publicstringReadFileds
39{
40get{returnreadFileds;}
41set{readFileds=value;}
42}
43#endregion
44
45#region构造函数
46publicSearchMapIdentityTask()
47{
48this.Width=Unit.Pixel(200);
49}
50#endregion
51
52#region构建子控件
53protectedoverridevoidCreateChildControls()
54{
55Controls.Clear();
56base.CreateChildControls();
57textBox=newTextBox();
58textBox.ID="textBox";
59textBox.Width=200;
60button=newHtmlInputButton();
61button.ID="button";
62button.Value="查询";
63clear=newHtmlInputButton();
64clear.ID="clear";
65clear.Value="清除结果";
66selLayers=newHtmlSelect();
67selLayers.ID="sellayer";
68Controls.Add(selLayers);
69Controls.Add(textBox);
70Controls.Add(button);
71Controls.Add(clear);
72
73stringargument=string.Format("'args='+document.getElementById('{0}').value",selLayers.ClientID);
74argument+=string.Format("+':'+strTrim(document.getElementById('{0}').value)",textBox.ClientID);
75
76stringonClick=string.Format("executeTask({0},\"{1}\");",argument,base.CallbackFunctionString);
77//调用SearchMapIdentity.js里的clearIdentifyDiv函数,清楚上一次查询产生的div78onClick+="clearIdentifyDiv();";
79stringonKeyDown=string.Format("if(event.keyCode==13){{{0}returnfalse;}}",onClick);
80button.Attributes.Add("onclick",onClick);
81//点击clear按钮时,调用清除查询结果的js函数82clear.Attributes.Add("onclick","clearIdentifyDiv()");
83textBox.Attributes.Add("onkeydown",onKeyDown);
84
85
86//调用填充下拉框函数87FillLayerSelect();
88}
89#endregion
90
91#regionOnLoad—初始化一些初始变量
92protectedoverridevoidOnLoad(EventArgse)
93{
94base.OnLoad(e);
95//进行相关属性检查96if(this.QueryField=="")
97{
98thrownewException("QueryField属性未设置");
99}
100
101Regexregex=newRegex("^(\\S+:\\S+;)+$");
102if(this.ReadFileds=="")
103{
104thrownewException("ReadFileds属性未设置");
105}
106elseif(!regex.IsMatch(this.ReadFileds))
107{
108thrownewException("ReadFileds格式不正确,请查看描述后修改!");
109}
110
111this.MapInstance.ScaleChanged+=newMapScaleChangeEventHandler(Map_ScaleChanged);
112searchMapIdentity=newSearchMapIdentity(this.MapInstance);
113searchMapIdentity.QueryField=this.QueryField;
114searchMapIdentity.ReadFields=this.ReadFileds;
115//searchMapIdentity.SetupIdentify();116if(this.Page.Session["MapPoints"]!=null)
117{
118searchMapIdentity.MapPoints=this.Page.Session["MapPoints"]asArrayList;
119}
120}
121#endregion
122
123#regionOnPreRender-加载客户端脚本和设置属性
124
125protectedoverridevoidOnPreRender(EventArgse)
126{
127base.OnPreRender(e);
128if(this.Page!=null)
129{
130//注册SearchMapIdentity脚本131ClientScriptManagerscriptMgr=Page.ClientScript;
132TypecontrolType=this.GetType();
133stringfileName=controlType.Namespace+".SearchMapIdentity.js";
134scriptMgr.RegisterClientScriptResource(controlType,fileName);
135//注册回调的字符串136System.Text.StringBuildersb=newSystem.Text.StringBuilder();
137sb.Append("<scriptlanguage=\"javascript\"type=\"text/javascript\">varMapSearchIdentifyCallbackStr=\""+base.CallbackFunctionString+"\";</script>\n");
138if(!Page.ClientScript.IsClientScriptBlockRegistered("MapSearchIdentify"))
139Page.ClientScript.RegisterClientScriptBlock(Page.GetType(),"MapSearchIdentify",sb.ToString());
140}
141}
142#endregion
143
144#region回调处理函数
145//得到传递进来的参数,赋给base.Input146publicoverridestringGetCallbackResult()
147{
148NameValueCollectionkeyValCol1=CallbackUtility.ParseStringIntoNameValueCollection(_callbackArg);
149if(keyValCol1["EventArg"]=="executeTask")
150{
151stringsInArgs=keyValCol1["args"];
152stringdelim=":";
153char[]delchar=delim.ToCharArray();
154string[]args=sInArgs.Split(delchar);
155object[]inputs=newobject[2];
156inputs[0]=args[0];
157inputs[1]=args[1];
158base.Input=inputs;
159}
160elseif(keyValCol1["EventArg"]=="startTaskActivityIndicator")
161{
162}
163elseif(keyValCol1["EventArg"]=="hidden")
164{
165}
166//自己添加的分支,用户处理点击小图片是的回发处理167elseif(keyValCol1["EventArg"]=="ShowInfoWin")
168{
169doubleMapX=Convert.ToDouble(keyValCol1["MapX"]);
170doubleMapY=Convert.ToDouble(keyValCol1["MapY"]);
171stringcontent=keyValCol1["Content"];
172searchMapIdentity.DrawInfoWin(MapX,MapY,content);
173returnthis.MapInstance.CallbackResults.ToString();
174}
175returnbase.GetCallbackResult();
176}
177#endregion
178
179#region执行TASK
180publicoverridevoidExecuteTask()
181{
182if(Input==null)return;
183object[]inputs=Inputasobject[];
184stringselLayer=inputs[0]asstring;
185stringqueryTxt=(string)inputs[1];
186ViewState["selLayer"]=selLayer;
187ViewState["queryTxt"]=queryTxt;
188searchMapIdentity.QueryText=queryTxt;
189searchMapIdentity.Identify(true,selLayer);
190DataTabledatatable=searchMapIdentity.QueryResultasDataTable;
191DataSetds=newDataSet();
192ds.Tables.Add(datatable);
193ds.DataSetName="查询"+queryTxt+"的结果为:";
194Page.Session["MapPoints"]=searchMapIdentity.MapPoints;
195base.Results=ds;
196}
197#endregion
198
199#region处理依赖资源
200publicoverrideList<GISResourceItemDependency>GetGISResourceItemDependencies()
201{
202thrownewException("Themethodoroperationisnotimplemented.");
203}
204#endregion
205
206#region渲染控件格式
207protectedoverridevoidRenderContents(HtmlTextWriterwriter)
208{
209writer.RenderBeginTag(HtmlTextWriterTag.Table);
210
211writer.RenderBeginTag(HtmlTextWriterTag.Tr);
212writer.RenderBeginTag(HtmlTextWriterTag.Td);
213this.selLayers.RenderControl(writer);
214writer.RenderEndTag();
215writer.RenderEndTag();
216
217writer.RenderBeginTag(HtmlTextWriterTag.Tr);
218writer.AddStyleAttribute(HtmlTextWriterStyle.WhiteSpace,"nowrap");
219writer.RenderBeginTag(HtmlTextWriterTag.Td);
220if(!string.IsNullOrEmpty(this.Inputasstring))
221{
222this.textBox.Text=this.Inputasstring;
223}
224else
225{
226this.textBox.Text="";
227}
228this.textBox.RenderControl(writer);
229writer.RenderEndTag();
230writer.RenderEndTag();
231
232writer.RenderBeginTag(HtmlTextWriterTag.Tr);
233writer.RenderBeginTag(HtmlTextWriterTag.Td);
234this.button.RenderControl(writer);
235writer.Write("");
236this.clear.RenderControl(writer);
237writer.RenderEndTag();
238writer.RenderEndTag();
239
240writer.RenderEndTag();
241}
242#endregion
243
244#region辅助函数
245Map_map=null;
246TaskResults_taskResults=null;
247privateMapMapInstance
248{
249get
250{
251if(_map==null)
252{
253for(inti=0;i<base.TaskResultsContainers.Count;i++)
254{
255_taskResults=Utility.FindControl(TaskResultsContainers[i].Name,Page)asTaskResults;
256if(_taskResults!=null&&_taskResults.Map!=null&&_taskResults.Map.Length>1)
257{
258_map=Utility.FindControl(_taskResults.Map,this.Page)asMap;
259}
260if(_map!=null)
261break;
262}
263}
264return_map;
265}
266}
267
268privateTaskResultsgetTaskResults()
269{
270if(_taskResults==null)
271_map=MapInstance;
272return_taskResults;
273}
274
275//填充selLayers下拉框276privatevoidFillLayerSelect()
277{
278ListItemlayerItem;
279IMapFunctionalitymf=MapInstance.GetFunctionality(0);
280if(mf==null)
281{
282layerItem=newListItem("<nolayersfound>","null");
283selLayers.Items.Add(layerItem);
284return;
285}
286IGISResourcegisresource=mf.Resource;
287boolsupported=gisresource.SupportsFunctionality(typeof(IQueryFunctionality));
288selLayers.Items.Clear();
289if(supported)
290{
291IQueryFunctionalityqfunc=gisresource.CreateFunctionality(typeof(IQueryFunctionality),null)asIQueryFunctionality;
292string[]lids;
293string[]lnames;
294qfunc.GetQueryableLayers(null,outlids,outlnames,ESRI.ArcGIS.ADF.Web.FeatureType.Point);
295inti=0;
296while(i<lnames.Length)
297{
298layerItem=newListItem(lnames[i],lnames[i]);
299selLayers.Items.Add(layerItem);
300i++;
301}
302}
303}
304
305
306#endregion
307
308#region地图比例尺变化以后要执行的函数
309protectedvoidMap_ScaleChanged(objectsender,ESRI.ArcGIS.ADF.Web.UI.WebControls.ScaleEventArgsargs)
310{
311if(Page.IsPostBack||Page.IsCallback)
312{
313if(ViewState["selLayer"]!=null&&ViewState["queryTxt"]!=null)
314{
315searchMapIdentity.QueryText="四川";
316searchMapIdentity.Identify(false,ViewState["selLayer"]asstring);
317}
318}
319}
320#endregion
321
322}
323}

3、SearchMapIdentity.js,主要是些动态创建和定位div的js脚本

1//显示详细信息的服务器回调函数2functionDrawInfowindow(mapX,mapY,content)
3{
4if(mapX==null||mapY==null)return;
5varargument="EventArg=ShowInfoWin&MapX="+mapX+"&MapY="+mapY+"&Content="+content;
6varcontext=Maps["Map1"].controlName;
7eval(MapSearchIdentifyCallbackStr);
8}
9
10
11//删除已经标示的DIV12functionclearIdentifyDiv()
13{
14varo=map.overlayObject
15while(o.hasChildNodes())
16{
17o.removeChild(o.lastChild);
18}
19}
20
21//将图片定位到指定点22functionshowZoomToPoint(x,y,mapX,mapY,content)
23{
24map=Maps["Map1"];
25varpointdiv=document.createElement("div");
26pointdiv.style.position="absolute";
27pointdiv.style.zIndex=2;
28//pointisbottomcenter...2pixelsupforshadow29varcWidth=Math.floor(pointdiv.clientWidth/2);
30varcHeight=pointdiv.clientHeight;
31if(cWidth==0)cWidth=20;
32if(cHeight==0)cHeight=38;
33varidLeft=x-parseInt(map.divObject.style.left)-cWidth/2;
34varidTop=y-parseInt(map.divObject.style.top)-cHeight+2;
35pointdiv.innerHTML='<imgsrc=images/blank.gifalt=""border="0"hspace="0"vspace="0"onclick=\'DrawInfowindow('+mapX+','+mapY+',"'+content+'");\'style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'images/icon_info.png\');cursor:hand;"/>\n';
36map.overlayObject.appendChild(pointdiv);
37pointdiv.style.left=idLeft;
38pointdiv.style.top=idTop;
39returnfalse;
40}
41
42//重新将图片定位到指定点43functionReDrawZommToPoint(x,y,mapX,mapY,content)
44{
45window.setTimeout("showZoomToPoint("+x+","+y+","+mapX+","+mapY+",\'"+content+"\')",1000);
46}
47
48
49//显示详细信息的函数50functionshowInfoWindow(x,y,content)
51{
52vardiv=document.getElementById("InfoWindow");
53if(div==null){
54addInfowindow();
55}
56window.status=content;
57document.getElementById("infowindowTitle").innerHTML="<b><fontcolor='black'>详细信息</font></b>"
58varinfoContentHtml="<fontcolor='black'>"+content+"</font><br>";
59varoNearQuery=document.getElementById("tr_NearQuery");
60
61infoContentHtml+="<spanstyle=\"cursor:hand;\"onclick=\"alert('calljsfunctionsuneed');\"><u>点我吧</u></span>&nbsp;";
62
63document.getElementById("infowindowContent").innerHTML=infoContentHtml;
64vardiv=document.getElementById("InfoWindow");
65varcWidth=Math.floor(div.clientWidth/2);
66varcHeight=div.clientHeight;
67
68if(cWidth==0)cWidth=235;
69if(cHeight==0)cHeight=148;
70varidLeft=x-parseInt(map.divObject.style.left);//-cWidth;71varidTop=y-parseInt(map.divObject.style.top)-cHeight+2;
72window.setTimeout('moveLayer("InfoWindow",'+idLeft+','+idTop+');showLayer("InfoWindow");',0);
73returnfalse;
74
75}
76
77//添加显示信息的div78functionaddInfowindow()
79{
80varcontent="";
81content='<divid="InfoWindow"style="z-index:3;position:absolute;235px;height:148px;left:0px;top:0px;visibility:hidden;overflow:hidden;background-image:url(images/Info.gif);layer-background-image:url(images/Info.gif);border:1pxnone#000000;cursor:default"><tableborder="0"cellpadding="0"cellspacing="0">';
82content+='<tr>';
83content+='<tdvalign="top"><tablewidth="235"border="0"cellspacing="0"cellpadding="0">';
84content+='<tr>';
85content+='<td><tableborder="0"style="overflow:hidden;height:20px;235px;"cellspacing="0"cellpadding="0">';
86content+='<tr>';
87content+='<tdid="infowindowTitle"width="218"style="overflow:hidden;218px;height:20px;font:宋体;font-size:12px;color:black;padding-left:10px;"valign="middle"></td>';
88content+='<tdwidth="17"valign="middle"><imgstyle="cursor:hand;"onclick=\'closeInfoWindow();\'onmouseover="this.src=\'images/close2.png\'"onmouseout="this.src=\'images/close1.png\'"src="http://t.zoukankan.com/images/close1.png"width="8"height="6"/></td>';
89content+='</tr>';
90content+='</table></td>';
91content+='</tr>';
92content+='<tr>';
93content+='<td>';
94content+='<tablealign="center"width="220"border="0"cellspacing="0"cellpadding="0">';
95content+='<tr>';
96content+='<tdbackground="images/h-line.png"style="height:1px;padding:10px"></td>';
97content+='</tr>';
98content+='</table>';
99content+='</td>';
100content+='</tr>';
101content+='<tr>';
102content+='<tdstyle="height:125px;overflow:hidden;"valign="top">';
103content+='<tablewidth="230"style="230px;height:125px;overflow:hidden;"border="0"cellpadding="0"cellspacing="0">';
104content+='<tr>';
105content+='<tdvalign="top">';
106content+='<divid="infowindowContent"style="overflow:hidden;height:75px;230px;font-size:12px;padding-left:10px;padding-top:10px"></div>';
107content+='</td>';
108content+='</tr>';
109content+='</table></td>';
110content+='</tr>';
111content+='</table></td>';
112content+='</tr>';
113content+='</table></div>';
114map.overlayObject.insertAdjacentHTML("BeforeEnd",content);
115}
116
117//关闭显示详细信息的div118functioncloseInfoWindow()
119{
120vardiv=document.getElementById("InfoWindow");
121if(div!=null)
122{
123hideLayer("InfoWindow");
124}
125}
126
127//辅助函数——清除字符串空格128functionstrTrim(s)
129{
130varreg=/(^\s*)|(\s*$)/g;
131varss=s.replace(reg,"");
132returnss;
133}

使用注意事项:

1、要把附件中的图片Info.gif、close1.png、close2.png、h-line.png、icon_info.png拷贝到测试项目的根目录下的images文件夹下面。

2、要在mxd中添加1个以上点图层。

原文:http://dbajun.iteye.com/blog/242763

免责声明:文章转载自《转:利用JavaScript实现图片标注——SearchMapIdentityTask》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[npm CLI文档]配置NPM:package-lock.jsonMySQL的安装、配置文件和初始化下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue+socket实现消息推送

前提:后台已设定好socket消息 首先在vue项目中引入socket。在npm下载socket。 npm install vue-socket.io 当然也可以在index.html中直接插入下面这句,但是最好不要这样做。 <script src='https://cdn.bootcss.com/socket.io/2.0.3/socket.io....

ansible 调试 debug 一介凡人

一、debug模块 1、debug模块是Ansible Playbook中最常用的调试模块,可以在Playbook执行过程打印调试信息,特别是跟when条件语句一起使用时,可以调试特定条件下的执行过程。 比如:当变量 a 定义时,将 a 的值打印出来,当任务成功后,打印执行结果等。 msg:调试输出的消息 var:将某个任务执行的输出作为变量传递给d...

第一课——从main到WinMain

一、Visual C++6.0 由微软公司推出的基于Windows系统的可视化集成开发环境(IDE) 微软公司为其开发了功能强大的MFC(Microsoft Foundation Class,微软基础类库) 开发Windows应用程序的最佳选择 利用类将与用户界面设计有关的Windows API函数封装起来,通过MFC类库的方式提供给开发人员,大大提高了...

【转】 SpringCloudAlibaba之Sentinel流量控制 SpringCloudAlibaba微服务实战教程系列

【转】 SpringCloudAlibaba之Sentinel流量控制 SpringCloudAlibaba微服务实战教程系列 一、认识下Sentinel Sentinel使用流程:微服务会集成Sentinel客户端,从官方下载jar启动作为服务端,在有配置变更和添加的时候Sentinel会发送消息给客户端,进行变更应用。 Sentinel 分为两个部分...

一个消息调度框架构建

基本框架 MDU(消息分发单元):包含一个消息处理任务,包含自身的消息队列,是一个消息调度的基本单位。 PID (功能子模块) :框架中用PID作为模块的划分,每个模块具有自己的PID编号,根据功能和调度需求可以安排多个PID到一个MDU中,PID是消息通信的一个基本单位,每个PID提供一个消息处理入口。 MQ (消息队列) :使用消息队列作为任务通信...

Laravel API 错误处理:当异常时,如何返回消息

Laravel API 错误处理:当异常时,如何返回消息 原文链接:learnku.com/laravel/t/3…讨论请前往专业的 Laravel 开发者论坛:learnku.com/Laravel    基于 API 的项目开发越来越受欢迎,并且使用 Laravel 就能很容易实现。但是在针对如何处理各种异常的话题很少被提及。所以 API 的使用者们...