微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等(二)--Silverlight 配置动态的 webService、动态加载ArcGis地图服务

平台:Vs 2010,Blend 4,Silverlight 4

调用API: ArcGis for Silverligth API(ESRI.ArcGIS.Client)


本来准备晚上或下午写的,早上公司服务器挂了,地图服务用不了干脆就来写一点吧!有个朋友问我动态配置 WebService,Wcf服务的问题,正好也把这个一并写了!

 

好了不说废话了,进下正题。

 

先来看一下如何动态的配置WebService,Wcf 服务,实现方式:从 Web.Config 文件中读取地址,然后在 Silverlight 实现绑定。

首先我们还是添加服务引用,引用远程或本机的Web服务。然后在 silverlight 加下以下代码

 
 
  1. <SPAN style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt">    /// <summary> 
  2.         /// 动态引用WebServices  
  3.         /// </summary> 
  4.         /// <returns></returns> 
  5.         public Service.typhoonServiceSoapClient GetDynamicclient()  
  6.         {  
  7.             BasicHttpBinding binding = new BasicHttpBinding(  
  8.                 Application.Current.Host.source.Equals("https") ? BasicHttpSecurityMode.Transport : BasicHttpSecurityMode.None);  
  9.     // 这里可以设置你接收消息的大小,为int最大值  
  10.             binding.MaxReceivedMessageSize = int.MaxValue;  
  11.             binding.MaxBufferSize = int.MaxValue;  
  12.  
  13.  
  14.             EndpointAddress client;  
  15.             if (webServicePath == String.Empty)  
  16.             {  
  17.                 try  
  18.                 {  
  19.                     ScriptObject myScript = HtmlPage.Window.GetProperty("GetWebServiceUrl") as ScriptObject;  
  20.                     webServicePath = myScript.InvokeSelf("typhoonSL").ToString();  
  21.  
  22.                     client = new EndpointAddress(webServicePath);  
  23.                 }  
  24.                 catch  
  25.                 {  
  26.                     client = new EndpointAddress("http://localhost:7629/typhoonService.asmx");  
  27.                 }  
  28.             }  
  29.             else  
  30.             {  
  31.                 client = new EndpointAddress(webServicePath);  
  32.             }  
  33.  
  34.             return new Service.typhoonServiceSoapClient(binding, client);  
  35.         }  
  36. </SPAN> 

 

 

注意把 public Service.typhoonServiceSoapClient GetDynamicclient() 这行改成你自己的服务实例也就是改 Service.typhoonServiceSoapClient,

同样也要改最后一行的 return new Service.typhoonServiceSoapClient(binding,client);


大家可能注意到上面的两句话。

  ScriptObject myScript = HtmlPage.Window.GetProperty("GetWebServiceUrl") as ScriptObject;

webServicePath = myScript.InvokeSelf("typhoonSL").ToString();

这里的 HtmlPage.Window.GetProperty("GetWebServiceUrl"),表示外部 JavaScript 方法,也就是承载 Silverlight 页面中的JavaScript函数

webServicePath是一个全局的string型变量,是用来保存WebService地址。

 myScript.InvokeSelf("typhoonSL").ToString();是表示调用外部JavaScript方法并传一个值"typhoonSL"进去.


好Silverlight程序里大功告成,我们看下承载 Silverlight 页面中的JavaScript函数


 

   
   
  1. <SPAN style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt"><script type="text/javascript"> 
  2.       //获取WebService地址  
  3.       function GetWebServiceUrl(args) {  
  4.           var a = '';  
  5.  
  6.           if (args.toString() == 'typhoonSL') {  
  7.               a = '<%=GetAppSetting("typhoonSL")%>';  
  8.           }  
  9.  
  10.           return a;  
  11.       }  
  12.     </script> 
  13. </SPAN> 
 


里面有个托管代码函数GetAppSetting();我们看下他的代码:


 


   
   
  1. <SPAN style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt">        /// <summary> 
  2.         /// 获取配置字串  
  3.         /// </summary> 
  4.         /// <param name="key">字段名称</param> 
  5.         /// <returns>配置字串</returns> 
  6.         public static string GetAppSetting(string key)  
  7.         {  
  8.             try  
  9.             {  
  10.                 if (key != null)  
  11.                 {  
  12.                     return System.Configuration.ConfigurationSettings.AppSettings[key].ToString();  
  13.                 }  
  14.                 else  
  15.                 {  
  16.                     return String.Empty;  
  17.                 }  
  18.             }  
  19.             catch  
  20.             {  
  21.                 return String.Empty;  
  22.             }  
  23.         }</SPAN> 

我们看他了他调用ConfigurationSettings.AppSetting中的key.那再来看下他调用的Web.Config文件中的节点:


 

 
1 <SPAN style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt"><appSettings><add key="typhoonSL" value="http://localhost:7629/typhoonService.asmx"/<SPAN style="LINE-HEIGHT: 17px">></appSettings></SPAN></SPAN>

 

 

这样动态的WebService、Wcf调用就完成了!



然后就是动态调用地图,其实和动态调用WebService、Wcf差不多。我简单发下他们的代码


 
 
  1. <SPAN style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt">   /// <summary> 
  2.         /// 添加底图  
  3.         /// </summary> 
  4.         private void TiledLayerInit()  
  5.         {  
  6.             ArcGISTiledMapServiceLayer tiledLayer = new ArcGISTiledMapServiceLayer();  
  7.             ArcGISTiledMapServiceLayer imageLayer = new ArcGISTiledMapServiceLayer();  
  8.             try  
  9.             {  
  10.                 ScriptObject myScr = HtmlPage.Window.GetProperty("GetSLTiledLayer") as ScriptObject;  
  11.                 string url = myScr.InvokeSelf("TiledLayer").ToString();  
  12.                 tiledLayer.Url = url;  
  13.             }  
  14.             catch (Exception ex)  
  15.             {  
  16.                 MessageBox.Show("请配置 Gis 底图!" + ex.ToString(), "温馨提示", MessageBoxButton.OK);  
  17.             }  
  18.             finally  
  19.             {  
  20.                // tiledLayer.Url = "http://demo.augow.com/ArcGIS/rest/services/Map001/World/MapServer";  
  21.             }  
  22.             imageLayer.Url = "http://services.arcgisonline.com/ArcGIS/rest/services/NGS_Topo_US_2D/MapServer";  
  23.  
  24.             tiledLayer.ID = "StreetMapLayer";  
  25.             imageLayer.ID = "ImageMapLayer";  
  26.         
  27.             myMap.Layers.Add(tiledLayer);  
  28.             myMap.Layers.Add(imageLayer);  
  29.           
  30.             myMap.Layers["ImageMapLayer"].Visible = false;  
  31.         }  
  32. </SPAN> 

 

我的代码调用了两个地图层,两个都是 ArcGisTiledMapServiceLayer,这是切片的ArcGis地图服务,也就是把图片切成一块一块,然后下载到客户端来显示


我们同样看到了 HtmlPage.Window.GetProperty("GetSLTiledLayer") as ScriptObject; 这行代码调用外部 JavaScript 代码获取切片服务的 Url。


设置了tiledLayer和imageLayer的Url后我们再设置下他们的 ID号,然后在我们的 Map实例中(也就是myMap)把他们加到地图层上来,然后这两个层就显示在地图上了。


继续看承载页面JavaScript代码


 
 
  1. <SPAN style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt">  <script type="text/javascript"> 
  2.  
  3.       //获取  
  4.       function GetSLTiledLayer(key) {  
  5.           if (key.toString() == 'TiledLayer') {  
  6.               var a = '<%=GetAppSetting("TiledLayer")%>';  
  7.           }  
  8.  
  9.           return a;  
  10.       }  
  11. </script> 
  12. </SPAN> 

 

GetAppSetting方法和上面给出的托管代码一样。


Web.Config中的配置:


 

   
   
  1. <SPAN style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt"><appSettings> 
  2.         <add key="TiledLayer" value="http://bbs.gao00.com/ArcGIS/rest/services/Map001/World/MapServer"/> 
  3.         <add key="typhoonSL" value="http://localhost:7629/typhoonService.asmx"/> 
  4.     </appSettings> 
  5. </SPAN> 
 

这时候我们就把动态服务和动态地图都配置好了!


纠结了半天的排版,我还是决定放弃了,本来想写那个ElementLayer在ArcGis上显示Silverlight原生元素了,我最终还是被博客园这个文字排版小工具给打败了,可能是我不太会用吧!下一讲再写那个东西吧!

转自:http://www.cnblogs.com/Royal_WH/archive/2010/11/04/1868873.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐