Разместите координаты GPS на изображении карты без внешнего APIC#

Место общения программистов C#
Anonymous
Разместите координаты GPS на изображении карты без внешнего API

Сообщение Anonymous »

Сейчас я работаю над трекером путешествий. Цель состоит в том, чтобы разместить некоторые координаты GPS (зарегистрированные устройством GPS) на статической карте изображений, загруженной с MapQuest (или OpenStreetMap).
Для достижения этой цели я выполнил следующую процедуру:
  • Найдите центр моего набора координат GPS ((maxLat-minLat)/2, (maxLon-minLon)/2)
  • Загрузить карту 3840x3840 (на данный момент с фиксированным масштабом 15) с центром в моем «центре набора координат» из MapQuest.
  • Используя проекцию Меркатора (я пробую как сферическую, так и эллиптическую с EPSG:4326 или EPSG:3857), получить (X,Y) центра в метрах
  • Для каждой точки моей set
  • Получите точку (X,Y) с помощью проекции Меркатора
  • Вычтите точку (X,Y) до центра (X,y)
  • Преобразуйте метры в пиксели в соответствии с уровнем масштабирования и шириной карты (плитки?) (я пробовал и ширину плитки (256), и ширину карты (3840)
К сожалению, за неделю исследований и попыток мне не удалось определить эту точку зрения.

Есть ли у кого-нибудь полное решение для такого рода проблем?

Спасибо

Редактировать № 1

(Удалено: противоречиво)

Редактировать №2

Вот чистый пример проекта

https://dl.dropboxusercontent.com/u/429 ... Sample.zip
  • Путь поворачивается на 90 ° (обман @MainWindow.xaml.cs:L130)
  • Путь сплющен.
Img:
https://dl.dropboxusercontent.com/u/429 ... Sample.jpg

Изменить № 3

Добавлено несколько формул

Географические координаты > Модификация ToMercator()

Код: Выделить всё

public System.Windows.Point ToMercator(int test = 0)
{
System.Windows.Point mercator;
double x = this.Longitude.ToMercator(test);
double y = this.Latitude.ToMercator(test);
mercator = new System.Windows.Point(x, y);
return mercator;
}
GeographicCoordinate > Модификация ToMercator()

Код: Выделить всё

public double ToMercator(int test = 0)
{
double result = 0;
switch (this.Type)
{
case(GeographicCoordinateType.Longitude):
switch (test) {
case 0:
return this.DecimalDegrees.ToRadians() * Maps.EarthGreatRadius;
case 1:
//http://jackofalltradesdeveloper.blogspot.be/2012/03/how-to-project-point-from-geography-to.html
return this.DecimalDegrees * 0.017453292519943 * 6378137;
case 2:
//http://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/
return this.DecimalDegrees * 20037508.34 / 180;
}
break;
case(GeographicCoordinateType.Latitude):
switch (test)
{
case 0:
double latitude = this.DecimalDegrees;
if (latitude > 89.5)
{
latitude = 89.5;
}
if (latitude < -89.5)
{
latitude = -89.5;
}
double temp = Maps.EarthGreatRadius / Maps.EarthGreatRadius;
double es = 1.0 - (temp * temp);
double eccent = Math.Sqrt(es);
double phi = latitude.ToRadians();
double sinphi = Math.Sin(phi);
double con = eccent * sinphi;
double com = 0.5 * eccent;
con = Math.Pow((1.0 - con) / (1.0 + con), com);
double ts = Math.Tan(0.5 * ((Math.PI * 0.5) - phi)) / con;
double y = 0 - Maps.EarthGreatRadius * Math.Log(ts);
return y;
case 1:
double FSin = Math.Sin(this.DecimalDegrees.ToRadians());
return 6378137 / 2.0 * Math.Log((1.0 + FSin) / (1.0 - FSin));
case 2:
y  = Math.Log(Math.Tan((90 + this.DecimalDegrees) * Math.PI / 360)) / (Math.PI / 180);
return y * 20037508.34 / 180;
}
break;
default:
throw new Exception();
}
return result;
}
Редактирование № 4

Я пробовал формулы кратных чисел и библиотеку Proj.Net, у меня всегда получалась одна и та же форма (-90° и& «сплющенная»)

Вернуться в «C#»