[ batro @ 23.04.2012. 11:42 ] @
Pozdrav svima :)

Elem, ja sam pocetnik u PHP ali sam spreman da naucim. PHP mi je prvi programski jezik koji ucim, tako da mi je trebalo i prilagodjavanje na sam nacin razmisljanja itd.

Ucio sam sintaksu, baratanje sa promenljivim vrednostima, operatore, petlje itd itd. Kako sam te osnove zavrsio, krenuo sam u mali projekat.

Projekat je sledeci: Sa sledece web strane https://www.notams.faa.gov/common/nat.html koja se svaki dan menja ja izvlacim samo delove koji su meni potrebni.
To nije bio problem, preg_match() je odradio posao i ja dobijem output ovaj:

A BALIX 61/20 63/30 65/40 65/50 64/60 KAGLY TEFFO
B GOMUP 59/20 61/30 62/40 62/50 60/60 PEPKI LOPVI
C DOGAL 53/20 51/30 49/40 47/50 RONPO COLOR
D MALOT 52/20 50/30 48/40 46/50 URTAK BANCS
E LIMRI 51/20 49/30 47/40 45/50 VODOR RAFIN
F DINIM 50/20 48/30 46/40 44/50 42/60 DOVEY
H BEDRA 48/20 46/30 44/40 42/50 SOORY

E sada, ovi brojevi predstavljaju geografsku duzinu i sirinu pa je npr 61/20 ustavi 61* severne geografske sirfine i 20* zapadne geografske duzine i tako dalje. Nadam se da razumete.

Ja treba da na .gif sliku Atlanskog okeana (http://aviationweather.gov/data/iffdp/2135.gif) uz pomoc PHP dodam prvo tackice koje ce se nalaziti tacno tamo gde treba na slici. Na primer, tackica 61/20 na slici treba da bude na slici na toj g.duzini i sirini.
A onda da napravim liniju koja ce da spaja te tacke.

Nije problem da ja to rucno uradim. Probao sam da za naprimer prvi, A, red to uradim. Prvo sam preko gotove PHP skripte rucno odredio X,Y koordinate za tacke na samoj slici i onda ih nacrtao

Kod ako neko zanima:
Code (php):

<?php
header('Content-type: image/gif;');
$image=imagecreatefromgif('http://aviationweather.gov/data/iffdp/2135.gif');
imagesetthickness($image,10);
// boja kruga
$ellipseColor = imagecolorallocate($image, 0, 0, 255);

// crtamo krugove za track A *
imagefilledellipse($image, 1163, 569, 25, 25, $ellipseColor);
imagefilledellipse($image, 1047, 507, 25, 25, $ellipseColor);
imagefilledellipse($image, 959, 405, 25, 25, $ellipseColor);
imagefilledellipse($image, 852, 382, 25, 25, $ellipseColor);
imagefilledellipse($image, 753, 329, 25, 25, $ellipseColor);
//crtamo linije da poovezuju tacke
imageline($image,1163, 569, 1047, 507, $ellipseColor);
imageline($image,1047, 507, 959, 405, $ellipseColor);
imageline($image,959, 405, 852, 382, $ellipseColor);
imageline($image,852, 382, 753, 329, $ellipseColor);

imagegif($image);

?>
 

To izgleda ovako onda: http://i.imgur.com/lcSRQ.jpg (slikano iz browsera, sve je u PHP nacrtano)

Nije problem napraviti ovo za jedan red, ali kad ih imam vise od 10 i oni se dnevno menjaju to vec predstavlja problem. Zbog toga sam se odlucio za sledecu varijantu. Posto drugi broj, odnosno geografska duzina, moze da ima samo 5 vrednosti: 20, 30, 40, 50, 60, a geograska sirina oko 30 vrednosti, od 40 stepeni geograske sirine do 70 stepeni geograske sirine, odlucio sam da napravim fajl koji ce sadrzati sve moguce kombinacije i njihove koordinate. Fajl bi tako sadrzao X, Y koordinate za 40/20, 41/20, 42/20 itd itd. A onda bih pokusao da uporedim vrednosti dobijene sa preg_match() i iscrtam to na slici. Cime bi mogao da uporedim te vrednosti? foreach() mozda? Ovde bi mi trebala vasa pomoc ako moze.

Da li mozda postoji neka bolja varijanta da se ovo odradi?

Zeleo bih vase savete posto ste svi dosta iskusniji.

Valjda sam ispostovao pravila foruma, ne trazim da mi neko ceo kod ispise, svoj domaci sam uradio, vec da dobijem savet, da li sma na dobrom putu i uopste vase ideje.

Hvala!: )
EDIT: Evo i preg_match() dela koda. U odvojenom, nat.php fajlu.

Code (php):

$nat=file('https://www.notams.faa.gov/common/nat.html');
foreach ($nat as $line)
{
if(preg_match("/[A-F]{1} [A-Z ]*[0-9]{2}\/[0-9]{2} [0-9]{2}\/[0-9]{2} [A-Z0-9\/ ]*/", $line)>0)
     {
          echo $line."<br>";
     }
}

 
?>
 


[Ovu poruku je menjao batro dana 23.04.2012. u 12:52 GMT+1]

[Ovu poruku je menjao batro dana 23.04.2012. u 12:54 GMT+1]
[ ivan.a @ 23.04.2012. 19:14 ] @
Nisam konkretno razumeo pitanje, ali pretpostavljam da hoćeš da unaprediš skriptu.

Prvo što bih ja uradio jeste keširanje slika i podataka.
Sliku bih keširao da bih izbegao generisanje preko GD biblioteke prilikom svakog učitavanja stranice.
Upoređivanje bi se vršilo tako što bih upisao zadnje postavke u neki fajl koji bi nosio isti naziv kao slika (samo sa npr. drugom ekstenzijom).
Na primer: slika1589.jpg, slika1587.dat (ili .txt ...).
Ako podaci nisu isti kao na eksternom sajtu, slika bi se ponovo generisala. U suprotnom se prikazuje keširana slika.
U svakom slučaju ako dođe do neke promene koordinata neophodno je ponovo generisati sliku.
Možda možeš da podeliš sliku na više slika (svaki track posebno), i generišeš samo onaj track koji je ažuriran. Onda bi sliku prikazivao iz delova (tako da izgleda kao jedna).
To je možda i najbolja varijanta (mada zahteva kompleksnu kalkulaciju, jer se neke koordinate mogu preklopiti sa prethodnim trackom/slikom).
[ batro @ 23.04.2012. 19:37 ] @
Sada tek vidim koliko sam bio konfuzan i nerazumljiv. Izvinjavam se.
Elem, konkretno me zanima da li ima neka bolje alternativa da 61/20 npr prenesem automatski u X, Y koordinate za sliku. Znaci kako to mogu lako da uradim?

Trekovi se celokupno menjaju svakog dana, kao i prikaz vetrova itd na slici al to nema uticaj na ovo sto mene zanima.

Za sada me interesuje kako da najlakse pretvorim geografsku duzinu/sirinu pretvorim u X, Y jer je suludo da pravim 200+ kombinacija.

Kada ovo uradim, lako cu da ma ostale nacine optimizujem po vasim savetima.

Hvala na pomoci.
Mislim da je ovo sasvim OK za neki moj nivo, sa ozbirom da se prvi put sa programiranjem susrecem i da sam 1. Razred gimnazije.

Pozdrav,
Batro
[ ivan.a @ 23.04.2012. 20:02 ] @
Mislim da ti je potrebna funkcija koja pretvara dužinu i širinu u x i y koordinate (piksele). Funkcija bi ovako izgledala:

Code:
function latlon_to_pix($lat,$lon) {
    $lat = abs($lat);
    $lon = abs($lon);

    $x_min   = 0; 
    $y_min   = 0;  
        //Veličina slike u pikselima
        $x_max   = 2173;
        $y_max   = 1582;
        //offset mape (od - do )
    $lon_min = 67; $lon_max = 125;
    $lat_min = 23; $lat_max = 50;

    $x = $x_min + ($x_max - $x_min) * 
        ( 1 - ($lon - $lon_min) / ($lon_max - $lon_min) );
    $y = $y_max - ($y_max - $y_min) * 
        ( ($lat - $lat_min) / ($lat_max - $lat_min) );
    return array(intval($x),intval($y));
}

Detaljnije: http://onlamp.com/pub/a/php/2002/11/07/php_map.html?page=2
[ batro @ 23.04.2012. 22:55 ] @
Hvala.
Probacu sutra pa javljam.
Ne znam samo da li ce moci tako zbog 'projekcije' ove moje slike...


Probacu pa javljam.
[ batro @ 24.04.2012. 08:39 ] @
Ne pomaze.
Celo jutro pokusavam da nadjem nesto na netu sto ce mi pomoci, ali ne uspevam.

Treba mi php kod koji ce da pretvori lat/long u X, Y koordinate za sliku sa tim sto sve ovo treba za konusnu projekciju. Sve sto sam nasao na internetu je za Merkatorovu.
[ pajaja @ 24.04.2012. 13:47 ] @
Pozdrav,

mislim da ti je najlakse da ako imas taj konacan skup mogucnosti uradis ono sto si predlozio: izracunas za svaku kombinaciju posebno i posle ih koristis. Recimo u tom php fajlu koji generise sliku napravis jedan array koji ce da sadrzi vrednosti tih koordinata i x,y pozicije na mapi:

Code (php):

$posArr = array(
    ...
    '61/20' => array( 'x' => 200, 'y' => 100);
    ...
);
 


Tako da jednostavno mozes da dobijes x,y pozicije sa $posArr['61/20']['x'], $posArr['61/20']['y'] i nesto slicno.
[ batro @ 24.04.2012. 23:40 ] @
Hvala.
Ako ne uspem nesto da nadjem, uzecu to kao alternativu ali bih voleo da uspem da pretvorim lat long u x,y za konusnu projekciju. Trazio sam svuda po netu, i nije mi jasno kako nigde nema.

Moze li neko pomoci?
[ pajaja @ 25.04.2012. 02:03 ] @
Ne razumem se u mape ali verovatno nema zato sto nacin na koji izracunavas to zavisi od mape do mape, tako da ces morati sam da nadjes formulu po kojoj ces da racunas za ovu konkretnu kartu.
[ batro @ 25.04.2012. 09:12 ] @
Nista onda, ako neko zna kako to mogu da uradim nek' se javi.

Hvala.
[ djoka_l @ 25.04.2012. 10:09 ] @
batro, navijam za tebe, ali ovo gore što si napisao nije stav budućeg programera. Ne možeš da napustiš projekat na prvom problemu sa kojem si se susreo.

Prvo, nije tačni da na netu nema ništa o konusnoj projekciji. Ako odeš na Wikipediju, naći ćeš http://en.wikipedia.org/wiki/Map_projection gde se govori o projekcijama, a tu si pomenute i konusne projekcije. U delu koji govori o konusnim projekcijama, ima link na http://en.wikipedia.org/wiki/Lambert_conformal_conic_projection koja je vrsta konusne projekcije. Na tom linku, postoje formule za transformaciju koordinata:




where






Odmah da ti kažem, da ti ove formule ne trebaju. Tebi treba samo približna vrednost koordinata, uzimajući u obzir koliko je velika tačka kojim obeležavaš poziciju.

E sada, pošto ja nisam preterano ljubazan čovek, da bih ti pomogao, uradi za domaći sledeće stvari (pa ću ti možda pomoći, ako sam ne dođeš do rešenja):
1. Nađi na karti (GIF-u) vrednosti koordinata za sve kombinacije meridijana 20W, 30W, 40W ... i uporednika 30N, 40N, ... 90N i stavi ih na forum u neki čitljivi oblik (recimo u Excelu)
2. Otkrij kako da nađeš jednačinu prave kroz dve tačke, na primer (x1, y1) i (x2, y2).
3. Otkrij kako da nađeš rastojanje između dve tačke (one gornje dve).
4. Otkrij kako da nađeš tačku u kojoj se dve prave seku.
5. Otkrij kako da nađeš ugao pod kojim prava seče x osu.

Kada se potrudiš da sve ovo nađeš, (koristi kao reference Wikipediju i Wolframalfa), onda sve to stavi ovde pa da smuljamo neku aproksimativnu formulu...
[ batro @ 25.04.2012. 10:19 ] @
Ne znam kako si razumeo moju poruku, ali nisam odustao. ;)
Naravno da ne ocekujem da mi neko uradi, od toga nema nikakve svrhe.

Post kao tvoj, je nesto sto mi je trebalo. Potrudicu se pa se javljam.
[ batro @ 25.04.2012. 11:39 ] @
Napravio sam veliku gresku. U pitanju nije konusna vec polar sthereographic projekcija.
Videcu sta mogu za ovim novim informacijama da uradim, pa se javljam..
[ djoka_l @ 25.04.2012. 12:12 ] @
Nemoj da gubiš vreme.

Ja te navodim na najprostije rešenje. Da bi nacrtao tačku 63N/30E treba da nađeš pravu koja predstavlja meridijian 30E. Na osnovu prethodno izračunatih razlika između paralele 60 i paralele 50, paralela 63 prolazi na daljini od (dist50-dist60)*3/10 (linearna aproksimacija). Na osnovu distance od tačke preseka svih meridijana i jednačine prave za meridijan 30E nađeš tačke x, y kao x=dcos(alfa) y=dsin(alpha) gde je alpha ugao koji jednačina prave meridijana 30E zaklapa sa x osom...