Autor Zpráva
Jakub Škorpík
Profil
Zdravím,

plním svoji databázi z XML výstupů RUIAN. Pro každou obec, ulici, adresu mám zadané GPS souřadnice v souřadném systému S-JTSK (například 782757.00 973095.00). Potřeboval bych funkci, která by mi tyto souřadnice přepočítala fo formátu Lat/Long, který se dá později využívat v Google Mapách (ty S-JTSK systém neumí).

Hledal jsem snad úplně všude, ale jak to udělat jsem nenašel. Využívat Geocoder GoogleMap se mi nechce, protože by se import několika milionů záznamů hodně zpomalil.

Používám PHP a MySQL.

Nevyzná se tu v tom někdo?

Díky moc.
Alphard
Profil
Co třeba www.alena.ilcik.cz/gps/souradnice/JTSKtoWGS.htm?
Jakub Škorpík
Profil
Alphard:
To se mi podařilo najít cca 10 minut po tom, co jsem sem položil dotaz :) ale díky!


Přikládám navíc funkční kód z těchto stránek přepsaný do PHP.

    function calc($x,$y,$h=200){                
        /*Vypocet zemepisnych souradnic z rovinnych souradnic*/
        $a=6377397.15508; 
        $e=0.081696831215303;
        $n=0.97992470462083; 
        $konst_u_ro=12310230.12797036;
        $sinUQ=0.863499969506341; 
        $cosUQ=0.504348889819882;
        $sinVQ=0.420215144586493; 
        $cosVQ=0.907424504992097;
        $alfa=1.000597498371542; 
        $k=1.003419163966575;
        $ro=sqrt($x*$x+$y*$y);
        $epsilon=2*atan($y/($ro+$x));
        $D=$epsilon/$n; 
        $S=2*atan(exp(1/$n*log($konst_u_ro/$ro)))-M_PI_2;
        $sinS=sin($S);
        $cosS=cos($S);
        $sinU=$sinUQ*$sinS-$cosUQ*$cosS*cos($D);
        $cosU=sqrt(1-$sinU*$sinU);
        $sinDV=sin($D)*$cosS/$cosU; 
        $cosDV=sqrt(1-$sinDV*$sinDV);
        $sinV=$sinVQ*$cosDV-$cosVQ*$sinDV; 
        $cosV=$cosVQ*$cosDV+$sinVQ*$sinDV;
        $Ljtsk=2*atan($sinV/(1+$cosV))/$alfa;
        $t=exp(2/$alfa*log((1+$sinU)/$cosU/$k));
        $pom=($t-1)/($t+1);
        do {
            $sinB=$pom;
            $pom=$t*exp($e*log((1+$e*$sinB)/(1-$e*$sinB))); 
            $pom=($pom-1)/($pom+1);
        } 
        while (abs($pom-$sinB)>0.000000000000001);
        $Bjtsk=atan($pom/sqrt(1-$pom*$pom));
    
    
        /* Pravoúhlé souřadnice ve S-JTSK */   
        $a=6377397.15508; 
        $f_1=299.152812853;
        $e2=1-(1-1/$f_1)*(1-1/$f_1); 
        $ro=$a/sqrt(1-$e2*sin($Bjtsk)*sin($Bjtsk));
        $x=($ro+$H)*cos($Bjtsk)*cos($Ljtsk);  
        $y=($ro+$H)*cos($Bjtsk)*sin($Ljtsk);  
        $z=((1-$e2)*$ro+$H)*sin($Bjtsk);
        
        /* Pravoúhlé souřadnice v WGS-84*/
        $dx=570.69; 
        $dy=85.69; 
        $dz=462.84; 
        $wz=-5.2611/3600*M_PI/180;
        $wy=-1.58676/3600*M_PI/180;
        $wx=-4.99821/3600*M_PI/180; 
        $m=3.543*pow(10,-6); 
        $xn=$dx+(1+$m)*($x+$wz*$y-$wy*$z); 
        $yn=$dy+(1+$m)*(-$wz*$x+$y+$wx*$z); 
        $zn=$dz+(1+$m)*($wy*$x-$wx*$y+$z);
        /* Geodetické souřadnice v systému WGS-84*/
        $a=6378137.0; 
        $f_1=298.257223563;
        $a_b=$f_1/($f_1-1); 
        $p=sqrt($xn*$xn+$yn*$yn); 
        $e2=1-(1-1/$f_1)*(1-1/$f_1);
        $theta=atan($zn*$a_b/$p); 
        $st=sin($theta); 
        $ct=cos($theta);
        $t=($zn+$e2*$a_b*$a*$st*$st*$st)/($p-$e2*$a*$ct*$ct*$ct);
        $B=atan($t);  
        $L=2*atan($yn/($p+$xn));  
        $H=sqrt(1+$t*$t)*($p-$a/sqrt(1+(1-$e2)*$t*$t));
    
        /* Formát výstupních hodnot */   
        $B=$B/M_PI*180;                   
        //$sirka="N";
        if ($B<0){
            $B=-$B; 
            //$sirka="S";
        }
        $stsirky=floor($B);  
        $B=($B-$stsirky)*60; 
        $minsirky=floor($B);
        $B=($B-$minsirky)*60; 
        $vtsirky=round($B*1000)/1000;
        //$sirka=$sirka+$stsirky+"°"+$minsirky+"'"+$vtsirky;
        $gps = $stsirky.' '.$minsirky.' '.$vtsirky;
        
        $L=$L/M_PI*180;  
        //$delka="E";         
        if ($L<0){
            $L=-$L; 
            //$delka="W";
        }
        $stdelky=floor($L);  
        $L=($L-$stdelky)*60; 
        $mindelky=floor($L);
        $L=($L-$mindelky)*60; 
        $vtdelky=round($L*1000)/1000;
        //$delka=$delka+$stdelky+"°"+$mindelky+"'"+$vtdelky;
        $gps .= ' '.$stdelky.' '.$mindelky.' '.$vtdelky;
        
        return $gps;
    }

Do parametrů x a y stačí předat hodnoty souřadnic v systému S-JTSK (parametr h - výška je volitelný, protože se ne vždy uvádí a nastavený na defaultní hodnotu). Funkce vrátí GPS souřadnice v systému WGS84, se kterým už spolupracují Google Mapy.

Zakomentované části slouží akorát pro odlišný zápis souřadnic. Nechal jsem je tam, kdyby někdo potřeboval.
MartinProchazka
Profil *
Dobrý den,
ať zadám jakoukoli souřadnici, téměř vždy mi to vychází někam do Německa. Zkusil jsem i tu Vaši 782757.00 973095.00. Je možné, že jsem někde udělal chybu, přepisoval jsem to do C#, ale je to již několikerý kód (s odlišnostmi, z různých zdrojů) a vždy končím v Německu. Máte s tím někdo zkušenost nebo radu, v čem mohu dělat chybu?
Geodet
Profil *
MartinProchazka:
Zkuste převádět zde, tam je vše fukční
http://www.estudanky.eu/prevody-souradnic
Tomáš M.
Profil *
MartinProchazka:
Resil jsme podobný problém, a vyresil. Zkus prohodit X za Y, popř přehodit znaménka pred jstk souradnicemi.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: