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

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

概述平台:Vs 2010,Blend 4,Silverlight 4 调用API: ArcGis for Silverligth API(ESRI.ArcGIS.Client) 本来准备晚上或下午写的,早上公司服务器挂了,地图服务用不了干脆就来写一点吧!有个朋友问我动态配置 WebService,Wcf服务的问题,正好也把这个一并写了!   好了不说废话了,进下正题。   先来看一下如何动态的配置We

平台:Vs 2010,Blend 4,Silverlight 4

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


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

 

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

 

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

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

  <SPAN style="Font-FAMILY: 宋体; Font-SIZE: 12pt">    /// <summary>             /// 动态引用WebServices              /// </summary>             /// <returns></returns>             public Service.typhoonServiceSoapClIEnt GetDynamicclIEnt()              {                  BasichttpBinding binding = new BasichttpBinding(                      Application.Current.Host.source.Equals("https") ? BasichttpSecurityMode.Transport : BasichttpSecurityMode.None);          // 这里可以设置你接收消息的大小,为int最大值                  binding.MaxReceivedMessageSize = int.MaxValue;                  binding.MaxBufferSize = int.MaxValue;                            EndpointAddress clIEnt;                  if (webServicePath == String.Empty)                  {                      try                      {                          ScriptObject myScript = HTMLPage.Window.GetProperty("GetWebServiceUrl") as ScriptObject;                          webServicePath = myScript.InvokeSelf("typhoonSL").ToString();                               clIEnt = new EndpointAddress(webServicePath);                      }                      catch                      {                          clIEnt = new EndpointAddress("http://localhost:7629/typhoonService.asmx");                      }                  }                  else                  {                      clIEnt = new EndpointAddress(webServicePath);                  }                       return new Service.typhoonServiceSoapClIEnt(binding, clIEnt);              }      </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函数。


 

      <SPAN style="Font-FAMILY: 宋体; Font-SIZE: 12pt"><script type="text/JavaScript">               //获取WebService地址                function GetWebServiceUrl(args) {                    var a = '';                             if (args.toString() == 'typhoonSL') {                        a = '<%=GetAppSetting("typhoonSL")%>';                    }                             return a;                }              </script>         </SPAN>       
 


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


 


      <SPAN style="Font-FAMILY: 宋体; Font-SIZE: 12pt">        /// <summary>                 /// 获取配置字串                  /// </summary>                 /// <param name="key">字段名称</param>                 /// <returns>配置字串</returns>                 public static string GetAppSetting(string key)                  {                      try                      {                          if (key != null)                          {                              return System.Configuration.ConfigurationSettings.AppSettings[key].ToString();                          }                          else                          {                              return String.Empty;                          }                      }                      catch                      {                          return String.Empty;                      }                  }</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差不多。我简单发下他们的代码:


  <SPAN style="Font-FAMILY: 宋体; Font-SIZE: 12pt">   /// <summary>             /// 添加底图              /// </summary>             private voID TiledLayerInit()              {                  ArcGISTiledMapServiceLayer tiledLayer = new ArcGISTiledMapServiceLayer();                  ArcGISTiledMapServiceLayer imageLayer = new ArcGISTiledMapServiceLayer();                  try                  {                      ScriptObject myScr = HTMLPage.Window.GetProperty("GetSLTiledLayer") as ScriptObject;                      string url = myScr.InvokeSelf("TiledLayer").ToString();                      tiledLayer.Url = url;                  }                  catch (Exception ex)                  {                      MessageBox.Show("请配置 Gis 底图!" + ex.ToString(), "温馨提示", MessageBoxbutton.OK);                  }                  finally                  {                     // tiledLayer.Url = "http://demo.augow.com/ArcGIS/rest/services/Map001/World/MapServer";                  }                  imageLayer.Url = "http://services.arcgisonline.com/ArcGIS/rest/services/NGS_topo_US_2D/MapServer";                       tiledLayer.ID = "StreetMapLayer";                  imageLayer.ID = "ImageMapLayer";                              myMap.Layers.Add(tiledLayer);                  myMap.Layers.Add(imageLayer);                                myMap.Layers["ImageMapLayer"].Visible = false;              }      </SPAN>   

 

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


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


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


继续看承载页面JavaScript代码:


  <SPAN style="Font-FAMILY: 宋体; Font-SIZE: 12pt">  <script type="text/JavaScript">                //获取            function GetSLTiledLayer(key) {                if (key.toString() == 'TiledLayer') {                    var a = '<%=GetAppSetting("TiledLayer")%>';                }                     return a;            }      </script>     </SPAN>   

 

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


Web.Config中的配置:


 

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

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


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

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

总结

以上是内存溢出为你收集整理的ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等(二)--Silverlight 配置动态的 webService、动态加载ArcGis地图服务全部内容,希望文章能够帮你解决ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等(二)--Silverlight 配置动态的 webService、动态加载ArcGis地图服务所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1018260.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存