A WebService a http://terraserver.homeadvisor.msn.com/TerraService.asmx címen érhető el.
Ennek a WebService-nek a részletes leírása pedig a http://terraserver.homeadvisor.msn.com/webservices.aspx oldalon olvasható (jelenleg).
Új alkalmazásunkhoz adjunk hozzá egy web referenciát ezen WebService eléréséhez. Ehhez válasszuk a Project - Add Web Reference menüpontot, majd az Address mezőbe írjuk az alábbit:
http://terraserver.homeadvisor.msn.com/TerraService.asmx
Nézzük most lépésenként, hogy miként is kérhetünk le egy műhold felvételt egy adott helyről. Első lépés, hogy létrehozzuk a TerraService osztály példányát.
private void button1_Click(object sender, System.EventArgs e)
{
TerraService ts = new TerraService();
Ezt követi egy LonLatPt osztály, melyben megadhatjuk, hogy mely szélességi és hosszúsági fokon lévő pontot szeretnénk látni. A megadott koordináta a megjelenítendő kép közepe lesz.
LonLatPt center = new LonLatPt();
center.Lat = Convert.ToDouble(textBox1.Text);
center.Lon = Convert.ToDouble(textBox2.Text);
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. 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, melynél a Photo érték a műhold felvételt jelenti. 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.
AreaBoundingBox abb = new AreaBoundingBox();
abb = ts.GetAreaFromPt(center, Theme.Photo, TerraServer.com.msn.homeadvisor.terraserver.Scale.Scale4m, pictureBox1.Width, pictureBox1.Height);
int xStart = abb.NorthWest.TileMeta.Id.X;
int yStart = abb.NorthWest.TileMeta.Id.Y;
Graphics g = pictureBox1.CreateGraphics();
g.Clear(Color.White);
A letöltendő képet több részletben kapjuk meg. Ennek oka a gyorsabb megjelenítés, mivel így a kép egyes részeit már láthatóvá tehetjük és nem kell megvárnunk, hogy a teljes kép letöltődjön.
A teljes képhez egy kettős ciklusra lesz szükségünk, mely mind X, mind Y irányban végigmegy a képen és sorban minden részletet letölt.
for (int x=xStart; x<=abb.NorthEast.TileMeta.Id.X; x++)
{
for (int y=yStart; y>=abb.SouthWest.TileMeta.Id.Y; y--)
{
TileId ti = new TileId();
ti = abb.NorthWest.TileMeta.Id;
ti.X = x;
ti.Y = y;
Az egyes részleteket egy Image osztályba töltjük, majd a Graphics osztály DrawImage függvényének segítségével kirajzoljuk a megfelelő pozícióra.
Image img = Image.FromStream(new MemoryStream(ts.GetTile(ti)));
g.DrawImage(img, (x - xStart) * img.Width - Convert.ToInt32(abb.NorthWest.Offset.XOffset), (yStart - y) * img.Height - Convert.ToInt32(abb.NorthWest.Offset.YOffset), img.Width, img.Height);
img.Dispose();
}
}
}
A ciklusok végére a teljes kép előáll.