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

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

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

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

Сообщение garl » 12 дек 2011, 12:16

как привести в божеский вид вот это хозяйство:
Код: Выделить всё
"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
Аватара пользователя
garl
Гуру
 
Сообщения: 1621
Зарегистрирован: 16 июл 2008, 14:40
Откуда: Краснодар, Кубанская столица.
Благодарил (а): 96 раз.
Поблагодарили: 241 раз.

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

Сообщение vdemidov » 12 дек 2011, 13:16

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

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

Сообщение garl » 12 дек 2011, 13:19

собственно в i_CoordConverter.pas
бывает функция обратная вот этой
Код: Выделить всё
// ?????????
    function LonLat2Metr(const Ll: TDoublePoint): TDoublePoint; stdcall;
Russian NDN Team
QIP NightlyTester
Аватара пользователя
garl
Гуру
 
Сообщения: 1621
Зарегистрирован: 16 июл 2008, 14:40
Откуда: Краснодар, Кубанская столица.
Благодарил (а): 96 раз.
Поблагодарили: 241 раз.

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

Сообщение vdemidov » 12 дек 2011, 13:40

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

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

Сообщение garl » 12 дек 2011, 13:47

главное не поломать то как она сейчас работает, ибо она используется для zmp.
а обратную щас буду придумывать.
Russian NDN Team
QIP NightlyTester
Аватара пользователя
garl
Гуру
 
Сообщения: 1621
Зарегистрирован: 16 июл 2008, 14:40
Откуда: Краснодар, Кубанская столица.
Благодарил (а): 96 раз.
Поблагодарили: 241 раз.

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

Сообщение zOn » 12 дек 2011, 14:01

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

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

Сообщение garl » 13 дек 2011, 00:32

будете смеяться но в EXCEL'e рассчитал формулы. пока всё сходится. провожу отладку.
Russian NDN Team
QIP NightlyTester
Аватара пользователя
garl
Гуру
 
Сообщения: 1621
Зарегистрирован: 16 июл 2008, 14:40
Откуда: Краснодар, Кубанская столица.
Благодарил (а): 96 раз.
Поблагодарили: 241 раз.

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

Сообщение vasketsov » 13 дек 2011, 00:58

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

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;

// выбирай любой )))
vasketsov
Специалист
 
Сообщения: 901
Зарегистрирован: 25 июл 2009, 21:15
Благодарил (а): 0 раз.
Поблагодарили: 193 раз.

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

Сообщение uniquename » 22 фев 2012, 19:42

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

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

но что она возвращает, относительные координаты в какой единице измерение и относительно чего?
uniquename
Новичок
 
Сообщения: 7
Зарегистрирован: 02 фев 2012, 14:48
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

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

Сообщение zed » 22 фев 2012, 21:48

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

Линейные размеры чего и в каких единицах?
Хитрости GoogleEarth - то, чего вы не знаете о гугле
Аватара пользователя
zed
Гуру
 
Сообщения: 2888
ICQ: 357167611
Зарегистрирован: 16 авг 2008, 20:21
Откуда: Беларусь, Могилёв
Благодарил (а): 89 раз.
Поблагодарили: 525 раз.

След.

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

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

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