Рассчитать и нарисовать маршрут на элементе управления Bing Maps - PullRequest
4 голосов
/ 06 октября 2011

в моем приложении для WP7 (манго) мне нужно перемещать пользователя из одной точки в другую. Я знаю, что есть элемент управления Map, который позволяет вам рисовать на нем персонал, но как вы попросите его нарисовать для вас путь? (на основе указанного пункта назначения и текущего местоположения пользователя - но это постоянно меняется, так как вы обновите маршрут, если он уйдет?)

1 Ответ

15 голосов
/ 07 октября 2011

Чтобы обновить карту с указанием текущего местоположения пользователя, используйте 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 Maps. Подробнее о Bing Services можно прочитать здесь: http://msdn.microsoft.com/en-us/library/cc980922.aspx - вам нужен GeoCodeService

Нарисовать путь довольно сложно, особенно если вы хотите, чтобы он следовал по дорогам. Для этого вам понадобится служба маршрутизации Bing Maps.

Добавьте службу в 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>
...