В свое время помучился в поисках приемлемой и бесплатной технологии для отображения географических карт.
Пришлось написать самому. Вот выкладываю. Оформлено в виде geosys.dll Скачать geosys.dll на сайте BatonnSoft
Для преобразований используется азимутальная проекция. Такая проекция получаются путем переноса по определенному закону земной поверхности на плоскость, касательную к земному шару. Касательной точкой карты является центральная точка. Также пможно выбрать вид проекции: гномоническую, стереографическую или гномоническую (см. рисунок ниже).
Математическое обеспечение проекции карты разработано в соответствии с руководством "Map Projections - A Working Manual", Jonh P. Snyder, United States Government Printing Office, Washington, 1987. При этом Земля принимается за шар с радиусом 6371,2 км, что вполне приемлемо для многих практических задач.
Данная библиотека может быть свободно использована в любых проектах с условием указания авторства (ссылки на эту страничку). Ниже приведены примеры вызова функций библиотеки.
C#:
//прямые формулы проекции возвращают декартовы координаты точки карты в системе координат экрана в метрах
//double Fp, double Lp, - широта и долгота точки в градусах, double Fn, double Ln - широта и долгота центральной точки,
//int ptyp - тип проекции карты, int xnul, int ynul - координаты центральной точки в метрах в системе координат экрана
[DllImport("geosys.dll")]
public static extern int ForwardProjectionX(double Fp, double Lp, double Fn, double Ln, int ptyp, int xnul, int ynul);
[DllImport("geosys.dll")]
public static extern int ForwardProjectionY(double Fp, double Lp, double Fn, double Ln, int ptyp, int xnul, int ynul);
//обратные формулы проекции возвращают широту и долготу точки карты
//int valueX, int valueY - декартовы координаты точки карты в системе координат экрана в метрах,
//double nullF, double nullL - широта и долгота центральной точки,
//int ptyp - тип проекции карты, int xnul, int ynul - координаты центральной точки в метрах в системе координат экрана
[DllImport("geosys.dll")]
public static extern double InvertProjectionLat(int valueX, int valueY, double nullF, double nullL, int ptyp, int xnul, int ynul);
[DllImport("geosys.dll")]
public static extern double InvertProjectionLong(int valueX, int valueY, double nullF, double nullL, int ptyp, int xnul, int ynul);
Delphi:
type //тип GPS координаты (широта и долгота в Double-формате)
TGPSCoordinate = record
F: Double;
L: Double;
end;
type //типы проекций глобуса на карту
{$MinEnumSize 1}
TProjectionType =
(ptAzOrt, //Azimutal Orthographic
ptAzSte, //Azimutal Stereographic
ptAzGnm);//Azimutal Gnomonic
type //тип декартовы координаты (координаты карты в системе TCanvas)
TDekartCoordinate = record
x: Integer;
y: Integer;
end;
//прямая формула проекции value координаты точки, null координаты репера
function ForwardProjection(value, null: TGPSCoordinate; typ: TProjectionType; x, y: Integer): TDekartCoordinate;
stdcall; external 'geosys.dll';
//обратная формула проекции value координаты точки, null координаты репера
function InvertProjection(value: TDekartCoordinate; null: TGPSCoordinate; typ: TProjectionType; x, y: Integer): TGPSCoordinate;
stdcall; external 'geosys.dll';