
такой вопрос, у меня есть растровая карта сделанная с SAS.Планета, я знаю GPS координаты левого верхнего угла и нижнего правого угла, и теперь на основе растровых координат (XY) мне нужно знать GPS координаты на этой карте (ну и обратное преобразование тоже).
в принципе я это сделал (Delphi), но по широте получается погрешность, координаты уползают вверх ближе к центру растровой карты, видимо я не учитываю кривизну планеты, туго у меня с математикой
 может кто нить поможет с этим?
 может кто нить поможет с этим? 
вот код на Delphi, для преобразования растровых координат в 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;