Растровые координаты в GPS координаты

Системы координат, проекции, преобразования, привязка
Ответить
DriveSoft
Новоприбывший
Сообщения: 2
Зарегистрирован: 01 июл 2009, 11:56
Репутация: 0

Растровые координаты в GPS координаты

Сообщение DriveSoft » 01 июл 2009, 12:11

Приветствую :)

такой вопрос, у меня есть растровая карта сделанная с 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;

geologic
Гуру
Сообщения: 852
Зарегистрирован: 15 сен 2005, 13:19
Репутация: 6
Откуда: москва
Контактная информация:

Re: Растровые координаты в GPS координаты

Сообщение geologic » 01 июл 2009, 13:13

Вам алгоритмы нужны? Они обсосаны мега раз: гугл мапс это меркатор на сфере, остальные - на эллипсоиде WGS и довольно простые формулы существуют. Вот здесьразложено по полочкам. Тексты программ обсуждались вот тут, с участием авторов основных пакетов, там же и коды есть, если вам они ближе формул, ну и обсуждение, если оно статей поинтереснее кажется.

Да, а зачем, кстати, SAS ведь выдает любые гео-привязки самостоятельно? Опять велосипед?! ;)

DriveSoft
Новоприбывший
Сообщения: 2
Зарегистрирован: 01 июл 2009, 11:56
Репутация: 0

Re: Растровые координаты в GPS координаты

Сообщение DriveSoft » 02 июл 2009, 10:12

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

// вычисляем координаты в милисекундах на основе XY
latMsTotal0 := latMsTotal0 - Round(latPX * Y); // ШИРОТА
lngMsTotal0 := lngMsTotal0 + Round(lngPX * X); // ДОЛГОТА

я так понимаю именно в ней должна быть поправка по каким нибудь синусам :)

Ответить

Вернуться в «Координаты и привязка»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость