SASGIS

Веб-картография и навигация

Алгоритм приобразования географических координат в пикселы

программа для загрузки и просмотра спутниковых снимков Земли, Луны, Марса предоставленных сервисами Google Maps и Космоснимки. Возможность работы с GPS приёмником.

Модератор: Tolik

Алгоритм приобразования географических координат в пикселы

Сообщение yurec » 23 июн 2009, 20:03

Заранее прошу прощения если не в ту тему...

Пишу библиотеку для использования Яндекс карт во flex(flash). Читал http://mapbuilder.narod.ru/gm.htm но этот алгоритм даёт погрешности... и как-то сложноват.

Вот собственно ищу более точный алгоритм приобразования географических координат в пиксельные (номер тайла и точка на нём) и обратно.
yurec
Новичок
 
Сообщения: 2
Зарегистрирован: 23 июн 2009, 19:55
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Алгоритм приобразования географических координат в пикселы

Сообщение vdemidov » 23 июн 2009, 20:13

Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз.
Поблагодарили: 157 раз.

Re: Алгоритм приобразования географических координат в пикселы

Сообщение yurec » 23 июн 2009, 20:33

vdemidov писал(а):https://bitbucket.org/azya/sasplanet/src/tip/u_CoordConverterMercatorOnEllipsoid.pas


Код: Выделить всё
42| Result.y := round(TilesAtZoom / 2 - c*(ArcTanh(z)-FExct*ArcTanh(FExct*z)));


FExct ?
yurec
Новичок
 
Сообщения: 2
Зарегистрирован: 23 июн 2009, 19:55
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Алгоритм приобразования географических координат в пикселы

Сообщение vdemidov » 23 июн 2009, 22:29

FExct - Эксцентриситет элипса используемого в данной проекции.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз.
Поблагодарили: 157 раз.

Re: Алгоритм приобразования географических координат в пикселы

Сообщение MbIcJIu » 01 июл 2009, 12:15

могу поделиться своим методом, правда это не совсем то что нужно.


Переводим 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 Планета, то есть, почему?
MbIcJIu
Новичок
 
Сообщения: 2
Зарегистрирован: 01 июл 2009, 11:55
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.


Вернуться в SAS.Планета

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

Сейчас этот форум просматривают: Google [Bot] и гости: 22

cron