ArcGIS API For Silverlightインスタンス解析--機能編(三):拡大縮小などのナビゲーション機能

20379 ワード

标记:ESRI公司はすでに正式版のAPI for Silverlightを発表して、マイクロソフトSilverlight 3.0正式版もすでに発表しました.SilverlightはWeb GISにもたらした多くの新しい特性もますます多くの人に注目されています.本シリーズの文章はESRI公司が提供した実例を基にして、Arcgis api for Silverlightがもたらした超眩しい効果を全面的に感じます.

 


この節では、地図コントロールのナビゲーション機能を実現します.やはり効果を見てみましょう.


 


 


  1. デフォルトのMainPageでSilverlightプロジェクトを作成します.xamlでは、記述コードは以下の通りです:
  2. <UserControl x:Class="SilverlightApplication3.MainPage"
    
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    
        mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480"
    
        xmlns:sysmbol="clr-namespace:ESRI.ArcGIS.Client.Symbols;assembly=ESRI.ArcGIS.Client"
    
        xmlns:esri="clr-namespace:ESRI.ArcGIS.Client;assembly=ESRI.ArcGIS.Client">
    
       <Grid x:Name="LayoutRoot">
    
           <!--    -->
    
            <esri:Map x:Name="MyMap">
    
                <esri:Map.Layers>
    
                    <!--      -->
    
                    <esri:ArcGISTiledMapServiceLayer
    
                        Url="http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_Imagery_World_2D/MapServer"/>
    
                    <!--        -->
    
                    <esri:GraphicsLayer ID="MyGraphicsLayer"/>
    
                </esri:Map.Layers>
    
            </esri:Map>
    
           <!--END:    -->
    
           <!--   -->
    
            <Canvas VerticalAlignment="Top" Width="215" Height="50"  
    
                    HorizontalAlignment="Left" Margin="20,20,0,0">
    
                <!--       -->
    
                <Rectangle  RadiusX="10" RadiusY="10"
    
                       Fill="#22000000" Canvas.Left="5" Canvas.Top="5"
    
                       Width="145" Height="50"/>
    
                <Rectangle   RadiusX="10" RadiusY="10" 
    
                       Fill="#775c90b2" Canvas.Left="0" Canvas.Top="0"
    
                       Width="145" Height="50" Stroke="Gray"/>
    
                <Rectangle RadiusX="5" RadiusY="5"
    
                       Fill="#FFFFFFFF" Canvas.Left="10" Canvas.Top="10"
    
                       Width="125" Height="30" Stroke="DarkGreen"/>
    
                <!--  -->
    
                <StackPanel Canvas.Left="12" Canvas.Top="12" Orientation="Horizontal">
    
                    <Button Content="  " Height="25" Width="30" Click="Button_Click"/>
    
                    <Button Content="  " Height="25" Width="30" Click="Button_Click"/>
    
                    <Button Content="  " Height="25" Width="30" Click="Button_Click"/>
    
                    <Button Content="  " Height="25" Width="30" Click="Button_Click"/>
    
                    
    
                </StackPanel>
    
            </Canvas>
    
           <!--END:   -->
    
    
    
    
    
        </Grid>
    
    </UserControl>
  3. 拡大縮小すると、フレームを引っ張る効果があります.そのため、フレームを表示するために画層を追加し、グローバル変数を宣言します.また、異なるツールを区別するために、ツールタイプの列挙を宣言し、現在のツールを表す属性を定義します.
  4. /// <summary>
    
            ///     :   
    
            /// </summary>
    
            private Draw draw;
    
            /// <summary>
    
            ///     :   
    
            /// </summary>
    
            private GraphicsLayer gra;
    
    
    
            /// <summary>
    
            ///         
    
            /// </summary>
    
            public enum ToolType
    
            {
    
                  ,
    
                  ,
    
            }
    
    
    
            /// <summary>
    
            ///        
    
            /// </summary>
    
            private ToolType CurrentToolType
    
            {
    
                get;
    
                set;
    
            }
    
    
  5. 同様に、初期化イベントでは、すべての変数が初期化されます.ここでDrawのオブジェクトは、拡大縮小時に使用されるボックスのみを描画するため、初期化前にDrawModeプロパティに値を割り当てます.
     
  6. public MainPage()
    
           {
    
               InitializeComponent();
    
               //      
    
               gra = this.MyMap.Layers["MyGraphicsLayer"] as GraphicsLayer;
    
               draw = new Draw(this.MyMap)
    
               {
    
                   LineSymbol = new LineSymbol()
    
                     { 
    
                         Color = new SolidColorBrush(Colors.Red), Width = 2 
    
                     },
    
                   FillSymbol=new SimpleFillSymbol()
    
                    {
    
                       BorderBrush = new SolidColorBrush(Colors.Red) { },
    
                       BorderThickness = 2,
    
                       Fill = new SolidColorBrush(Colors.Green) { Opacity = 0.5 }
    
                     },
    
                  DrawMode=DrawMode.Rectangle,
    
               };
    
               //    
    
               draw.DrawComplete += new EventHandler<DrawEventArgs>(draw_DrawComplete);            
    
           }
  7. XAMLで宣言されたツールイベント関数を実装します.平行移動は地図コントロールのデフォルトの操作なので、Draw機能をオフにするだけでいいです.全図機能は、現在のビュー範囲をレイヤーの全図範囲にズームすることです.
  8. /// <summary>
    
          ///        
    
          /// </summary>
    
          /// <param name="sender"></param>
    
          /// <param name="e"></param>
    
          private void Button_Click(object sender, RoutedEventArgs e)
    
          {
    
              Button button = sender as Button;
    
              string modetype = button.Content.ToString();
    
              //       
    
              switch(modetype)
    
              {
    
                  case "  ":
    
                      CurrentToolType = ToolType.  ;
    
                   break;
    
    
    
                  case "  ":
    
                   CurrentToolType = ToolType.  ;
    
                   break;
    
    
    
                  case "  ":
    
                   draw.IsEnabled = false;
    
                   return;
    
    
    
                  case "  ":
    
                   MyMap.ZoomTo(MyMap.Layers.GetFullExtent());
    
                   return;
    
              }
    
              //    
    
              draw.IsEnabled = true;
    
          }
  9. 実際には、描画完了関数で拡大縮小機能を処理するだけでよい.拡大機能は言うまでもなく、地図を描画するジオメトリ要素に拡大縮小することです.縮小機能では、地図の現在のビューを引き出したボックスに縮小するため、現在のビューと引き出したボックスから新しいボックスサイズを計算する必要があります.
  10. /// <summary>
    
           ///      ,    
    
           /// </summary>
    
           /// <param name="sender"></param>
    
           /// <param name="e"></param>
    
           private void draw_DrawComplete(object sender, DrawEventArgs e)
    
           {
    
               switch (CurrentToolType)
    
               {
    
                   case ToolType.  :
    
                       MyMap.ZoomTo(e.Geometry);
    
                       break;
    
                   case ToolType.  :
    
                       {
    
                           //                          
    
                           Envelope currentExtent = MyMap.Extent;
    
    
    
                           Envelope zoomBoxExtent = e.Geometry as Envelope;
    
                           MapPoint zoomBoxCenter = zoomBoxExtent.GetCenter();
    
    
    
                           double whRatioCurrent = currentExtent.Width / currentExtent.Height;
    
                           double whRatioZoomBox = zoomBoxExtent.Width / zoomBoxExtent.Height;
    
    
    
                           Envelope newEnv = null;
    
    
    
                           if (whRatioZoomBox > whRatioCurrent)
    
                           {
    
                               double mapWidthPixels = MyMap.Width;
    
                               double multiplier = currentExtent.Width / zoomBoxExtent.Width;
    
                               double newWidthMapUnits = currentExtent.Width * multiplier;
    
                               newEnv = new Envelope(new MapPoint(zoomBoxCenter.X - (newWidthMapUnits / 2), zoomBoxCenter.Y),
    
                                                              new MapPoint(zoomBoxCenter.X + (newWidthMapUnits / 2), zoomBoxCenter.Y));
    
                           }
    
                           else
    
                           {
    
                               double mapHeightPixels = MyMap.Height;
    
                               double multiplier = currentExtent.Height / zoomBoxExtent.Height;
    
                               double newHeightMapUnits = currentExtent.Height * multiplier;
    
                               newEnv = new Envelope(new MapPoint(zoomBoxCenter.X, zoomBoxCenter.Y - (newHeightMapUnits / 2)),
    
                                                              new MapPoint(zoomBoxCenter.X, zoomBoxCenter.Y + (newHeightMapUnits / 2)));
    
                           }
    
    
    
                           if (newEnv != null)
    
                               MyMap.ZoomTo(newEnv);
    
                       }
    
                       break;
    
               }
    
           }
    
    
  11. コンパイル実行すればよい!


    著者:張亜
    出典:http://www.cnblogs.com/zya-gis
    本稿の著作権は著者とブログ園に共有されており、転載を歓迎するが、著者の同意を得ずにこの声明を保留し、文章ページの明らかな位置で原文接続を与えなければならない.そうしないと、法律責任を追及する権利を保留する.