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

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

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

Аватара пользователя
garl
Гуру
Сообщения: 1625
Зарегистрирован: 16 июл 2008, 14:40
Откуда: Краснодар, Кубанская столица.
Благодарил (а): 97 раз
Поблагодарили: 272 раза

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

Сообщение garl »

как привести в божеский вид вот это хозяйство:

Код: Выделить всё

"location":{"x":4337215.0632000007,"y":5658633.8079999983}


преобразование туда есть в rosreestr_cadastr.zmp

Код: Выделить всё

var i:integer;
        xy:TPoint;
        topLeftM,bottomrightM,LL:TDoublePoint;
begin
 xy.x:=GetX*256;
 xy.y:=GetY*256;
 LL:=Converter.Pos2LonLat(XY,GetZ+7);
 topLeftM:=Converter.LonLat2Metr(LL);
 xy.x:=(GetX+1)*256;
 xy.y:=(GetY+1)*256;
 LL:=Converter.Pos2LonLat(XY,GetZ+7);
 bottomrightM:=Converter.LonLat2Metr(LL);
 ResultURL:=GetURLBase+'bbox={"xmin":'+RoundEx(topLeftM.x,8)+',"ymin":'+RoundEx(topLeftM.y,8)+',"xmax":'+RoundEx(bottomrightM.x,8)+',"ymax":'+RoundEx(bottomrightM.y,8)+',"spatialReference":{"wkid":102113}}&bboxSR=102113&imageSR=102113&size=256,256&f=image';
end.

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

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

Сообщение vdemidov »

Ничего готового нету.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
garl
Гуру
Сообщения: 1625
Зарегистрирован: 16 июл 2008, 14:40
Откуда: Краснодар, Кубанская столица.
Благодарил (а): 97 раз
Поблагодарили: 272 раза

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

Сообщение garl »

собственно в i_CoordConverter.pas
бывает функция обратная вот этой

Код: Выделить всё

// ?????????
    function LonLat2Metr(const Ll: TDoublePoint): TDoublePoint; stdcall;
Russian NDN Team
QIP NightlyTester
Аватара пользователя
vdemidov
Гуру
Сообщения: 1687
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 191 раз
Поблагодарили: 157 раз

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

Сообщение vdemidov »

Я не понимаю что LonLat2Metr делает, и уж тем более не представляю как писать обратную.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
garl
Гуру
Сообщения: 1625
Зарегистрирован: 16 июл 2008, 14:40
Откуда: Краснодар, Кубанская столица.
Благодарил (а): 97 раз
Поблагодарили: 272 раза

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

Сообщение garl »

главное не поломать то как она сейчас работает, ибо она используется для zmp.
а обратную щас буду придумывать.
Russian NDN Team
QIP NightlyTester
zOn
Советчик
Сообщения: 254
Зарегистрирован: 03 фев 2009, 01:05
Благодарил (а): 25 раз
Поблагодарили: 19 раз

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

Сообщение zOn »

видимо придется писать.
я не шибко понимаю в буржуйском, но может быть поможет
и делфи
Аватара пользователя
garl
Гуру
Сообщения: 1625
Зарегистрирован: 16 июл 2008, 14:40
Откуда: Краснодар, Кубанская столица.
Благодарил (а): 97 раз
Поблагодарили: 272 раза

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

Сообщение garl »

будете смеяться но в EXCEL'e рассчитал формулы. пока всё сходится. провожу отладку.
Russian NDN Team
QIP NightlyTester
vasketsov
Специалист
Сообщения: 901
Зарегистрирован: 25 июл 2009, 21:15
Поблагодарили: 193 раза

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

Сообщение vasketsov »

скрытый текст: показать
// из конвертилки росреестра

const
PIPI = 3.1415926535897932384626433832795;
RADRAD = 180.000000 / PIPI;
EARTH_RADIUS = 6378137.000000;
PIRAD = PIPI * EARTH_RADIUS;
PIRAD_180 = PIRAD / 180.000000;

type
TPolygonPoint=record
start_pos: Integer;
lat: Extended;
lon: Extended;
x: Extended;
y: Extended;
end;
PPolygonPoint=^TPolygonPoint;

function _X_to_LON(v: Extended): Extended;
begin
Result := v/PIRAD_180
end;

function _Y_to_LAT(v: Extended): Extended;
begin
Result := v / PIRAD_180;
Result := Result / RADRAD;
Result := exp(Result);
Result := ArcTan(Result);
Result := (2 * RADRAD * Result) - 90;
end;

procedure _LONLAT_to_XY(p: PPolygonPoint);
begin
p^.x:=p^.lon*PIRAD_180;

p^.y:=((p^.lat+90) / 2) / RADRAD;
p^.y:=tan(p^.y);
p^.y:=ln(p^.y);
p^.y:=p^.y*RADRAD;
p^.y:=p^.y*PIRAD_180;
end;


// из конвертилки роскосмоса

procedure _meters_to_lonlat(const x,y: Extended; out lon,lat: Extended);
begin
lon := x / PIRAD_180;

lat := y / PIRAD_180;
lat := lat / RADRAD;
lat := exp(lat);
lat := ArcTan(lat);
lat := (2 * RADRAD * lat) - 90;
end;

procedure _lonlat_to_meters(plon,plat: PExtended; px,py: PExtended);
begin
px^:=plon^*PIRAD_180;

py^:=((plat^+90) / 2) / RADRAD;
py^:=tan(py^);
py^:=ln(py^);
py^:=py^*RADRAD;
py^:=py^*PIRAD_180;
end;

// выбирай любой )))
uniquename
Новичок
Сообщения: 7
Зарегистрирован: 02 фев 2012, 14:48

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

Сообщение uniquename »

надо сделать следующее:
к точке курсора, преобразованной с помощью VConverter.PixelPosFloat2LonLat в широту/долготу добавить линейные размеры и обратно получить широту долготу.

Что из функций юнита i_CoordConverter можно для этого заюзать, вроде есть такая функция
// Преобразует географические коодинаты в относительные координаты на карте
function LonLat2Relative(const XY: TDoublePoint): TDoublePoint; stdcall;//TODO: Автотест

но что она возвращает, относительные координаты в какой единице измерение и относительно чего?
zed
Гуру
Сообщения: 2888
Зарегистрирован: 16 авг 2008, 20:21
Благодарил (а): 89 раз
Поблагодарили: 568 раз

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

Сообщение zed »

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

Линейные размеры чего и в каких единицах?
Ответить

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