【问题标题】:Calculate and draw route on Bing Maps control在 Bing Maps 控件上计算和绘制路线
【发布时间】:2011-10-06 13:56:34
【问题描述】:

在我的 WP7(芒果)应用程序中,我需要将用户从一个点导航到另一个点。我知道有 Map 控件可以让您在上面绘制人员,但是您如何要求它为您绘制路径? (基于指定的目的地和用户的当前位置 - 但这种情况一直在变化,所以如果他走偏了,你如何更新路线?)

【问题讨论】:

  • 你在这里基本上是在问3个问题。下一次,问一个详细的问题,这样你就能得到更简洁的答案。

标签: windows-phone-7 windows-phone-7.1 bing-maps


【解决方案1】:

要使用用户当前位置更新地图,请使用GeoCoordinateWatcher 并在数据绑定图钉更改时更新它的位置。请记住将最小距离设置为较低的值,例如 5 米。

可以使用此 XAML 模板创建类似于 bing 地图上的图钉:

<maps:Pushpin Background="{StaticResource PushpinLocationBrush}"
              Location="{Binding MyLocation}">
    <maps:Pushpin.Template>
        <ControlTemplate>
            <Grid>
                <Rectangle Width="15"
                           Height="15"
                           Margin="0"
                           Fill="Black">
                    <Rectangle.Projection>
                        <PlaneProjection CenterOfRotationX="0"
                                         LocalOffsetX="-2"
                                         LocalOffsetY="5"
                                         RotationZ="45" />
                    </Rectangle.Projection>
                </Rectangle>
                <Ellipse Width="7"
                         Height="7"
                         Margin="0"
                         HorizontalAlignment="Center"
                         VerticalAlignment="Center"
                         Fill="Orange"
                         RenderTransformOrigin="0.339,0.232"
                         StrokeThickness="0" />
            </Grid>
        </ControlTemplate>
    </maps:Pushpin.Template>
</maps:Pushpin>

可以使用 Bing 地图获取地址的地理坐标。您可以在此处阅读有关 Bing 服务的更多信息:http://msdn.microsoft.com/en-us/library/cc980922.aspx——您需要的是 GeoCodeService

绘制路径相当复杂,特别是如果您希望它沿着道路移动。为此,您需要 Bing 地图路线服务。

将服务添加到Visual Studio,名称为RouteServiceReference,然后您可以使用以下代码获取路径片段,并将它们添加到您的地图中。下面的 XAML 反映了我将片段添加到的控件:

List<GeoCoordinate> locations = new List<GeoCoordinate>();

RouteServiceClient routeService = new RouteServiceClient("BasicHttpBinding_IRouteService");

routeService.CalculateRouteCompleted += (sender, e) =>
{
    var points = e.Result.Result.RoutePath.Points;
    var coordinates = points.Select(x => new GeoCoordinate(x.Latitude, x.Longitude));

    var routeColor = Colors.Blue;
    var routeBrush = new SolidColorBrush(routeColor);

    var routeLine = new MapPolyline()
    {
        Locations = new LocationCollection(),
        Stroke = routeBrush,
        Opacity = 0.65,
        StrokeThickness = 5.0,
    };

    foreach (var location in points)
    {
        routeLine.Locations.Add(new GeoCoordinate(location.Latitude, location.Longitude));
    }

    RouteLayer.Children.Add(routeLine);
};

RouteBingMap.SetView(LocationRect.CreateLocationRect(locations));

routeService.CalculateRouteAsync(new RouteRequest()
{
    Credentials = new Credentials()
    {
        ApplicationId = "YOURBINGMAPSKEYHERE"
    },
    Options = new RouteOptions()
    {
        RoutePathType = RoutePathType.Points
    },
    Waypoints = new ObservableCollection<Waypoint>(
        locations.Select(x => new Waypoint()
        {
            Location = x.Location
        }))
});

相关的 XAML:

<maps:Map x:Name="RouteBingMap"
          AnimationLevel="None"
          CopyrightVisibility="Collapsed"
          CredentialsProvider="YOURBINGMAPSKEYHERE"
          LogoVisibility="Collapsed"
          ZoomBarVisibility="Collapsed"
          ZoomLevel="12">
    <maps:MapLayer x:Name="RouteLayer" />
</maps:Map>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2017-04-25
    相关资源
    最近更新 更多