Преобразование кординат

Форум для обсуждения деталей разработки программы SAS.Планета

Модераторы: vdemidov, Tolik

Re: Преобразование кординат

Сообщение vasketsov » 22 фев 2012, 22:22

uniquename писал(а):в широту/долготу добавить линейные размеры и обратно получить широту долготу

Это делается через LonLat2Metr и обратную.
Если смещение в метрах - надо учесть (поделить на или умножить на - смотря чего и с какой стороны учитывать) косинус широты.
Так (в частности) сдвиг подложки космоснимка делается (независимый от зума).
vasketsov
Специалист
 
Сообщения: 901
Зарегистрирован: 25 июл 2009, 21:15
Благодарил (а): 0 раз.
Поблагодарили: 193 раз.

Re: Преобразование кординат

Сообщение uniquename » 23 фев 2012, 00:37

По сути, мне надо начертить сектор, с центром в выбранной точке, чтоб особо не заморачиваться с рисованием решил использовать существующий вариант прорисовки полигона, вобщем начертить чуть угловатый сектор с помощью полигона. Я нашел вроде как получить координаты точки в LonLat формате.
Теперь надо расчитать в таком же формате еще несколько точек. То есть мне надо конвертануть LonLat в х,y - смещение в км от какой-то точки. Я так понял
LonLat2Metr что-то вроде этого и делает.

Относительно какой точки это смещение?
если бы скажем полученные x,y - были расстоянием от верхнего левого угла (та хоть от центра экрана), то дальше рассчитать точки не проблема.

Ну а потом обратно в LonLat рассчитанные точки, через ILonLatPolygonLine - ILonLatPolygon и через кучу всяких классов, методов и рисовать.
uniquename
Новичок
 
Сообщения: 7
Зарегистрирован: 02 фев 2012, 14:48
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Преобразование кординат

Сообщение vasketsov » 23 фев 2012, 02:16

uniquename писал(а):Относительно какой точки это смещение?

Хоспаде. Это перевод в метрику и обратно с эллипсоида. Подробности - в вики по слову "Меркатор".

uniquename писал(а):если бы скажем полученные x,y - были расстоянием от верхнего левого угла (та хоть от центра экрана), то дальше рассчитать точки не проблема

Надо рисовать в экранных кооржинатах, или "на эллипсоиде"? Это совершнно разные вещи.

Если VMetrDiff: TDoublePoint - это смещение, на которое надо сдвинуть точку AXY_Pont: TDoublePoint, а asign: ShortInt - это направление сдвига (удобно передавать отдельный признак 1 или -1, чтобы оборачивать сдвиг без правки ег овеличин) то:
1. Если считаем с косинусом широты - для реальных длин - то VCos:=asign/cos(AXY_Pont.Y*(pi/180)), иначе VCos:=asign (при этом длины будут в "попугаях" в зависимости от широты).
2. Дальше выполняем нечто такое:
Vmetr:=FCurrentMap.GeoConvert.LonLat2Metr(AXY_Pont);
Vmetr.X:=Vmetr.X+VCos*VMetrDiff.X;
Vmetr.Y:=Vmetr.Y+VCos*VMetrDiff.Y;
AXY_Pont:=FCurrentMap.GeoConvert.Metr2LonLat(Vmetr);

Если рисовать сектор как ГМТ, равноудалённых от центра окружности сектор внутри некоторого угла - соответственно считать надо с косинусом ширины.
Разбить дугу сектора на N точек и для каждой посчитать смещение в метрах относительно центра (по x и y).
А дальше позвать описанную выше методу для каждой точки на дуге сектора, то есть AXY_Pont - будет центр окружности сектора, а VMetrDiff - соответственно смещения в метрах для каждой точки.
Это будет верно, если окружность не слишком большая.
vasketsov
Специалист
 
Сообщения: 901
Зарегистрирован: 25 июл 2009, 21:15
Благодарил (а): 0 раз.
Поблагодарили: 193 раз.

Re: Преобразование кординат

Сообщение Parasite » 23 фев 2012, 09:25

uniquename писал(а):По сути, мне надо начертить сектор, с центром в выбранной точке, чтоб особо не заморачиваться с рисованием решил использовать существующий вариант прорисовки полигона, вобщем начертить чуть угловатый сектор с помощью полигона. Я нашел вроде как получить координаты точки в LonLat формате.

А как это всё относится к разработке программы SAS.Планета (см.название раздела форума) во славу всех юзверей? Данный раздел кагбэ вовсе не для обсуждений всяких личных поделок и дерганий готовых кусков кода САСа к себе, пардон.
The only difference between me and a mad man is that I am not mad. /Salvador Dali/
Изображение
Аватара пользователя
Parasite
Администратор
 
Сообщения: 5613
ICQ: 15819243
Зарегистрирован: 23 окт 2008, 17:38
Благодарил (а): 119 раз.
Поблагодарили: 439 раз.

Re: Преобразование кординат

Сообщение uniquename » 23 фев 2012, 14:42

А как это всё относится к разработке программы SAS.Планета (см.название раздела форума) во славу всех юзверей?

Ок, как представитель все плодящихся "юзверей" постараюсь Вас больше не задалбывать, просто суть вопроса была в алгоритме процедуры переобразования координат LonLat2Metr, там же ни строчки комментов ;)
скрытый текст: показать
Вспомнил, что раньше такое делал так:
function GetGPSFromLinear(lat1, lon1, x,y : extended): TMCoord;// широта долгота базовой точки, х, у - смещение, км (ось у - вниз)
var
min_merid: extended; // длина 1 минуты меридиана
min_lon: extended; // длина 1 минуты параллели
Rz: extended; //приведенный радиус Земли для нашей широты, для упрощенного расчета смещения делаем из Земли сферу с радиусом от точки где мы стоим до центра Земли
r_lat: extended; // радиус кружности на нашей широте;
begin
min_merid:=(1852.25-9.31*cos(2*lat1*pi/180))/1000;
Rz:=min_merid*60*360/2/pi;
r_lat:=Rz*cos(lat1*pi/180);
min_lon:=2*pi*r_lat/360/60;

result[1]:=lat1-y/min_merid/60;
result[2]:=lon1+X/min_lon/60;

end;
Последний раз редактировалось uniquename 23 фев 2012, 15:45, всего редактировалось 1 раз.
uniquename
Новичок
 
Сообщения: 7
Зарегистрирован: 02 фев 2012, 14:48
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Преобразование кординат

Сообщение vasketsov » 23 фев 2012, 14:46

uniquename писал(а):LonLat2Metr, там же ни строчки комментов ;)

Это пистеац просто. Я же посылал в вики про меркатора (конкретно про проекцию на эллипсоид) читать. Там и с комментариями, и с "доказательствами", и для гугла, и для яндекса. И даже обратное преобразование.
vasketsov
Специалист
 
Сообщения: 901
Зарегистрирован: 25 июл 2009, 21:15
Благодарил (а): 0 раз.
Поблагодарили: 193 раз.

Пред.

Вернуться в Раздел для разработчиков программы SAS.Планета

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

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