2016-12-28 4 views
0

Мне нужно нарисовать пользовательскую карту изображений парка в моем приложении и добавить на нее маркеры gps show.Как нарисовать маркер gps на повернутой пользовательской картинной карте

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

У меня есть координаты GPS из всех четырех углов реальной карты вместе с GPS-координатами маркеров, но я зациклился на том, как вычислить позицию (x, y) для каждого маркера для карты в моем приложении, где карта отображается как прямой прямоугольник.

Любые предложения приветствуются!

Custom image map

код, который я до сих пор:

public class GeoLocation 
    { 
     public double Lattitude { get; set; } 

     public double Longitude { get; set; } 

     public GeoLocation() 
     { 
     } 

     public GeoLocation(double lat, double lon) 
     { 
      Lattitude = lat; 
      Longitude = lon; 
     } 

     public double Angle(GeoLocation point) 
     { 
      var deltaX = point.Lattitude - Lattitude; 
      var deltaY = point.Longitude - Longitude; 
      return (Math.Atan2(deltaY, deltaX)); 
     } 

     public GeoLocation Rotate(GeoLocation center, double angleInRad) 
     { 
      var s = Math.Sin(angleInRad); 
      var c = Math.Cos(angleInRad); 

      // translate point back to origin: 
      var x = (double)(Lattitude - center.Lattitude); 
      var y = (double)(Longitude - center.Longitude); 

      // rotate point 
      var xnew = x * c - y * s; 
      var ynew = x * s + y * c; 

      // translate point back: 
      x = xnew + center.Lattitude; 
      y = ynew + center.Longitude; 
      return new GeoLocation(x, y); 
     } 
    } 
     public partial class MainWindow : Window 
     { 
      public MainWindow() 
      { 
       InitializeComponent(); 
       var url = "file://c:\\db\\mapgrab.jpg"; 
       var bitmap = new BitmapImage(); 
       bitmap.BeginInit(); 
       bitmap.UriSource = new Uri(url, UriKind.Absolute); 
       bitmap.CacheOption = BitmapCacheOption.OnLoad; 
       bitmap.EndInit(); 
       mapImg.Source = bitmap; 


       var TopLeftGps = new GeoLocation(52.11070994543701, 4.411896866166349); 
       var TopRightGps = new GeoLocation(52.11475153599096, 4.415646979517055); 
       var BottomRightGps = new GeoLocation(52.1117075980591, 4.424232274309553); 
       var currentPosGps = new GeoLocation(52.11129692591393, 4.4174530542349295); 

       var imageWidth = 702; 
       var imageHeight = 924; 
       var angle = TopLeftGps.Angle(TopRightGps); 
       var topRight = TopRightGps.Rotate(TopLeftGps, -angle); 
       var bottomRight = BottomRightGps.Rotate(TopLeftGps, -angle); 
       var maxX = topRight.Lattitude - TopLeftGps.Lattitude; 
       var maxY = bottomRight.Longitude - topRight.Longitude; 

       var markerPos = new GeoLocation(currentPosGps.Lattitude, currentPosGps.Longitude).Rotate(TopLeftGps, -angle); 
       var diffX = markerPos.Lattitude - TopLeftGps.Lattitude; 
       var diffY = markerPos.Longitude - TopLeftGps.Longitude; 
       var percentageX = diffX/maxX; 
       var percentageY = diffY/maxY; 
       var posX = percentageX * imageWidth; 
       var posY = percentageY * imageHeight; 


       var markerImg = new Border(); 
       markerImg.Background = new SolidColorBrush(Colors.Red); 
       markerImg.Width = 32; 
       markerImg.Height = 32; 
       Canvas.SetLeft(markerImg, posX); 
       Canvas.SetTop(markerImg, posY); 
       canvas.Children.Add(markerImg); 
      } 
     } 
    } 

ответ

0

Что you'r ищет это вращение преобразования 2D с севером выровнены координат (x,y) к вашим повернутым координатам (x',y')

вращения может быть представлена ​​как матрица 2x2 R, и если мы представляем координаты как векторы столбцов, то вычисление будет:

[x',y']=R*[x,y]

Где * находится matrix multiplication, R является

enter image description here

и угол тета является требуемым углом поворота.


Маркировка угловых точек, таким образом: enter image description here

тета может быть вычислена Be решения (например, в wolframAlpha):

тангенс (тета) = (Ай-Dy)/(Ax- Dx)