初探Dallas


Dallas项目(现改为Windows Azure Marketplace)是微软提供的数据交易和分享平台。通俗一些来讲,即能够让数据提供商通过Dallas平台暴露出API让数据消费者以OData协议操作数据。目前Dallas尚处于CPT阶段。有兴趣的读者可以免费试用。例如如果想要获取美国火星探测行动拍摄到的图片,可以访问下面的链接,点击Trial按钮,然后按照提示进一步操作:

http://pinpoint.microsoft.com/en-US/PartnerDetails.aspx?PartnerId=12884901889&ProductId=12884902246&CurrentTab=1(现以改为https://datamarket.azure.com/

 

本文将从数据消费者的角度来引导读者消费Dallas上的数据。

订阅服务

首先,请进入上面的链接点击Trial按钮,按照提示操作,当你看到下面的页面时,在Catalog面板下找到感兴趣的数据然后点击Subscribe按钮订阅:

在本文中,我们将使用Weather Central数据服务。该服务能够提供气象预报,历史气象数据等信息。点击Subscribe按钮订阅,确保显示为Already subscribed:

所有已经订阅的服务将会出现在Subscriptions面板下:

 

浏览服务细节

点击服务的标题,进入到下一页面:

在这个页面中我们可以通过Web UI来浏览某些数据(对于某些格式数据不能显示,比如image)。作为数据消费者,我们需要关心的主要是三个地方。第一个是Account Key,第二个是Unique User ID。他们相当于访问服务的用户名和密码。在我们调用API的时候需要提供。另外一个地方是下方的下载按钮(对于非C#语言开发人员需要关心下载链接上方关于HTTP头和URL的说明以便调用服务)。我们可以通过点击这个按钮下载到客户端代理类,能够方便我们调用API。需要指出的是,由于API实际上是按照OData协议的规定发送HTTP请求,因此跟开发语言甚至操作系统都是无关的。只是当前CTP阶段我们只提供C#版本的代理类代码。

编写程序

下载完代理类后,我们新建一个WPF程序,并加入该代理类文件。在XAML中加入一个Canvas,并在Canvas中加入一个Image控件:

<Image  Canvas.Left=”10″ Canvas.Top=”34″ Height=”262″ Name=”image1″ Stretch=”Uniform”  Width=”501″ />

 在MainWindow.xaml.cs中引用命名空间:

using Microsoft.Dallas.Services;

并且加入代码:

public partial class MainWindow : Window

    {

        const string accountkey = “7qg7j7pCPFaKvVY2u5CjBey6EnuZGAXjPHSv1gKCNyM=”;

        const string guid = “5a00d570-d837-40e1-98d8-e2c7827e46f2”;

        TilesService t = new TilesService(accountkey,new Guid(guid));

        public MainWindow()

        {

            InitializeComponent();

            this.Loaded += new RoutedEventHandler(MainWindow_Loaded);

 

        }

 

        void MainWindow_Loaded(object sender, RoutedEventArgs e)

        {

           

            var stream = t.Invoke(“Temperature”, “032”, DateTime.UtcNow.ToString(“yyyy-MM-ddThh:mm:ss”), “1”);

        

            PngBitmapDecoder pngdecoder = new PngBitmapDecoder(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);

            BitmapFrame bf = pngdecoder.Frames[0];

            Dispatcher.BeginInvoke(DispatcherPriority.Normal, new ThreadStart(() =>

            {

              

                this.image1.Source = bf;

 

            }));

          

 

        }

}

 

按F5运行程序。我们将能得到当前时间美国东部地区的温度图:

由于该服务还提供了其他图片,我们改写代码为:

var stream = t.Invoke(“Clouds”, “032”, DateTime.UtcNow.ToString(“yyyy-MM-ddThh:mm:ss”), “1”);

 即能够得到当前时间美国东部地区的云层图。注意最后一个参数为1表示去除掉大海的部分:

注:该服务的当前版本只提供部分美国地区的气象图片信息,边界为:

Northwest corner = 55, -140
Northeast = 55, -56
Southwest = 23, -124
Southeast = 23, -72

分析代码

代码中唯一可能让人产生困惑的是代理类中TilesService.Invoke()接收的第二个参数。这里我们使用了032。该值的含义和计算方法请读者参考下面文档中提到的quadkey计算方法:

http://msdn.microsoft.com/en-us/library/bb259689.aspx

 

总结

本文从数据消费者的角度通过一个简单的例子说明了如何消费Dallas的数据。我们可以看到,如果您正在用C#开发程序,您将能够利用提供的代理类很方便地调用API来对数据进行操作。如果您是其他开发语言的使用者,您也可以使用标准的OData协议来发送HTTP请求调用API。在服务细节中给出了调用该API所需要的HTTP头和URL。我们能够在Dallas的帮助下快速地开发出一个很酷的程序,例如一个3D的地球仪:

关于微软Dallas更多问题请参考:

http://blogs.msdn.com/azchina/archive/2010/03/01/dallas.aspx

 

Comments (2)

  1. zzj8704 says:

    不知Clouds,Temperature这些字段信息都是从其raw数据中获取? 将Temperature改成FeelsLike是可以运行并得到图像的。

    另外对于“032”这个bing(  This is the Bing Quad Key value. (Example values: 02131013))是从哪里获取的?

    Raw Data:

    <dailysummary source="forecast" starttime="2010-05-14T18:00:00">

     <title type="text">Weather Central Dataserver API</title>

     <rights>Copyright (c) 2010, Weather Central LLC</rights>

     <location lat="47.65" lon="-122.19">

       <day dayname="Friday" start="2010-05-14T20:00:00" end="2010-05-15T00:00:00">

         <ranges>

           <Temperature unit="C" min="11.4" max="19.9" />

           <FeelsLike unit="C" min="11.4" max="19.8" />

           <DewPoint unit="C" min="9.1" max="10.6" />

           <RelativeHumidity unit="" min="61" max="99" />

           <WindDirection_10m unit="Degrees" min="0" max="6" />

           <WindSpeed_10m unit="m/s" min="1.5" max="2.6" />

           <Clouds unit="" min="5.8" max="9.6" />

           <AccumRainTotal unit="mm" min="0" max="0" />

           <AccumSnowTotal unit="cm" min="0" max="0" />

           <AccumIceTotal unit="mm" min="0" max="0" />

         </ranges>

         <summaries>

           <WindDirection_10m unit="Degrees" summary="N" description="Daily Wind Direction">0</WindDirection_10m>

           <Clouds unit="" summary="mostlycloudy" description="Mostly Cloudy">7.6</Clouds>

           <Icon summary="mostlycloudy" description="Mostly Cloudy " />

         </summaries>

       </day>

       <day dayname="Saturday" start="2010-05-15T01:00:00" end="2010-05-16T00:00:00">

         <ranges>

           <Temperature unit="C" min="8.4" max="22.4" />

           <FeelsLike unit="C" min="8.5" max="22.4" />

           <DewPoint unit="C" min="7.3" max="10.9" />

           <RelativeHumidity unit="" min="43" max="100" />

           <WindDirection_10m unit="Degrees" min="148" max="252" />

           <WindSpeed_10m unit="m/s" min="1.1" max="3.8" />

           <Clouds unit="" min="3.9" max="13.1" />

           <AccumRainTotal unit="mm" min="0" max="0" />

           <AccumSnowTotal unit="cm" min="0" max="0" />

           <AccumIceTotal unit="mm" min="0" max="0" />

         </ranges>

         <summaries>

           <WindDirection_10m unit="Degrees" summary="WSW" description="Daily Wind Direction">248</WindDirection_10m>

           <Clouds unit="" summary="mostlycloudy" description="Mostly Cloudy">7.4</Clouds>

           <Icon summary="mostlycloudy" description="Mostly Cloudy " />

         </summaries>

       </day>

     </location>

    </dailysummary>

  2. 你好,

    关于如何获取quad key,请参考:

    http://msdn.microsoft.com/en-us/library/bb259689.aspx

    是可以通过经纬度经过一系列计算得出的。最后用base-4数表示。

    关于服务的有效参数这个需要看服务的契约。就目前来说我们可以通过Web UI查看该服务有效的参数。将来可能会有更加详细的文档提供。

Skip to main content