Как повернуть многоугольник на карте с координатами long/lat?

Я хочу повернуть многоугольник (например, эту стрелку), заменив жестко запрограммированные значения смещений функцией, в которой можно передать смещение по оси координат и количество градусов, на которые нужно повернуть стрелку.

Я попытался использовать матрицу вращения, но это не сработало.
Вероятно, потому что расстояние 1 лат.!= 1 длинный.

Что я пытаюсь сделать с этим:
Стрелка должна изображать транспортное средство и вращаться в направлении движения автомобиля.

double centerLatitude = pos.Coordinate.Point.Position.Latitude;
double centerLongitude = pos.Coordinate.Point.Position.Longitude;

MapPolygon mapPolygon = new MapPolygon();
mapPolygon.Path = new Geopath(new List<BasicGeoposition>() {
    new BasicGeoposition() {Longitude=centerLongitude, Latitude=centerLatitude},//top of the arrow
    new BasicGeoposition() {Longitude=centerLongitude-0.001, Latitude=centerLatitude-0.0010},
    new BasicGeoposition() {Longitude=centerLongitude-0.001, Latitude=centerLatitude-0.0030},
    new BasicGeoposition() {Longitude=centerLongitude+0.001, Latitude=centerLatitude-0.0030},
    new BasicGeoposition() {Longitude=centerLongitude+0.001, Latitude=centerLatitude-0.0010},              
});
mapPolygon.ZIndex = 1;
mapPolygon.FillColor = Colors.Orange;
mapPolygon.StrokeColor = Colors.Blue;
mapPolygon.StrokeThickness = 2;
mapPolygon.StrokeDashed = false;
MainMap.MapElements.Add(mapPolygon);

введите описание изображения здесь

2 ответа

Решение

MapPolygons связаны с координатами на карте. Преобразование вращения в UWP не будет применяться к MapPolygons. Если вы хотите повернуть MapPolygon, вы должны рассчитать повернутые координаты. Элемент управления картой Bing Maps V8 (веб) предоставляет функцию для этого. Вот два разных способа сделать это:

Пространственно точный (может не выглядеть одинаково из-за проекции карты)

Точный пиксель (будет выглядеть так же, как вы поворачиваете его, но не будет пространственно точным)

  • Вычислите центр многоугольника и используйте его как опорную точку для вращения многоугольника. Вы можете использовать любую другую часть многоугольника, если хотите. Преобразуйте это в глобальную пиксельную координату на уровне масштабирования 19: https://msdn.microsoft.com/en-us/library/bb259689.aspx (LatLongToPixelXY)
  • Прокрутите каждое местоположение в MapPolygon и вычислите его глобальную координату пикселя на уровне масштабирования 19.
  • Вычислить координаты повернутого пикселя: http://homepages.inf.ed.ac.uk/rbf/HIPR2/rotate.htm
  • Преобразовать координаты пикселя обратно в пространственные местоположения на уровне масштабирования 19(PixelXyToLatLong)
  • Передайте новые рассчитанные местоположения в MapPolygon.

Наилучшим подходом к тому, что вы пытаетесь, будет использование элемента XAML и добавление его в качестве дочернего элемента в элемент управления карты. Вы можете прикрепить XAML к карте в одной точке (либо стрелка, либо центр). Попытка обновить многоугольник каждый кадр не будет очень быстрым или плавным, поэтому вы действительно не хотите использовать многоугольник карты. Некоторые из ссылок, предложенных выше, предполагают, что карта всегда находится в проекции Меркатора и повернута на север и не наклонена, что не всегда верно для карты UWP, поэтому я бы не рекомендовал использовать такой подход.

Другие вопросы по тегам