могу поделиться своим методом, правда это не совсем то что нужно.
Переводим XY координаты на карте в GPS координаты:
- Код: Выделить всё
function TframeMap.RastrToGPS (x, y: integer): TGPSCoord;
var
latPX, lngPX: Extended; // коэфициенты, сколько в одном пикселе, географических секунд
latMsTotal0, lngMsTotal0: integer; // для перевода начальных GPS координат в милисекунлды
latMsTotal1, lngMsTotal1: integer; // для перевода конечных GPS координат в милисекунлды
latMsTotal, lngMsTotal: integer; // для вычесления, сколько милисекунлд содержит карта, долготы и широты
begin
// MapInfo - содержит сведенья о текущей карте
// узнаем сколько милисекунд всего содержит наша карта
// перереводим левую верхнюю координату в милисекунды
latMsTotal0 := (MapInfo.latDegree0 * 60000) + (MapInfo.latMin0 * 1000) + MapInfo.latMs0;
lngMsTotal0 := (MapInfo.lngDegree0 * 60000) + (MapInfo.lngMin0 * 1000) + MapInfo.lngMs0;
// перереводим правую нижнюю координату в милисекунды
latMsTotal1 := (MapInfo.latDegree1 * 60000) + (MapInfo.latMin1 * 1000) + MapInfo.latMs1;
lngMsTotal1 := (MapInfo.lngDegree1 * 60000) + (MapInfo.lngMin1 * 1000) + MapInfo.lngMs1;
// вычисляем количество милисекунд на нашей карте
latMsTotal := latMsTotal0 - latMsTotal1;
lngMsTotal := lngMsTotal1 - lngMsTotal0;
// вычисляем колво милисекунд в пикселе
latPX := latMsTotal / MapInfo.mapHeight;
lngPX := lngMsTotal / MapInfo.mapWidth;
// вычисляем координаты в милисекундах на основе XY
latMsTotal0 := latMsTotal0 - Round(latPX * Y);
lngMsTotal0 := lngMsTotal0 + Round(lngPX * X);
// переводим милисекунды в GPS координаты
Result.lat := 'N';
Result.latDegree := latMsTotal0 div 60000; // вычисляем кол-во градусов
latMsTotal0 := latMsTotal0 - (Result.latDegree * 60000); // отнимаем от милисекунд, кол-во милисекунд содержащиеся в градусах
Result.latMin := latMsTotal0 div 1000; // вычисляем кол-во минут
latMsTotal0 := latMsTotal0 - (Result.latMin * 1000); // отнимаем от милисекунд, кол-во милисекунд содержащиеся в минутах
Result.latMs := latMsTotal0;
Result.lng := 'E';
Result.lngDegree := lngMsTotal0 div 60000; // вычисляем кол-во градусов
lngMsTotal0 := lngMsTotal0 - (Result.lngDegree * 60000); // отнимаем от милисекунд, кол-во милисекунд содержащиеся в градусах
Result.lngMin := lngMsTotal0 div 1000; // вычисляем кол-во минут
lngMsTotal0 := lngMsTotal0 - (Result.lngMin * 1000); // отнимаем от милисекунд, кол-во милисекунд содержащиеся в минутах
Result.lngMs := lngMsTotal0;
end;
здесь должна быть информация о растре карты, а именно координата левого верхнего и нижнего правого угла карты, а также размеры в пикселях, MapInfo это:
- Код: Выделить всё
TMapInfo = record // для переменной, сожержащую текущие настройки для текущей карты
// координата левой верхней части
lat0: char; //N - S
latDegree0: integer;
latMin0: integer;
latMs0: integer;
lng0: char; //E - W
lngDegree0: integer;
lngMin0: integer;
lngMs0: integer;
// координата правой нижней части
lat1: char; //N - S
latDegree1: integer;
latMin1: integer;
latMs1: integer;
lng1: char; //E - W
lngDegree1: integer;
lngMin1: integer;
lngMs1: integer;
mapWidth: integer;
mapHeight: integer;
end;
где TGPSCoord:
- Код: Выделить всё
TGPSCoord = record
lat: Char;
latDegree: integer; //N - S
latMin: integer;
latMs: integer;
lng: char;
lngDegree: integer; //E - W
lngMin: integer;
lngMs: integer;
end;
к сожалению этот метод с погрешностью, ближе к центру карты, широта уходит вверх, видимо это связано с кривизной планеты, но в математике я не силен чтобы вывести формулу учитывающую это. Может кто нить что нить подскажет?
кстати пробывал использовать карту с гисрусы(переводил в растр), такой погрешности нет, а если взять карсту с SAS Планета, то есть, почему?