Delphi - A Microsoft Terra szerverének programozása

Terra Server 2. rész

forráskód letöltése
Az előző részben készítettünk egy programot, amely segítségével egy megadott terület településeit lekérdezhettük, a hozzájuk tartozó szélességi és hosszúsági fokokkal együtt. Ebben a részben folytatjuk az elkezdett programot. Kibővítjük, hogy a lekérdezett koordinátákat felhasználva, különböző felbontású műholdfelvételeket és topológiai térképeket kérhessünk le a szerverről. Képet nem csak egy kiválasztott településről, hanem tetszőlegesen megadott koordinátáról is lekérhetünk.
A példaprogram használatához aktív Internet kapcsolat szükséges.
Folytatjuk az előző részben elkészített példaprogramot. A PageControl1 objektumot kibővítjük egy új füllel, amelyen képeket kérhetünk le a Terra szerverről.
Egy kép letöltéséhez meg kell adnunk egy szélességi és egy hosszúsági fok koordinátát. Egy ilyen koordinátát a LonLatPt osztály tárol. A megadott koordinátákat a lap tetején található Edit mezők segítségével adhatjuk meg. Először az Edit mezők tartalmát el kell helyeznünk egy LonLatPt típusú objektumban.
LonLat:=LonLatPt.Create;
LonLat.Lat:=StrToFloat(Lat.Text);
LonLat.Lon:=StrToFloat(Lon.Text);
Kétfajta kép letöltését tesszük lehetővé. A műholdas felvétel a Photo, a topológiai térkép a Topo nevet kapta. Ezek kiválasztását a RadioGroup1 objektum segítségével tehetjük meg.
Most információkat kell lekérnünk erről a helyről, melyet egy AreaBoundingBox osztályban tárolhatunk. A lekérdezést a TerraService osztály GetAreaFromPt függvény valósítja meg.
Area:=FTerra.GetAreaFromPt(LonLat,t,IntToScale(ComboBox1.ItemIndex),500,280);
Első paraméterként a már létrehozott LonLatPt osztály példányát adjuk át, majd ezt követi a kép típusának megválasztása a Theme felsorolt típus segítségével. Harmadik paraméterként a kép felbontásának mértékét kell megadnunk. Ezt használva közelebbi, illetve távolabbi képeket kapunk egy-egy helyszínről. Az utolsó két paraméterben annak a területnek a szélességét és magasságát kell megadnunk pixelben, melyen majd megjelenítjük a letöltött képet.
A képek felbontását a Scale, felsorolt típus segítségével állíthatjuk be. Hogy a ComboBox1 ItemIndex értékét át lehessen konvertálni Scale típusúvá, létrehoztuk az IntToScale függvényt.
Nem minden felbontásban létezik kép a szerveren. Ha olyan adatokat adunk meg, amelyhez nem tartozik kép, akkor a program hibaüzenetet ad. Ennek kezeléséről egy try – except – end blokk segítségével, nekünk kell gondoskodnunk.
A képeket a szerver kisebb képekre bontva küldi el. A GetAreFromPt metódussal lekérdeztük a terület adatait. A kapott struktúra tartalmazza a letölthető képek X és Y indexeit.
Ezeket a képeket két egymásba ágyazott for ciklus segítségével tudjuk feldolgozni. Mielőtt elkezdődne a ciklus, meg kell határoznunk a ciklus kezdőértékeit.
StartX:=Area.NorthWest.TileMeta.Id.X;
StartY:=Area.NorthWest.TileMeta.Id.Y;
A TileMeta property tartalmazza a képi információkat. Ennek tartalmát egy TileID típusú objektumba lementjük.
TI:=TileID.Create;
TI:=Area.NorthWest.TileMeta.Id;
A képek tárolására az Images nevű dinamikus tömböt használjuk. A tömb minden egyes eleme TImage típusú.
A két for ciklust az alábbi formában kell megadnunk, hogy a képeket helyes sorrendben kapjuk.
for i:=StartX to Area.NorthEast.TileMeta.Id.X do
  for j:=StartY downto Area.SouthWest.TileMeta.Id.Y do begin
A TileId objektumot használjuk arra, hogy a GetTile metódus meghívásával lekérjük a for ciklusok által meghatározott indexű képet.
TI.X:=i;
TI.Y:=j;
Picture:=FTerra.GetTile(TI);
A képek adatai egy dinamikus tömbben érkeznek, amely Byte típusú elemeket tárol. A tömb TByteDynArray típusú. Ennek a típusnak a leírása a Types unitban található. A képek formátuma JPG.
A képeket úgy tudjuk felhasználni, hogy az aktuális képet mindig egy ideiglenes (Temp.jpg) állományba mentjük, majd azt betöltjük egy TImage komponensbe. Mivel a képek JPG formátumúak, a uses listában fel kell sorolnunk a JPEG unit nevét is. A teljes kép összerakásához több Image komponensre lesz szükségünk. Az egyes komponensek helyét az alábbi módon számolhatjuk ki.
Left:=2+(i-StartX)*Width;
Top:=61+(StartY-j)*Height;
Az Images, dinamikus tömb felszabadítását a RemoveImages eljárás végzi el.

Terra Server cikksorozat

A Microsoft Terra szerverének programozása - Terra Server 1. rész

A Microsoft Terra szerverének programozása - Terra Server 2. rész