WP8中的地图和导航

原文 WP8中的地图和导航

 

代码示例
源文件: Media:MapSample.zip

测试基于
SDK: Windows Phone SDK 8.0

兼容于
平台: Windows Phone 8 and later
Windows Phone 8

文章
 Xinx Gong 在 30 Nov 2012 创建
最后由 hamishwillee 在 26 Jun 2013 编辑

 

Contents

 

地图控件

 

WP8中,可以使用新的Map APIs来开发基于地图的应用,并可以包含位置以及搜索功能。WP8中使用的是诺基亚地图,WP7.1中的Bing地图仍然支持,但是不推荐使用,它仅仅是为了兼容使用了已经Bing地图的WP7.1应用。

 

显示地图

 

WP8中使用Map控件来显示地图,使用之前你需要关注下面几件事:

 

1.Map控件和服务使用的namespace

 

Microsoft.Phone.Map

 

2.XAML文件中使用Map控件需要的xmlns声明

 

xmlns:maps="clr-namespace:Microsoft.Phone.Maps.Controls;assembly=Microsoft.Phone.Maps"

 

3.WMAppManifest.xml中需要添加ID_CAP_MAP功能

 

指定地图的中心点和缩放比

 

在初始化Map控件时,CenterChanged和ZoomLevelChanged事件会被触发一次,所以要确定你的代码在初始化Map控件初始化触发这两个事件时能正确的处理好。 注意不要用Latitude和Longitude属性来设置Center,需要创建GeoCoordinate对象来设置。

 

用Map.SetView动态的调整地图

 

如果直接通过设置Map的属性来调整地图,地图的变化非常生硬,而采用SetView来调整地图的话,会有一个很流畅的动画效果来展示地图的变化。

 

通过SetView方法可以调整以下属性:

 

GeoCoordinate center:地图显示的中心点
double zoomLevel:地图显示的缩放级别
double heading:地图旋转的角度,值在0-360之间。

double pitch:地图倾斜的角度,值在0-180之间。

LocationRectangle boundingRectangle:地图上由两个经纬度坐标标识的一个矩形区域。
MapAnimationKind animationKind:地图发生变化时的过度动画效果。

 

地图制图模式

 

MapCartographicMode.Road: 显示普通的2D地图(默认显示)。
MapCartographicMode.Aerial: 显示航空摄影的地图。
MapCartographicMode.Hybrid: 显示带有道路和标签的鸟瞰地图。
MapCartographicMode.Terrain: 显示物理3D地图,带有海拔和水的特性,比如山脉和河流。

 

地图颜色模式

 

MapColorMode.Light:白天模式
MapColorMode.Dark:夜间模式

 

显示地标和行人特性

 

地标:设置Map控件的LandmarksEnabled属性为true。
只有在Map控件的ZoomLevel大于7时才能显示。
行人特性:设置Map控件的PedestrianFeaturesEnabled属性为true。
只有在Map控件的ZoomLevel大于16时才能显示。

 

地图服务

 

通过经纬度查找地址信息

 

ReverseGeocodeQuery

 

ReverseGeocodeQuery reverseGeocodeQuery = null;
if (reverseGeocodeQuery == null || !reverseGeocodeQuery.IsBusy)
{
reverseGeocodeQuery = new ReverseGeocodeQuery();
reverseGeocodeQuery.GeoCoordinate = new GeoCoordinate(39.92, 116.46);
reverseGeocodeQuery.QueryCompleted += reverseGeocodeQuery_QueryCompleted;
reverseGeocodeQuery.QueryAsync();
}
 
private void reverseGeocodeQuery_QueryCompleted(object sender,
QueryCompletedEventArgs<IList<MapLocation>> e)
{
if (e.Error == null)
{
...
}
}

 

查找某一地点的经纬度

 

GeocodeQuery

 

GeocodeQuery geocodeQuery = new GeocodeQuery();
geocodeQuery.SearchTerm = searchTerm;
// Can search with a nearby coordinate, or ignore the parameter.
geocodeQuery.GeoCoordinate = nearbyCoordinate == null ? new GeoCoordinate(0, 0) : nearbyCoordinate;
geocodeQuery.QueryCompleted += geocodeQuery_QueryCompleted;
geocodeQuery.QueryAsync();
 
private void geocodeQuery_QueryCompleted(object sender,
QueryCompletedEventArgs<IList<MapLocation>> e)
{
if (e.Error == null)
{
...
}
}

 

路线规划

 

RouteQuery

 

RouteQuery routeQuery = new RouteQuery();
// TravelMode: Driving or Walking.
routeQuery.TravelMode = TravelMode.Driving;
// List<GeoCoordinate>: List of geocoordinates representing the route.
routeQuery.Waypoints = route;
routeQuery.QueryCompleted += routeQuery_QueryCompleted;
routeQuery.QueryAsync();
 
private void routeQuery_QueryCompleted(object sender,
QueryCompletedEventArgs<Route> e)
{
if (e.Error == null)
{
...
}
}

 

离线地图管理

 

MapDownloaderTask task = new MapDownloaderTask();
task.Show();

 

示例代码下载

 

File:MapSample.zip

 

 

上一篇:从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法


下一篇:深入实践Spring Boot2.2.1 Redis依赖配置