SharpMap
Tartalomjegyzék
Bevezetés
A nyílt forráskódú térinformatikai fejlesztő eszközök megjelentek Windows operációs rendszer környezetben is. Windows környezetben is jelentős igény van szabad szoftverekre, szoftver komponensekre. Tekintettel a Windows elterjedtségére, térinformatikai programkönyvtárak létrehozásával nagy létszámú fejlesztő közösségek munkáját segítik az effajta eszközök. A Windows világban is többféle térinformatikai könyvtár létezik, amelyek win32-es és webes alkalmazások fejlesztésére alkalmasak. Egyelőre két fő fejlesztés vonal létezik. Az egyik a SharpMap névre hallgató könyvtár, a másik a dotSpatial. Mindkét csomag alkalmas arra, hogy VisualStudio.net-ben fejlesztett alkalmazásokban is felhasználhassuk. Referenciába állításuk esetén névtereik elérhetők, osztályaik a VisualStudio.net-ben elérhető nyelvekben felhasználhatók.
A SharpMap egy nyílt forráskódú térinformatikai programkönyvtár, amely alkalmas win32-es és webes alkalmazások fejlesztésére egyaránt. A SharpMap alkalmas arra, hogy VisualStudio-ban fejlesztett alkalmazásokban is felhasználhassuk. A könyvtár motorja C#-ban íródott és a .Net 4.0 keretrendszeren alapszik. Lehetővé teszi térképek megjelenítését, térbeli adatok és még sok más GIS adat kezelését.
A SharpMap-et a következő linken érhetjük el: http://sharpmap.codeplex.com/ . Innen letölthető a legfrissebb verzió, dokumentáció, útmutató, mintapéldák és egyéb hasznos adatok.
A Downloads fülre kattintva letölthetjük az alapcsomagot, de lehetőségünk van a csomag bővítményeit is letölteni. SharpMap(Core+UI) és SharpMap.Extensions innen: http://sharpmap.codeplex.com/releases/view/116326
A Documentation fül alatt találhatunk némi leírást illetve a How to... linken hozzáférhetünk példaprogramokhoz és néhány rövid leíráshoz: http://sharpmap.codeplex.com/wikipage?title=How%20to...&referringTitle=Documentation
A SharpMap Tutorial linken egy kis betekintést kaphatunk a SharpMap lehetőségeiról: http://sharpmap.codeplex.com/wikipage?title=SharpMap%20Tutorial&referringTitle=Documentation
Funkciók
A SharpMap főbb funkciói lehetőséget adnak:
- GIS adatok kezelésére
- Térbeli adatok betöltésére fájlból illetve adatbázisból
- Térképek renderelésére
Komponensek
SharpMap - A csomag motorja
SharpMap.UI - WinForms UI vezérlőket tartalmazó komponens
SharpMap.Web - Webes alkalmazások, webszerverhez szükséges funkciókat tartalmaz
SharpMap.Extensions - további bővítménzeket tartalmazó komponens
A SharpMap.Extensions olyan bővítményeket ad, amelyekkel lehetőség van Oracle,SpatiaLite (SQLite) illetve PostGIS (PostgreSQL) adatbázis használatára. Az adatbázisok összeköthetőek az alkalmazással, így lehetőség lesz térbeli adatok tárolására, betöltésére ezekből. Ezenfelül támogatja az OGR és GDAL formátumokat, előbbi egy vektor, utóbbi pedig egy raszter kép formátum.
Telepítés
A SharpMap Downloads fülére kattintva megjelennek a letölthető csomagok. Először töltsük le a SharpMap (Core+UI) nevű alapcsomagot. Érdemes lehet még letölteni a SharpMap.Extensions kiegészítő csomagot is, illetve webes alkalmazás vagy Oracle adatbázis használata esetén a SharpMap.Web és SharpMap.Data.Providers.OracleSpatial csomagokat. A letöltött .zip fájlok tartalmát tároljuk egy tetszőleges helyen.
A fájlok kicsomagolásával véget is ért a telepítés. A csomagok használatához a VisualStudio projektben referenciaként fel kell venni a fejlesztéshez használni kívánt dll-eket.
Használat
SharpMap felvétele a referenciák közé:
- Indítsuk el a VisualStudio-t
- Hozzunk létre egy új projektet (pl. Windows Forms Application)
- SharpMap osztályok felvétele a referenciák közé:
- VisualStudio főmenüjében Project -> Add reference, itt a Browse fül alatt keressük meg azt a helyet, ahová a SharpMap zip fájlt kicsomagoltuk.
- Válasszuk ki a számunkra szükséges dll fájlokat
Így már importálhatóak az osztályok, ha a kódból szeretnénk példányosítani őket. Viszont a designer még nem tartalmazza azokat a vezérlőket, amelyekre szükségünk lehet a megjelenítésnél.
Vezérlők hozzáadása a Toolbox-hoz:
- Adjunk hozzá egy új tabot a Toolbox-hoz. Toolbox -> jobb klikk -> Add Tab, az új tab neve legyen SharpMap
- Ebbe a csoportba rakjuk bele a SharpMap vezérlőit a következő módon: Jobb klikk a csoportra -> Choose Items… -> dll fájlok kiválasztása (csak azokat a dll fájlokat tudjuk kiválasztani, amik tartalmaznak grafikus vezérlőket)
Ezzel megvannak a legfontosabb kezdő lépések. A SharpMap importálható és elérhetőek a grafikus vezérlői is.
Megjegyzés: A SharpMap dll fájlok elérési útja megváltozik, akkor a VisualStudio nem fogja őket megtalálni. Ha ilyen történik, a Solution Explorer ablakban a projektünk Reference részét lenyitva kiválasztjuk a SharpMap adott állományát és a Properties-ben módosítjuk a path-ot a megváltozott elérési útra.
Egyszerű példaprogram
A shape fájlok megjelenítése minden GIS szoftver alapfunkciója. A SharpMap is biztosít egy osztályt ezek megjelenítésére. Ez a MapBox osztály, amelyet megtalálhatunk a SharpMap tabon, amelyet az előzőleg készítettünk. A megjelenítendő vektor térkép ebbe az osztályba fog legenerálódni és ez az osztály fogja megjeleníteni nekünk. Ennek a tartalma egyébként egy PictureBox-ban is megjeleníthető a az Image property használatával.
Első lépésként hozzunk létre egy ”Demo1” nevű új projektet.
A Design ablakban levő Formra tegyünk rá egy MapBox-ot:
- Dupla klikk a Toolbox-ban lévő SharpMap tab MapBox controljára -> megjelenik a formon a mapBox1 nevű objektum
A Property ablakban a BackColor tulajdonságot állítsuk fehérre.
Ez az egyszerű program egy shape fájl megjelenítését fogja végezni. Ehhez annyit kell tennünk, hogy a Form1 konstruktorában fogjuk elvégezni a megjelenítést. A következő C# kódot másoljuk be a konstruktorba:
//--> countriesLayer réteg elkészítése a shape fájlból SharpMap.Layers.VectorLayer countriesLayer = new SharpMap.Layers.VectorLayer("megye"); countriesLayer.DataSource = new SharpMap.Data.Providers.ShapeFile(@"C:\Users\Bence\Documents\mo_shp\megye_region.shp", true); mapBox1.Map.Layers.Add(countriesLayer); this.Text = countriesLayer.LayerName; //--> réteg stílus paramétereinek beállítása countriesLayer.Style.Fill = Brushes.LightBlue; countriesLayer.Style.EnableOutline = true; countriesLayer.Style.Outline = Pens.DarkBlue; mapBox1.Map.ZoomToExtents(); RefreshMap();
Nézzük meg mit jelentenek az egyes sorok a kódban.
Hozzuk létre a countriesLayer nevű SharpMap.Layers objektumot, amely VectorLayer lesz, „megye” névvel. Ezenkívül meg kell adnunk a rétegünk forrását, amely sokféle lehet, jelen esetben egy shape fájl. Argumentumként adjuk meg a megjeleníteni kívánt fájl nevét és elérési útját. Végül adjuk hozzá a réteget a _sharMap.Layers kollekcióhoz.
//--> countriesLayer réteg elkészítése a shape fájlból SharpMap.Layers.VectorLayer countriesLayer = new SharpMap.Layers.VectorLayer("megye"); countriesLayer.DataSource = new SharpMap.Data.Providers.ShapeFile(@"C:\Users\Bence\Documents\mo_shp\megye_region.shp", true); mapBox1.Map.Layers.Add(countriesLayer);
Megjegyzés: Data providers paraméterlistáján az első paraméter egy string, ami a fájl elérhetőségeit tartalmazza. A második paraméter, ami boolean típusú arra utal, hogy van-e térbeli indexelés vagy sem. Ha False, akkor nincs, de ebben az esetben, nagy adatállományokra lassúvá válhat a megjelenítés. True esetében lesz térbeli indexelés, ami az első megjelenítéskor egy kis időt vesz igénybe, viszont a további megjelenítéskor gyorsabb lesz a folyamat.
A Form1 fejlécében is jelenítsük meg ezt a nevet
this.Text = countriesLayer.LayerName;
Következő kódsorok a megjelenési stílusra vonatkozó paraméterek.
//--> réteg stílus paramétereinek beállítása countriesLayer.Style.Fill = Brushes.LightBlue; countriesLayer.Style.EnableOutline = true; countriesLayer.Style.Outline = Pens.DarkBlue;
Végül be kell állítanunk a viewport sarkait a térképünk térbeli kiterjedésének megfelelő értékre. Erre külön eljárása van a mapBox1.Map-nek. A mapBox1 frissítésével jelenik meg a tényleges térkép.
mapBox1.Map.ZoomToExtents(); RefreshMap();
Egyszerű példaprogram: Térkép mozgatás
Ebben a programban az előző példát fejlesztjük tovább. A térképet kicsinyítjük, nagyítjuk és mozgatjuk. A mozgatásokat a Formra elhelyezett gombok segítségével fogjuk irányítani. Négy funkciót fogunk megvalósítani: Zoom in (nagyítás), Zoom out (kicsinyítés), Zoom Full (zoom out a teljes térképi tartalomra) és Pan (a kurzor klikkelés helyére teszi a viewport középpontját.
A program C# kódja:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Demo1 { public partial class Form1 : Form { SharpMap.Map _sharpMap; //--> nagyítási érték beállítása const float ZOOM_FACTOR = 0.3f; //--> a vector réteg neve és a forrásfájl elérési útja const string DATA_NAME = "megye"; const string DATA_PATH = @"C:\Users\Bence\Documents\mo_shp\megye_region.shp"; public Form1() { InitializeComponent(); //--> térkép inicializálása _sharpMap = new SharpMap.Map(new Size(600, 300)); //--> countriesLayer réteg elkészítése a shape fájlból SharpMap.Layers.VectorLayer countriesLayer = new SharpMap.Layers.VectorLayer(DATA_NAME); countriesLayer.DataSource = new SharpMap.Data.Providers.ShapeFile(DATA_PATH, true); _sharpMap.Layers.Add(countriesLayer); //--> réteg stílus paramétereinek beállítása countriesLayer.Style.Fill = Brushes.LightBlue; countriesLayer.Style.EnableOutline = true; countriesLayer.Style.Outline = Pens.DarkBlue; this.Text = countriesLayer.LayerName; _sharpMap.ZoomToExtents(); RefreshMap(); } private void RefreshMap() { //--> Térkép generálása a SharpMap segítségével pictureBox1.Image = _sharpMap.GetMap(); } private void ZoomIn_Click(object sender, EventArgs e) { //--> Nagyítás a Zoom érték megváltoztatásával _sharpMap.Zoom -= _sharpMap.Zoom * ZOOM_FACTOR; RefreshMap(); } private void ZoomOut_Click(object sender, EventArgs e) { //--> Kicsinyítés a Zoom érték megváltoztatásával _sharpMap.Zoom += _sharpMap.Zoom * ZOOM_FACTOR; RefreshMap(); } private void ZoomFull_Click(object sender, EventArgs e) { //--> Eredit térképméret visszaállítása _sharpMap.ZoomToExtents(); RefreshMap(); } private void pictureBox1_Click(object sender, MouseEventArgs e) { //--> Kurzor koordinátájának konvertálása GeoAPI.Geometries.Coordinate p = _sharpMap.ImageToWorld(e.Location); //--> térkép pozicionálása _sharpMap.Center.X = p.X; _sharpMap.Center.Y = p.Y; RefreshMap(); } } }
A Zoom In, Zoom out, Zoom Full feliratú gombokra klikkelve tudjuk változtatni a kép nagyítását. Ezek eseménykezelőjébe kerültek bele a zoom műveletek. Például a Zoom In gombra klikkelve azonnal megtörténik a nagyítás, mégpedig úgy, hogy a kép közepe változatlanul a viewport közepére esik. A kurzor bármely pozíciójában történő klikkelés a viewport elmozdulását jelenti úgy, hogy a klikkelés térképi helye lesz a viewport közepe.
Hivatkozások
SharpMap hivatalos honlap: http://sharpmap.codeplex.com/
SharpMap további Tutorialok: http://sharpmap.codeplex.com/wikipage?title=SharpMap%20Tutorial&referringTitle=Documentation
SharpMap leírás további példaprogramokkal (VisualBasic, C#): http://tarsadalominformatika.elte.hu/tananyagok/opensourcewin/index.html
SharpMap Tutorial (C#): http://spatialhorizons.com/2007/10/14/using-sharpmap-1/
SharpMap Tutorial (ASP.NET 2.0): http://www.codeproject.com/Articles/12457/Creating-an-Interactive-Map-in-ASP-NET-Using-S