分享

在程序中使用Virtual Earth的服务

 LibraryPKU 2014-10-14

SilverlightAPI中还包括了一个ESRI.ArcGIS.VirtualEarth.dll类库,让我们可以方便的访问到老东家的 VirtualEarth服务。目前SilverlightAPI中提供的VirtualEarth服务有三种:Map,Geocode和 Routing,不过一看就知道后两种服务对于国内的数据来说又无缘了。
        直接看如何使用它的Map服务获取地图数据吧。同前,新建一个Silverlight工程,添加ESRI.ArcGIS.dll和 ESRI.ArcGIS.VirtualEarth.dll的引用,引入xml命名空间,在xaml里面这样写:

  1. <esri:Map x:Name="Map1" Loaded="Map1_Loaded">
  2.             <esri:Map.Layers>
  3.                 <esriVE:TileLayer ID="VELayer" LayerStyle="AerialWithLabels" ServerType="Staging"/>
  4.             </esri:Map.Layers>
  5.         </esri:Map>
复制代码

可以看出,和添加其他图层基本是一样的。 SIlverlightAPI中针对VE地图的图层类型是TileLayer,LayerStyle有三种:Road,Aerial和 AerialWithLabels,分别对应矢量图,影像图和带街道标注的影像图。ServerType就比较特殊了,有两种:Staging和 Production,分别对应访问VE服务的账户类别,前者是免费的,后者是收费的。如果你此时运行程序的话,那是看不到地图的,因为 TileLayer还有个关键的token属性没有设置。

 

        VE的服务那是相当安全,每次访问VE的服务,都要提供一个token(一个加密字符串)来进行身份验证,而这个token又是根据 TokenService自动生成的,要通过TokenService生成一个token,又需要一个合法的Microsoft Virtual Earth Platformdeveloper account……明白了这个过程,就来做我们的工作吧。

 

        首先,

去申请一个Microsoft Virtual Earth Platform developer account

, 当然之前你还得有一个Windows Live账号。申请的这个账号是Evaluation版的,所以决定了以后我们只能使用Staging的服务,如果要把它变成Production版本, 可以通过邮件联系微软,然后缴费;

 

        之后到注册时所填的邮箱去激活申请的Microsoft Virtual Earth Platform developeraccount账号,然后为其设置密码(必须是8-14为之间,包括大、小写字母,数字,且还要有非字母数字的字符,和windows server2008是一样的),我们平常肯定不会这样设置密码,为了以防万一,建议赶紧把设置好的密码记录下来,

 

没准哪天就忘了。现在就可以用这个账户和密码来访问TokenService,通过它生成token,交给TileLayer的token属性。

 

        为了安全目的考虑,token是不建议也不能直接在Silverlight程序中进行设置的。那么怎么办呢?这样办:1、通过装载 Silverlight的aspx页面的Page_Load方法,来申请我们的token,并把它添加到Silverlight的初始参数中,2、然后当 Silverlight插件载入的时候,把token读出来,3、在Map_Loaded事件中,赋给TileLayer。

 

1、通过TokenService申请token:

 

在webapp中add webreference,url用

https://staging.common./find-30/common.asmx?wsdl

, 起个名字叫VirtualEarthService.TokenService。

  1. <script language="C#" runat="Server">
  2.     private string VEAccountID = "你的ID(注意只是AccountID)"; 
  3. private string VEAccountPassword="你的密码";
  •    
  •     protected void Page_Load(object sender,EventArgs e)
  •     {
  •  
  • _08_virtual_earth.Web.VirtualEarthService.TokenService.CommonService
  • commenservice = new
  • _08_virtual_earth.Web.VirtualEarthService.TokenService.CommonService();
  •         
  •         commenservice.Credentials = new System.Net.NetworkCredential(VEAccountID, VEAccountPassword);
  •  
  •  
  • _08_virtual_earth.Web.VirtualEarthService.TokenService.TokenSpecification
  • tokenSpec=new
  • _08_virtual_earth.Web.VirtualEarthService.TokenService.TokenSpecification();
  •         tokenSpec.TokenValidityDurationMinutes=480;
  •         if (HttpContext.Current!=null && !HttpContext.Current.Request.IsLocal)
  •         {
  •             tokenSpec.ClientIPAddress=HttpContext.Current.Request.UserHostAddress;
  •         }
  •         else
  •         {
  •             tokenSpec.ClientIPAddress="127.0.0.1";
  •         }
  •         
  •         string token = "";
  •         token = commenservice.GetClientToken(tokenSpec);
  •  
  •         Xaml1.InitParameters = string.Format("token={0}", token);
  •     }
  • </script>
  • 复制代码

    其中Xaml1是Silverlight插件的 ID:<asp:Silverlight ID="Xaml1" runat="server"...

     

    2、Silverlight插件载入时读出这个token。在App.xaml.cs中:

    1. private void Application_Startup(object sender, StartupEventArgs e)
    2.         {
    3.             VEtoken = e.InitParams["token"];
    4.             this.RootVisual = new Page();
    5.         }
    复制 代码

    3、最后在加载地图控件后,交付token:

    1. private void Map1_Loaded(object sender, RoutedEventArgs e)
    2.         {
    3.             foreach (Layer layer in Map1.Layers)
    4.                 if (layer is TileLayer)
    5.                     (layer as TileLayer).Token = (Application.Current as App).VEtoken;
    6.         }
    复制 代码

    终于能看见VE的图了。当然,我们的开发账户是免费的,所以地图上有很多“Staging”麻点(每个tile一个):

     

    08_ve.jpg


    1.  

      本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
      转藏 分享 献花(0

      0条评论

      发表

      请遵守用户 评论公约

      类似文章 更多