【转】ArcGIS API for Silverlight/WPF 2.1学习笔记(一)

源自:http://blog.163.com/zwx_gis/blog/static/32434435201122193611576/ (主页:http://blog.163.com/zwx_gis/

一、安装

1Visual Studio:

1Visual Studio 2010Visual Web Developer Express 2010

2Silverlight 4 Tools for Visual Studio (add-on) :仅Silverlight 4支持

3Expression Blend 4 SDK for Silverlight (also included with Expression Blend 4)

Necessary for behavior and Silverlight support

2Expression Blend:

1Expression Blend 4Included with Expression Studio editions

3、其它附加(非必须安装)

1Deep Zoom Composer

2Silverlight Toolkit

 

二、开始

1VS2010,新建“Silverlight应用程序”

2、勾选“在新网站中承载Silverlight应用程序”(ASP.NET Web应用程序项目)

3、添加引用:.NETESRI.ArcGIS.Client

4xaml文件中:添加命名空间指向ArcGIS Silverlight/WPF;添加Map控件,并指定其MapServiceLayer

<UserControl x:Class="SilverlightApplication.MainPage" xmlns="…" …

xmlns:esri="http://schemas.esri.com/arcgis/client/2009">

       <Grid x:Name="LayoutRoot">

              <esri:Map x:Name="MyMap" >

                     <esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"                             

Url="http://hostName/ArcGIS/rest/services/mapservName/MapServer"/>

      </esri:Map>

       </Grid>

</UserControl>

注意:为了能跨域访问(MapServer在不同域),需要将clientaccesspolicy.xml crossdomain.xml文件拷贝到网站根目录(如IISC:inetpubwwwroot)。

 

三、ArcGIS API for Microsoft Silverlight/WPF 2.1ODM

1OMD(Object model diagrams对象模型图表)总览:参见附件一

2OMD(Object model diagrams对象模型图表)详表:参见附件二

 

四、地图和图层(Maps and Layers

1、创建地图(map

exent属性:地图的左下角和右上角坐标值,即地图的显示范围

默认:所有地图图层的范围

spatial reference(空间参考)属性:如果空间参考不一致,地图将不显示

默认:采用第一个图层的空间参考值

<esri:Map x:Name="MyMap">   

       <esri:Map.Extent>      

              <esriGeometry:Envelope XMin="." YMin="." XMax="." YMax="." >        

                     <esriGeometry:Envelope.SpatialReference>           

                            <esriGeometry:SpatialReference WKID="26777"/>           

                     </esriGeometry:Envelope.SpatialReference>   

              </esriGeometry:Envelope>   

       </esri:Map.Extent>

</esri:Map>

也可后台指定:

ESRI.ArcGIS.Client.Geometry.Envelope initialExtent = new ESRI.ArcGIS.Client.Geometry.

Envelope(ESRI.ArcGIS.Client.Bing.Transform.GeographicToWebMercator( new ESRI.

ArcGIS.Client.Geometry.MapPoint(-130, 20)),ESRI.ArcGIS.Client.Bing.Transform.

GeographicToWebMercator(new ESRI.ArcGIS.Client.Geometry.MapPoint(-65, 55)));

initialExtent.SpatialReference = new ESRI.ArcGIS.Client.Geometry.SpatialReference(102100);

MyMap.Extent = initialExtent;

注:WKID-Well Know IDEPSG发布的代表特定椭球体、单位、地理坐标系或投影坐标系的ID,例如 "EPSG4326" 指的就是WGS 84地理坐标系,其中WKID=4326

 

2、新增图层(layer

第一加载图层的空间参考决定了整个地图的空间参考

先加载的图层在地图下边,如下图:

【转】ArcGIS API for Silverlight/WPF 2.1学习笔记(一)

 

Map Service Layers

两种类型:

tiled Service:瓦片,地图服务器上预先定义好的Image

Dyanmic Service:动态,动态生成的Image

Service host

Map Service Layer Type

描述

ArcGIS Service

ArcGISTiledMapServiceLayer

地图服务器的缓存地图服务已经存在所有地图image瓦片

ArcGISDynamicMapServiceLayer

地图服务器的无缓存地图服务动态生成地图images,可动态访问矢量(vector)(栅格)raster数据

ArcGISImageServiceLayer

地图服务器的image服务动态生成地图images,可动态访问栅格数据

Bing Maps

TileLayer

 

 

Feature layers

包含features,如geometry(几何学)和attribute(属性)

 

不支持多图层缓存

ArcGISDynamicMapServiceLayer的背景颜色通常为透明

opacity属性用于定义图层的透明度(0-1

 

地图不显示的原因有:

url不正确;

Map Service不可用

Map Service网站或主机没有跨域认证文件(clientaccesspolicy.xml crossdomain.xml

Map Service要求tokencredentials

 

3、导航地图(Navigation

1mapZoomDuration属性和PanDuration 属性:用于指定缩放和平移动作的持续时间。

<esri:Map ZoomDuration="00:00:00" PanDuration ="00:00:00” …>

2mapSnapToLevels属性:用于指定level of detailLOD),地图在该级别是否显示。

<esri:Map SnapToLevels=”ture” …>

3mapZoomFactor属性:键盘+/-进行缩放时,缩放的级数

4)系统已封装的键盘和鼠标导航地图快捷键:

键盘

鼠标

结果

上、下、左、右

 

地图平移

 

拖动

地图平移

+-

 

地图缩放,缩放比例为mapZoomFactor属性指定的值

 

双击

地图放大,放大比例为mapZoomFactor属性指定的值

Shift

拉框

拉框放大

Shift+Ctrl

拉框

拉框缩小

 

滚轮

地图缩放

5)系统已封装的导航地图的方式和接口:

map的属性|方法

描述

Extent属性

map.Extent=envelope

Zoom()

map.Zoom(n) n为缩放比率,n>1zoominn<1zoomout

Zoomto()

map.Zoomto(envelope)

ZoomToResolution()

map.ZoomToResolution(lod.Resolution);

Resolution指每pixel包含的map unit数,如

Lod lod=tiledMapServiceLayer.TileInfo.Lods[5];

map.ZoomToResolution(lod.Resolution);

Panto()

Panto(point)point为地图窗口的中心点

 

4Time-aware layers(此知识点不懂,有待继续研究)

ArcGIS10开始支持Time-aware layers,存储了随时间变化的信息,可用于:

1)飓风路径及其它气象学事件;

2)人口和土地利用的历史变化;

3)监测生产现状的变化;

4)火灾或洪水的行进;

5)疾病的蔓延。

 

Time-aware layers的使用:

1)使用Tookit里的TimeSlider控件

2)使用API自己建立应用程序

 

Time-aware layers的建立:

ArcMap中,右键图层属性Time,勾选Enable time on this layer

【转】ArcGIS API for Silverlight/WPF 2.1学习笔记(一)
 

地图发布后,可以使用time-aware mapfeature ServiceArcGISDynamicMapServiceLayer FeatureLayer classes)来随时间变化的查询和展示。

对于Image Services,栅格地图必须提供Mosaic Dateset,如下图:

【转】ArcGIS API for Silverlight/WPF 2.1学习笔记(一)
 
 

访问TimeExtent类:通过time-aware layersTimeExtent属性访问

TimeExtent timeExtent = (MyMap.Layers["MyFeatureLayer"] as FeatureLayer)

.TimeExtent;

//TimeExtent timeExtent = new ESRI.ArcGIS.Client.TimeExtent();

timeExtent.Start = DateTime.Parse("2002-01-01T17:33:46.0000000",

                        CultureInfo.CurrentCulture, DateTimeStyles.AdjustToUniversal);

 

5Behaviorsactions

BehaviorAPI位于Esri.ArcGIS.Client.Behaviors集(内藏在Expression Blend4中),用于定义用户与地图的交互。使用时必须添加System.Windows.Interactivity集。

xaml文件中必须添加命名空间如下:

xmlns:esriBehaviors="clr-namespace:ESRI.ArcGIS.Client.Behaviors;assembly=ESRI.ArcGIS.Client.Behaviors"    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

 

BehaviorAPI包括三个核心类:

1Behavior:由trigger(地图上的事件)和action(产生结果)组成

Behavior

Description

Code Example

ConstrainExtentBehavior

Limit the map extent to an envelope. The user cannot navigate outside of the envelope defined on the behavior.

<esri:Map x:Name="MyMap" Extent="-120,30,-60,60">

 . . .

 <i:Interaction.Behaviors>

 <esriBehaviors:ConstrainExtentBehavior

 ConstrainedExtent="-120,30,-60,60"/>

 </i:Interaction.Behaviors>

</esri:Map>

MaintainExtentBehavior

Maintain the current extent when the map is resized.

<esri:Map x:Name="MyMap">

 . . .

 <i:Interaction.Behaviors>

 <esriBehaviors:MaintainExtentBehavior />

 </i:Interaction.Behaviors>

</esri:Map>

ShowCoordinatesBehavior

Show map coordinates next to the mouse cursor when hovering over the map.

<esri:Map x:Name="MyMap">

 . . .

 <i:Interaction.Behaviors>

 <esriBehaviors:ShowCoordinatesBehavior

 FormatString="{}{0:0.00} , {1:0.00}"/>

 </i:Interaction.Behaviors>

</esri:Map>

2Action:由trigger(地图上的事件)和目标结果

Action

Description

Code Example

ClearGraphicsAction

Clears all graphics in a graphics layer.

<Button>

 <i:Interaction.Triggers>

 <i:EventTrigger EventName="Click">

 <esriBehaviors:ClearGraphicsAction

 GraphicsLayerID="MyGraphicsLayer"

 TargetName="MyMap" />

 </i:EventTrigger>

 </i:Interaction.Triggers>

</Button>

MeasureAction

Shows measure distance, radius, and area.

<Button>

 <i:Interaction.Triggers>

 <i:EventTrigger EventName="Click">

 <esriBehaviors:MeasureAction

 AreaUnit="SquareMiles"

 DisplayTotals="True"

 DistanceUnit="Miles"

 MapUnits="DecimalDegrees"

 MeasureMode="Polygon"

 FillSymbol="{StaticResource DefaultFillSymbol}"

 TargetName="MyMap"/>

 </i:EventTrigger>

 </i:Interaction.Triggers>

</Button>

PanToAction

Pans to a specified geometry.

<Button>

 <i:Interaction.Triggers>

 <i:EventTrigger EventName="Click">

 <esriBehaviors:PanToAction

 TargetName="MyMap">

 <esriBehaviors:PanToAction.Geometry>

 <esriGeometry:MapPoint X="-120" Y="43" />

 </esriBehaviors:PanToAction.Geometry>

 </esriBehaviors:PanToAction>

 </i:EventTrigger>

 </i:Interaction.Triggers>

</Button>

RedlineAction

Draw graphics on the map and add it to a graphics layer.

<Button>

 <i:Interaction.Triggers>

 <i:EventTrigger EventName="Click">

 <esriBehaviors:RedlineAction

 Color="#FF32FF00"

 DrawMode="Freehand"

 GraphicsLayerID="MyGraphicsLayer"

 TargetName="MyMap"/>

 </i:EventTrigger>

 </i:Interaction.Triggers>

</Button>

SpatialQueryAction

Draw geometry on the map to query features in a feature layer. Draw the results in a graphics layer.

<Button>

 <i:Interaction.Triggers>

 <i:EventTrigger EventName="Click">

 <esriBehaviors:SpatialQueryAction

 DrawMode="Rectangle"

 LayerID="MyGraphicsLayer"

 Url="http://myserver/ArcGIS/rest/myservice/MapServer/2"

 Symbol="{StaticResource GraphicsLayerFillSymbol}"

 TargetName="MyMap" />

 </i:EventTrigger>

 </i:Interaction.Triggers>

</Button>

ToggleLayerAction

Toggle the visibility of a layer.

<Button>

 <i:Interaction.Triggers>

 <i:EventTrigger EventName="Click">

 <esriBehaviors:ToggleLayerAction

 LayerID="MyDynamicLayer"

 TargetName="MyMap"/>

 </i:EventTrigger>

 </i:Interaction.Triggers>

</Button>

UpdateFeatureLayerAcvtion

Refresh the contents of a feature layer.

<Button>

 <i:Interaction.Triggers>

 <i:EventTrigger EventName="Click">

 <esriBehaviors:UpdateFeatureLayerAction

 FeatureLayerID="MyFeatureLayer"

 TargetName="MyMap" />

 </i:EventTrigger>

 </i:Interaction.Triggers>

</Button>

ZoomToAction

Zoom to a specified geometry. If the geometry is a point, the map will pan.

<Button>

 <i:Interaction.Triggers>

 <i:EventTrigger EventName="Click">

 <esriBehaviors:ZoomToAction

 TargetName="MyMap">

 <esriBehaviors:ZoomToAction.Geometry>

 <esriGeometry:Envelope

 XMin="-110" YMin="40" XMax="-100" YMax="50" />

 </esriBehaviors:ZoomToAction.Geometry>

 </esriBehaviors:ZoomToAction>

 </i:EventTrigger>

 </i:Interaction.Triggers>

</Button>

ZoomToFullExtentAction

Zoom to the full extent of all layers.

<Button>

 <i:Interaction.Triggers>

 <i:EventTrigger EventName="Click">

 <esriBehaviors:ZoomToFullExtentAction

 TargetName="MyMap"/>

 </i:EventTrigger>

 </i:Interaction.Triggers>

</Button>

ZoomToLayerAction

Zoom the extent of a specified layer.

<Button>

 <i:Interaction.Triggers>

 <i:EventTrigger EventName="Click">

 <esriBehaviors:ZoomToLayerAction

 LayerID="MyTileLayer"

 TargetName="MyMap"/>

 </i:EventTrigger>

 </i:Interaction.Triggers>

</Button>

 

3Trigger(略)