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 加下以下代码

 

 

01<span style="font-family: 宋体; font-size: 12pt;">    /// <summary>
02        /// 动态引用WebServices
03        /// </summary>
04        /// <returns></returns>
05        public Service.TyphoonServiceSoapClient GetDynamicClient()
06        {
07            BasicHttpBinding binding = new BasicHttpBinding(
08                Application.Current.Host.Source.Equals("https") ? BasicHttpSecurityMode.Transport : BasicHttpSecurityMode.None);
09    // 这里可以设置你接收消息的大小,为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函数。


01<span style="font-family: 宋体; font-size: 12pt;"><script type="text/javascript">
02      //获取WebService地址
03      function GetWebServiceUrl(args) {
04          var a = '';
05 
06          if (args.toString() == 'TyphoonSL') {
07              a = '<%=GetAppSetting("TyphoonSL")%>';
08          }
09 
10          return a;
11      }
12    </script>
13</span>

 

 


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


01<span style="font-family: 宋体; font-size: 12pt;">        /// <summary>
02        /// 获取配置字串
03        /// </summary>
04        /// <param name="key">字段名称</param>
05        /// <returns>配置字串</returns>
06        public static string GetAppSetting(string key)
07        {
08            try
09            {
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差不多。我简单发下他们的代码:


 

01<span style="font-family: 宋体; font-size: 12pt;">   /// <summary>
02        /// 添加底图
03        /// </summary>
04        private void TiledLayerInit()
05        {
06            ArcGISTiledMapServiceLayer tiledLayer = new ArcGISTiledMapServiceLayer();
07            ArcGISTiledMapServiceLayer imageLayer = new ArcGISTiledMapServiceLayer();
08            try
09            {
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            }
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代码:


 

01<span style="font-family: 宋体; font-size: 12pt;">  <script type="text/javascript">
02 
03      //获取
04      function GetSLTiledLayer(key) {
05          if (key.toString() == 'TiledLayer') {
06              var a = '<%=GetAppSetting("TiledLayer")%>';
07          }
08 
09          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>

 

 

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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值