【原创】客户端添加兴趣点,并随地图变化而变化

很多时候我们需要在某些图层的点添加一些热点,以供在客户端点击之后显示一些信息或者弹出像Google那样的气泡。
这个热点(兴趣点)在客户端可以用div或者img表示,而且还可以解决在Map控件上显示gif和flash动画的问题。

1 首先在客户端定义好一个div,并将其设置为不可见,位置类型设为绝对。

None.gif < div id = " Typhoon_GIF "  style = " position:absolute; visibility:hidden; " >
None.gif        
< img src = " images/taif.gif "   />
None.gif
</ div >

2.取得图层中的点的位置,并将其转换为屏幕位置

None.gif // 取得ArcGIS Server ArcObjects 点
None.gif
public  ESRI.ArcGIS.Geometry.IPoint GetTyphoonPoint(ESRI.ArcGIS.ADF.Web.UI.WebControls.MapResourceManager MapResourceManager1)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif
InBlock.gif            ESRI.ArcGIS.Server.IServerContext mapContext 
= GetServerContext(MapResourceManager1);  //取得ServerContext
InBlock.gif

InBlock.gif            ESRI.ArcGIS.Geodatabase.IWorkspaceFactory wsf 
= mapContext.CreateObject("esriDataSourcesFile.ShapefileWorkspaceFactory"as ESRI.ArcGIS.Geodatabase.IWorkspaceFactory;
InBlock.gif
InBlock.gif            ESRI.ArcGIS.Geodatabase.IFeatureWorkspace fws 
= wsf.OpenFromFile("C:\\xiamen\\Typhoon"0as ESRI.ArcGIS.Geodatabase.IFeatureWorkspace ;  //TryCast是不引发异常的类型转换操作
InBlock.gif
            ESRI.ArcGIS.Geodatabase.IFeatureClass pFC  = fws.OpenFeatureClass("Typhoon");
InBlock.gif
InBlock.gif            ESRI.ArcGIS.Geometry.IPolyline line 
= pFC.GetFeature(0).Shape as ESRI.ArcGIS.Geometry.IPolyline ;
InBlock.gif
InBlock.gif            ESRI.ArcGIS.Geometry.IPoint point 
= line.ToPoint;
InBlock.gif            
//mapContext.ReleaseContext()
InBlock.gif

InBlock.gif            
return point;
ExpandedBlockEnd.gif        }

None.gif
// 将AO点转换为Screen点,Screen点的坐标值是以Map控件的左上角为坐标原点计算的。
None.gif
public  System.Double[] GetTyphoonScreenPoint(ESRI.ArcGIS.ADF.Web.Geometry.Envelope env, ESRI.ArcGIS.ADF.Web.UI.WebControls.MapResourceManager MapResourceManager1,ESRI.ArcGIS.ADF.Web.UI.WebControls.Map Map1)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
//获取图层中的点
InBlock.gif
            ESRI.ArcGIS.Geometry.IPoint point = GetTyphoonPoint(MapResourceManager1);
InBlock.gif            
//转换为ADF的点
InBlock.gif
            ESRI.ArcGIS.ADF.Web.Geometry.Point  adf_point = ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.Converter.FromIPoint(point);
InBlock.gif
InBlock.gif            
InBlock.gif            
//转换为屏幕坐标,它是相对与Map的左上角的坐标值
InBlock.gif
            System.Drawing.Point screen_point = adf_point.ToScreenPoint(env, System.Convert.ToInt32(Map1.Width.Value), System.Convert.ToInt32(Map1.Height.Value));
ExpandedSubBlockStart.gifContractedSubBlock.gif            Double[] rate 
= dot.gif{ screen_point.X, screen_point.Y };
InBlock.gif            
return rate;
ExpandedBlockEnd.gif        }

3.添加Map控件的ExtentChanged事件代码

None.gif // -------------------------------------------------------
None.gif
     protected   void  Map1_ExtentChanged( object  sender, ESRI.ArcGIS.ADF.Web.UI.WebControls.ExtentEventArgs args)
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        String script;
InBlock.gif
InBlock.gif        Double[] rate 
= util.GetTyphoonScreenPoint(args.NewExtent, MapResourceManager1, Map1);
InBlock.gif        
if (rate[0<= 0 || rate[1<= 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            script 
+= "document.getElementById('Typhoon_GIF').style.visibility='hidden';";
ExpandedSubBlockEnd.gif        }

InBlock.gif        
else 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            script 
+= "document.getElementById('Typhoon_GIF').style.visibility='visible';showTyphoon(" + rate[0].ToString() + "," + rate[1].ToString() + ");";
ExpandedSubBlockEnd.gif        }

InBlock.gif        
InBlock.gif        ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult s 
= new ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult(nullnull"javascript", script);
InBlock.gif        Map1.CallbackResults.Add(s);
ExpandedBlockEnd.gif    }

4.添加客户端处理代码

None.gif function showTyphoon(x,y)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
//将坐标值转化为数值型
InBlock.gif
            var ratex=parseFloat(x);
InBlock.gif            var ratey
=parseFloat(y);
InBlock.gif            
InBlock.gif            var map
=document.getElementById("Map1");
InBlock.gif            
InBlock.gif            
//Map的位置
InBlock.gif
            var mapx=getLeft(map);
InBlock.gif            var mapy
=getTop(map);
InBlock.gif            
InBlock.gif            var img
=document.getElementById("Typhoon_GIF");
InBlock.gif            
InBlock.gif            imgw
=img.clientWidth;
InBlock.gif            imgh
=img.clientHeight;
InBlock.gif            
InBlock.gif            img.style.top
=ratey+mapy-Math.round(imgh/2)+"px";
InBlock.gif            img.style.left
=ratex+mapx-Math.round(imgw/2)+"px";
ExpandedBlockEnd.gif        }

None.gif
// 获取元素的纵坐标
None.gif
        function getTop(e)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            var offset
=e.offsetTop;
InBlock.gif            
if(e.offsetParent!=null) offset+=getTop(e.offsetParent);
InBlock.gif            
return offset;
ExpandedBlockEnd.gif        }

None.gif        
// -----------------------------
None.gif        
// 获取元素的横坐标
None.gif
        function getLeft(e)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            var offset
=e.offsetLeft;
InBlock.gif            
if(e.offsetParent!=null) offset+=getLeft(e.offsetParent);
InBlock.gif            
return offset;
ExpandedBlockEnd.gif        }

效果图


 

转载于:https://www.cnblogs.com/danni5678/archive/2008/05/10/1190893.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值