Рисование стрелок на картах Bing в Silverlight - PullRequest
2 голосов
/ 24 сентября 2010

Мне нужно нарисовать линии, чтобы продемонстрировать перевозку грузов на картах Bing. Чтобы уточнить начальную и конечную точки, я нарисую небольшую стрелку на стороне назначения. Проблема в том, что когда я смотрю на глобальную карту, некоторые линии рисуются вдоль кратчайшего пути «вокруг спины». Например, из Нью-Йорка в Токио он будет проложен через Тихий океан. Поскольку стрелка нарисована отдельно, она перевернута.

>------- 

вместо

<-------

Эта проблема усугубляется, когда пользователь прокручивает восток / запад на карте, так что Европа больше не центрируется.

Это код, который у меня есть. Я не писал этого, но все еще должен исправить ошибку, представленную в этом вопросе. Если у вас есть предложения по оптимизации, не стесняйтесь упомянуть об этом.

public class MapArrow
{
    private readonly MapPolyline line;
    private readonly MapLayer arrowLayer;
    private readonly Polyline arrowLine;

    #region constructor

    public MapArrow(Location start, Location end)
        : this(start, end, Colors.Red)
    {

    }

    public MapArrow(Location start, Location end)
    {
        color.A = 200;
        Color = Colors.Red;
        drawingColor = Colors.Red;
        HeadWidth = 8;
        HeadHeight = 8;
        StrokeThikness = 5;
        Start = start;
        End = end;

        line = new MapPolyline();
        arrowLayer = new MapLayer();
        arrowLine = new Polyline();
        arrowLayer.AddChild(arrowLine, end);
        UpdateMapLine();
        UpdateArrowPolyline();
    }

    #endregion

    #region properties

    public double HeadWidth { get; set; }

    public double HeadHeight { get; set; }

    public Color Color { get; set; }

    public int StrokeThikness { get; set; }

    public Location Start { get; private set; }

    public Location End { get; private set; }

    public MapPolyline Line
    {
        get
        {
            return line;
        }
    }
    public MapLayer Arrow
    {
        get
        {
            return arrowLayer;
        }
    }

    #endregion

    private void UpdateMapLine()
    {
        line.Stroke = new SolidColorBrush(drawingColor);
        line.StrokeThickness = StrokeThikness;
        line.Opacity = 1;
        line.Locations = new LocationCollection() 
        {
            Start,
            End
        };
    }

    private void UpdateArrowPolyline()
    {
        double theta = Math.Atan2(Start.Latitude - End.Latitude, Start.Longitude - End.Longitude);
        double sint = Math.Sin(theta);
        double cost = Math.Cos(theta);

        Point corner1;
        Point corner2;
        if (!Start.Equals(End))
        {
            corner1 = new Point(
                (HeadWidth*cost - HeadHeight*sint),
                0 - (HeadWidth*sint + HeadHeight*cost));

            corner2 = new Point(
                (HeadWidth*cost + HeadHeight*sint),
                (HeadHeight*cost - HeadWidth*sint));
        }
        else
        {
            corner1 = new Point(0,StrokeThikness/2);
            corner2 = new Point(0,-StrokeThikness/2);
        }

        Point endPoint = new Point(0, 0);

        arrowLine.Stroke = new SolidColorBrush(drawingColor);
        arrowLine.StrokeThickness = StrokeThikness;
        arrowLine.Opacity = 1;

        arrowLine.Points = new PointCollection() 
        {
            corner1,
            endPoint,
            corner2
        };
    }
}

1 Ответ

0 голосов
/ 26 октября 2010

Самый короткий (Большой круг) - это правильный способ его нарисовать.Изменится ли он при увеличении до 2-мерной проекции?

Не могли бы вы определить, какой вид отображается, и изменить ориентацию на основании этого?

...