一、创建地图
假设你已经在VS中创建了一个Silverlight应用程序,已打开一个主页,如MainPage.xaml。
- 增加引用 ESRI.ArcGIS.Client.dll
在 XAML中增加对esri命名空间的引用,这样可以在程序中使用 ESRI.ArcGIS.Client、 ESRI.ArcGIS.Client.Behaviors、and ESRI.ArcGIS.Client.Toolkit等类与控件。
<UserControl x:Class="SilverlightApplication.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:esri="http://schemas.esri.com/arcgis/client/2009">
2. 删除该页面中定义的UserControl的Width与Height属性。这样页面内容可以填满整个浏览器。
3. 往容器中增加Map控件,这里的容器为Grid控件。使用ESRI.ArcGIS.Client的命名空间标识esri及Map控件,使用x:Name属性给Map控件命名。
<Grid x:Name="LayoutRoot" Background="White">
<esri:Map x:Name="MyMap" >
</esri:Map>
</Grid>
4. 往地图中增加ArcGIS Server瓦片地图图层,该地图包含一组图层。这里通过ArcGISTiledMapServiceLayer元素加载有缓存的地图服务。
说明:在Map标签中明确Layers属性是可选的。
<esri:Map x:Name="MyMap" >
<esri:Map.Layers>
<esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"
Url="http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/MapServer" />
</esri:Map.Layers>
</esri:Map>
5. 通过Extent属性设置地图的初始范围,属性值为四个由逗号隔开的数字,依次表示最小x与y,最大x与y坐标。如:
<esri:Map x:Name="MyMap" Extent="-120, 20, -100, 40" >
6.编译与运行程序。
二、初始地图范围与属性
以下属性可以在初始化地图时定义:
- 初始范围
- 空间参考
- 最小与最大分辨率
地图初始范围为图层的全局,控件参考由该图层集的第一个图层决定,若各图层的空间参考不一致,其它图层应经过投影变换后应能在地图中正确显示。以瓦片地图为例,若与地图参考系不匹配,则无法显示。
说明:
- 地图的空间参考一旦被设定,则不能被修改。
- 如果地图包含瓦片图层,分辨率范围由瓦片图层集决定。
- 这些属性均可以在地图初始化时被设定。
三、设置初始化范围
在XAML文件中,通过Map的Extent属性定义,由四个由逗号隔开的数字表示,分别表示minX,minY,MaxX,maxY
<esri:Map x:Name="MyMap" Extent="-120,20,-100,40" >
<esri:Map.Layers>
<esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"
Url="http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/MapServer" />
</esri:Map.Layers>
</esri:Map>
四、定义地图的参考系
默认情况下,第一个有效的图层定义了该地图的空间参考系, ArcGIS Server的动态地图与影像图层以及对象图层(FeatureLayer)会重投影到地图的参考系,瓦片地图不会被重投影,因此地图机其他图层要尽量与瓦片图层的参考系保持一致。若要自定义地图参考系,创建Envelope,给SpatialReferencef赋值。如:
<esri:Map x:Name="MyMap">
<esri:Map.Extent>
<esri:Envelope XMin="661140" YMin="-1420246" XMax="3015668" YMax="1594451" >
<esri:Envelope.SpatialReference>
<esri:SpatialReference WKID="26777"/>
</esri:Envelope.SpatialReference>
</esri:Envelope>
</esri:Map.Extent>
也可以在地图控件的构造函数中通过代码实现不同坐标系之间的转换,前提是增加对ESRI.ArcGIS.Client.Bing的引用,代码如下:
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;