零基礎學通Silverlight4(10):網絡地圖服務

Bing MapsGoogle Earth同樣都提供了能夠二次開發的AP I,用戶經過控件能夠自由定製基於瀏覽器的應用系統,能夠在網頁上使用服務商提供的數據服務,Bing Maps能夠在瀏覽器中觀察到世界上的每個角落,並能夠逐級地改變地圖的比例尺,提供矢量地圖和衛星地圖這兩種常見的顯示模式。新版的Bing Maps使用了Silverlight技術,極大地增進了Bing Maps的用戶體驗,好比,縮放地圖時能夠取得更平滑的效果,同時也使得使用一些更佳的特效成爲可能。
網絡服務(Web Service)提供了跨平臺、跨語言的互操做能力,爲地理信息互操做提供了有效的解決途徑。網絡地圖服務(WebMap Service,WMS)是開放地理信息系統聯盟(OGC)制定的網絡服務模型中一個基於HTTP協議的地圖服務,WMS中地圖被定義爲地理數據的可視化表現,經過一系列操做用戶能夠得到須要的地圖數據。必應地圖Silverlight Control SDK下載地址爲:
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=beb29d27-6f0c-494f-b028-1e0e3187e830
爲了使用必應地圖Silverlight Control,必須擁有必應地圖KeyKey爲微軟爲用戶開通的一個受權開發密匙,與開發者帳號進行綁定才能正常使用,按如下步驟可得到:
◎進入到必應地圖帳戶中心https:/ / www.bingmapsportal.com,而後點擊建立戶連接。
使用Windows Live ID登陸後,須要提供 帳戶名稱、聯繫人姓名、公司名稱等 信息。
◎ 在必應地圖帳戶中心的左側,點擊「Create or view keys」。
◎ 在建立界面上,填寫應用程序名、對應程序的網址等信息後,點擊「Create Key」後將得到key
建立項目後,在Silverlight項目中添加必應地圖程序集的引用。
打開MainPage.xaml文件,引入相應命名空間的支持:
xmlns:m="clr-
namespace:Microsoft.Maps.MapControl;assembly=Microsoft.Maps.MapControl" 以下面簡單的XAML,運行後,就可看到地圖了。
<UserControl x:Class="SilverlightApplication7.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    xmlns:m="clr-namespace:Microsoft.Maps.MapControl;assembly=Microsoft.Maps.MapControl"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">
    <Grid x:Name="LayoutRoot" Background="White"> <m:Map x:Name="myMap" CredentialsProvider="Apl2yNzBAE7KuwPFxwSMoQRQnvj2u3LgJaxHEPfcaSzTCcbOucxgJDhCJeXpWaX4" Mode="Road"/>
    </Grid>
</UserControl>
CredentialsProvider 值就是經過 Bing Maps 帳戶管理中心建立的所需的 Key Mode 爲顯示模式,有路況模式( Road )和衛星模式 (Aerial) ,分別顯示路標和不顯示路標,控件默認加載爲路況模式。衛星模式中若要顯示路標則設 Mode 爲「 AerialWithLabels 」。
地圖 Map 控件其它一些屬性有:
Center :中心點座標。
ZoomLevel:放大級別。
NavigationVisibility:導航菜單顯示。
水文部門及時、準確的水文監測信息,及時捕捉公衆對水信息的需求,爲區域經濟發展、人民生活水平提升,提供了主動、及時、優質、高效的水文信息服務。這些服務,很多仍以紙質媒體爲主,如:《水文年鑑》、《水資源質量情況月(年)報》、《地下水通報》、《水資源公報》等,其實還可經過網絡等媒介發佈信息,在提供豐富的水文產品、全面的水文服務的同時 , 平臺的總體的外觀和功能一樣須要作得豐富多彩, Silverlight 是一種融合了微軟的多種技術的 Web 呈現技術。它提供了一套開發框架 , 並經過使用基於向量的圖層圖像技術 , 支持任何尺寸圖像的無縫整合 , 對基於 ASP.NET AJAX 在內的 Web 開發環境實現無縫鏈接。 Silverlight 使開發設計人員可以更好的協做 , 有效地創造出能在 Windows Macintosh 上多種瀏覽器中運行的內容豐富、界面絢麗的 Web 應用程序——— Silverlight 應用程序。
水文服務器很多並非基於 .Net 的,但這不影響推廣使用, Silverlight 的開發是須要 . net Framework 的。可是,這並不要求客戶端須要任何版本的 . net Framework 。客戶端只須要一個 Runtime 插件 , 就能夠執行全部內容,包括託管代碼。 Silverlight 的全部內容都是客戶端運行的 , 所以,服務器端不須要執行任何代碼。這樣, SilverLight 對於服務器端來說 , 只不過是一組文件而已,存放編譯後 XAP 文件的 ClientBin 目錄。所以, SilverLight 能夠放在任何現有的網站服務器上 , 不論這個服務器是否有 . net 環境 , php 服務器 , 或者 ASP 或者 ASP. net 等等。
水文信息網絡地圖服務案例使用了 Bing Maps Silverlight 控件,結合 Silverlight Toolkit 中的圖表控件,利用 Bing Maps 地圖切片數據實現網絡地圖服務,方便快捷地獲取地圖和影像數據,並加載所需的水文信息,從而以較小的成本提供了全方位的水文網絡地圖服務。
主要操做步驟及代碼以下:
(一)加載中國地圖是信息顯示的基礎
     新建項目,啓動 Mircrosoft Visual Studio 2010 ,命名爲水文信息 ShuiWenInfo ,
Silverlight 項目中, 添加必應地圖程序集的引用,並 聲明地圖 Map 控件對應的命名空間的支持。
xmlns:m="clr-namespace:Microsoft.Maps.MapControl;assembly=Microsoft.Maps.MapControl"     
  MainPage.xaml 中添加 Map 控件,並添加站網信息圖層 layStation 和中國地圖圖層 layChina XAML 代碼以下:
 <Grid x:Name="LayoutRoot" Background="White">
<m:Map CredentialsProvider="AmreePcQ50WyjCYvxNo0xUQDwiYVM8VFVTxmcW_1RmOb2x_7T1muW-fSTQQkOok1" x:Name="mapWater"   
         Center="30.4837830422421,108.974539287109" ZoomLevel="6"   >      
          <m:MapTileLayer x:Name="layChina"></m:MapTileLayer>
   <m:MapLayer x:Name="layStation"></m:MapLayer>
  </m:Map>
</Grid>
在程序中加載中國地圖, XAML 以下:
public MainPage()
        {
            InitializeComponent();
            UriBuilder tileSourceUri = new UriBuilder("http://r2.tiles.ditu.live.com/tiles/r{quadkey}.png?g=41");
  // 初始化 LocationRectTileSource 對象,設定顯示範圍及放大級別
 LocationRectTileSource tileSource = new LocationRectTileSource(tileSourceUri.Uri.ToString(),new LocationRect(new Location(60, 60), new Location(13, 140)),  
           new Range<double>(6, 16));
// 設置中國地圖圖層對象屬性
layChina.TileSources.Add(tileSource);
            layChina.Opacity =1.0;
(二)站網信息的顯示。
站網信息是其它信息顯示的基礎,開發站網信息平臺後再加上其它水情、水質等信息, Bing Maps 定義了一些 web 地圖服務 , 如點位的圖釘標籤顯示功能,站網信息中的站點圖標直接用 Bing Maps Silverlight Control 中的地圖圖釘控件 Pushpin 來表示,具體操做步驟有:
站點信息使用站點類 Station 來表示,站點類有站名、經度、緯度等信息。
public class Station
    {
        public string  StationName{get;set;}
        public double  Longitude {get;set;}
        public double  Latitude{get;set;}           
    }
定義全局站網變量 listStation ,並加載示例數據:
public List<Station> listStation;
public void LoadStations()
        {
            listStation = new List<Station>(){
                 new Station {StationName=" 大龍山 ",Longitude=119.02494046378,Latitude=32.0085534220129},
                 new Station {StationName=" 高峯 ",Longitude=118.98099515128,Latitude=32.5588631877063},
                 new Station {StationName=" 張家山 ",Longitude=118.884864780186,Latitude=31.5345470817377},
……………………………………………
              };
         }
在站網圖層上面顯示全部站點圖標:
       public void ShowStation()
        {
            Pushpin station;
            for (int i =0; i < listStation.Count;i++ )
            {
                station = new Pushpin();                   
     Location location = new Location(listStation[i].Latitude,listStation[i].Longitude);
                ToolTipService.SetToolTip(station, listStation[i].StationName);
                layStation.AddChild(station, location);
                }          
        }
MainPage.xaml 中添加「站網信息」命令按鈕以控制 站網信息圖層 layStation 的顯示。
<StackPanel HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Horizontal" Background="Gray">
            <Button Margin="5" Width="100" Height="30" x:Name="btStation" Click="btStation_Click" >
                <TextBlock FontSize="15"> 站網信息 </TextBlock>
            </Button>
   </StackPanel>
對應的單擊處理事件爲:
private void btStation_Click(object sender, RoutedEventArgs e)
        {
            if(layStation.Visibility ==Visibility.Visible )
                layStation.Visibility = Visibility.Collapsed;
            else
                layStation.Visibility = Visibility.Visible ; 
        } 

(三)實時水位顯示    

水情信息中主要是水位,現添加實時水位顯示的功能,具體步驟有:
在站點類 Station 的變量中,增長水位變量 WaterLevel
public class Station
    {
        public string  StationName{get;set;}
        public double  Longitude {get;set;}
        public double  Latitude{get;set;} 
        public double  WaterLevel{get;set;}       
    }
加載數據時,也添加水位值 ,以下:
listStation = new List<Station>(){
                 new Station {StationName=" 大龍山",Longitude=119.02494046378,Latitude=32.0085534220129,WaterLevel=15.63},
                  new Station {StationName=" 母山",Longitude=117.687355014561,Latitude=31.8733710133861,WaterLevel=18.33},
            ……………………………………..
}
Silverlight 項目中添加水位顯示的用戶控件 WaterLeverl ,界面設計以下:
  <Grid x:Name="LayoutRoot" Background="White">
        <Border  BorderBrush="Red" BorderThickness="1.0" >
            <StackPanel >
                <TextBox x:Name="txtWater"  TextWrapping="NoWrap" />   
            </StackPanel>
        </Border>
    </Grid>
  定義一個水位變量,代碼以下:
    public partial class WaterLever : UserControl
    {      
        public WaterLever()
        {
            InitializeComponent();                               
        }
        public double lever
        {
            set{
                txtWater.Text = value.ToString ();
            }
            get{
                return double.Parse(txtWater.Text);
            }
        }       
    }
Main.xaml 文件中添加水位圖層。
<m:MapLayer x:Name="layWater"></m:MapLayer>
在水位圖層上顯示水位。
public void ShowWater()
        {         
            WaterLever water;
            for (int i = 0; i < listStation.Count; i++)
            {            
                water = new WaterLever();
Location location = new Location(listStation[i].Latitude, listStation[i].Longitude);
                ToolTipService.SetToolTip(water, listStation[i].StationName);
                water.lever = listStation[i].WaterLevel;
                layWater.AddChild(water, location);
            }
        }
控制水位圖層的顯示。
private void btWater_Click(object sender, RoutedEventArgs e)
      {
            if (layWater.Visibility == Visibility.Visible)
                layWater.Visibility = Visibility.Collapsed;
            else
                layWater.Visibility = Visibility.Visible;
        }
 
運行後效果如圖:
 
 
更詳細內容及源代碼下載:
http://www.amazon.cn/mn/detailApp/ref=sr_1_1?_encoding=UTF8&s=books&qid=1287058088&asin=B0043RT7I2&sr=8-1
相關文章
相關標籤/搜索