„SharpMap” változatai közötti eltérés

Innen: GIS Wiki
 
(3 közbenső módosítás, amit egy másik szerkesztő végzett, nincs mutatva)
1. sor: 1. sor:
== '''Bevezetés''' ==
+
A '''SharpMap''' egy nyílt forráskódú térinformatikai programkönyvtár, amely alkalmas asztali és webes alkalmazások fejlesztésére egyaránt. Lehetőséget ad <span class="plainlinks">[https://hu.wikipedia.org/wiki/Geoinformatika térinformatikai adatok]</span> különböző formátumokból történő betöltésére, és térképek megjelenítésére.  A programkönyvtár <span class="plainlinks">[https://hu.wikipedia.org/wiki/C_Sharp C#]</span>-ban íródott és a <span class="plainlinks">[https://hu.wikipedia.org/wiki/.NET_keretrendszer .NET 4.0 keretrendszeren]</span> alapszik. A programcsomag <span class="plainlinks">[https://hu.wikipedia.org/wiki/GNU_Lesser_General_Public_License GNU LGPL]</span> licensz alatt használható.
  
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.
+
== Felépítés ==
  
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.
+
* '''SharpMap''': Központi modul, amely tartalmazza a térbeli elemek modelljé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.
+
* '''SharpMap.UI''': <span class="plainlinks">[https://en.wikipedia.org/wiki/Windows_Forms Windows Forms]</span> felhasználói vezérlőket tartalmazó modul
  
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
+
* '''SharpMap.Web''': <span class="plainlinks">[https://en.wikipedia.org/wiki/ASP.NET ASP.NET]</span> webes alkalmazások felhasználói felületéhez szükséges funkciókat tartalmazó modul.
  
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
+
* '''SharpMap.Extensions''': további bővítményeket tartalmazó komponens. Olyan bővítményeket ad, amelyekkel lehetőség van <span class="plainlinks">[https://hu.wikipedia.org/wiki/Oracle_Database Oracle], [SpatiaLite SpatiaLite (SQLite)]</span> illetve [[PostGIS PostGIS (PostgreSQL)]] adatbázis használatára. A modul továbbá biztosítja [[GDAL/OGR]] modulok használatára.
  
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
 
  
  
== '''Komponensek''' ==
+
== Telepítés ==
  
SharpMap - A csomag motorja
+
A SharpMap programcsomag hivatalos weblapján http://sharpmap.codeplex.com elérhető a bináris változat, valamint a forráskód egyaránt. Binárisan a programcsomag <span class="plainlinks">[https://en.wikipedia.org/wiki/Assembly_(CLI) .NET szerelvények]</span> formájában érhető el, amelyek behivatkozhatóak bármilyen .NET 4.0 (vagy frissebb) alkalmazásban.
  
SharpMap.UI - WinForms UI vezérlőket tartalmazó komponens
 
  
SharpMap.Web - Webes alkalmazások, webszerverhez szükséges funkciókat tartalmaz
+
A programkönyvtár elérhető <span class="plainlinks">[https://en.wikipedia.org/wiki/NuGet NuGet]</span> csomagok formájában is:
  
SharpMap.Extensions - további bővítménzeket tartalmazó komponens
+
{| class="wikitable"
 +
|-
 +
! scope="col"| Modul
 +
! scope="col"| NuGet parancs
 +
|-
 +
| Központi modul
 +
| <tt>Install-Package SharpMap</tt>
 +
|-
 +
| Windows Forms felhasználói felület modul
 +
| <tt>Install-Package SharpMap.UI</tt>
 +
|-
 +
| ASP.NET felhasználói felület modul
 +
| <tt>Install-Package SharpMap.Web</tt>
 +
|-
 +
| Bővítmények modulja
 +
| <tt>Install-Package SharpMap.Extensions</tt>
 +
|}
  
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''' ==
  
== '''Használat''' ==
 
  
 
=== SharpMap felvétele a referenciák közé: ===
 
=== SharpMap felvétele a referenciák közé: ===
44. sor: 50. sor:
 
- SharpMap osztályok felvétele a referenciák közé:
 
- 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.
+
- 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
 
- Válasszuk ki a számunkra szükséges dll fájlokat
54. sor: 60. sor:
 
=== Vezérlők hozzáadása a Toolbox-hoz: ===
 
=== 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
+
- 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)
+
- 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)
  
  
66. sor: 72. sor:
  
 
== '''Funkciók''' ==
 
== '''Funkciók''' ==
 +
  
 
=== Főbb funkciók ===
 
=== Főbb funkciók ===
80. sor: 87. sor:
  
 
- Rétegek használata adatok megjelenítésére
 
- Rétegek használata adatok megjelenítésére
 +
  
 
=== Vektor rétegek ===
 
=== Vektor rétegek ===
  
Vektor rétegeket a SharpMap.Layers.VectorLayer nevű objektummal tudunk létrehozni. A rétegen megjeleníteni kívánt térbeli adatokat pedig a SharpMap.Data.Providers nevű függvény segítségével tudjuk betölteni. Pl.: egy shape fájlból töltjük be az adatokat.
+
Vektor rétegeket a '''SharpMap.Layers.VectorLayer''' nevű objektummal tudunk létrehozni. A rétegen megjeleníteni kívánt térbeli adatokat pedig a '''SharpMap.Data.Providers''' nevű függvény segítségével tudjuk betölteni. Pl.: egy shape fájlból töltjük be az adatokat.
  
 
  SharpMap.Layers.VectorLayer vlay = new SharpMap.Layers.VectorLayer("States");
 
  SharpMap.Layers.VectorLayer vlay = new SharpMap.Layers.VectorLayer("States");
 
  SharpMap.Data.Providers.ShapeFile("path_to_data\\states_ugl.shp", true);
 
  SharpMap.Data.Providers.ShapeFile("path_to_data\\states_ugl.shp", true);
 +
  
 
=== WMS rétegek ===
 
=== WMS rétegek ===
  
Lehetőségünk van WMS szerverről betölteni az adatokat a rétegünkre. Ezt a SharpMap.Layers.WmsLayer használatával tudjuk megtenni.
+
Lehetőségünk van '''WMS szerverről''' betölteni az adatokat a rétegünkre. Ezt a '''SharpMap.Layers.WmsLayer''' használatával tudjuk megtenni.
  
 
  SharpMap.Layers.WmsLayer wmsL = new SharpMap.Layers.WmsLayer("US Cities", "http://sampleserver1.arcgisonline.com/ArcGIS/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer/WMSServer");
 
  SharpMap.Layers.WmsLayer wmsL = new SharpMap.Layers.WmsLayer("US Cities", "http://sampleserver1.arcgisonline.com/ArcGIS/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer/WMSServer");
104. sor: 113. sor:
 
  //Vetületi rendszer azonosítója (SRID)
 
  //Vetületi rendszer azonosítója (SRID)
 
  wmsL.SRID = 4326;
 
  wmsL.SRID = 4326;
 +
  
 
=== Térkép stílusok ===
 
=== Térkép stílusok ===
  
Ahogy fentebb láthattuk,lehetőségünk van vektor rétegek létrehozására. Ezekhez a rétegekhez hozzárendelhetünk stílusokat, amelyekkel a térképünket tudjuk szinezni. Tegyük fel, hogy van egy vektor rétegünk, amit egy shape fájlból töltünk be. A következő függvények segítségével tudunk a rétegen levő objektumokhoz stílust hozzáadni.
+
Ahogy fentebb láthattuk,lehetőségünk van vektor rétegek létrehozására. Ezekhez a rétegekhez hozzárendelhetünk stílusokat, amelyekkel a térképünket tudjuk szinezni. Tegyük fel, hogy már van egy vektor rétegünk '''(vlay)''', amit egy shape fájlból töltünk be. A '''SharpMap.Styles.VectorStyle'''-al tudunk új stílusokat létrehozni. Az objektum '''Fill''' metódusával tudjuk kitölteni a színezni kívánt objektumot a térképen mégpedig a '''System.Drawing.SolidBrush''' segítségével.
 +
 
 +
Egy lehetséges példa a megvalósításra, ahol a területet szinezzük:
 +
 
 +
SharpMap.Styles.VectorStyle landStyle = new SharpMap.Styles.VectorStyle();
 +
landStyle.Fill = new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(232, 232, 232));
 +
 
 +
Egy másik példa a vizek szinezésére:
 +
 
 +
SharpMap.Styles.VectorStyle waterStyle = new SharpMap.Styles.VectorStyle();
 +
waterStyle.Fill = new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(198,198,255));
 +
 
 +
A stílusokat lehetőségünk van egy szótár adatszerkezetben eltárolni'''(Dictionary)'''.
 +
 
 +
Dictionary<string, SharpMap.Styles.IStyle> styles = new Dictionary<string,SharpMap.Styles.IStyle>();
 +
styles.Add("land", landStyle);
 +
styles.Add("water", waterStyle);
 +
 
 +
Végül a stílusokat úgynevezett '''Theme'''-ként tudjuk hozzáadni az előzőleg elkészített vlay nevű vektor rétegünkhöz, ehhez a '''SharpMap.Rendering.Thematics''' névterében megtalálható '''UniqueValuesTheme''' metódust használjuk.
 +
 
 +
vlay.Theme = new SharpMap.Rendering.Thematics.UniqueValuesTheme<string>("class", styles, landStyle);
 +
 
 +
 
 +
=== Egyedi vezérlők ===
 +
 
 +
A SharpMap-ben megtalálható '''MapBox''' biztosít számunkra néhány egyedi eseményt azokon az eseményeken kívül amiket a '''System.Windows.Forms.Control''' névtérből származtat. Ezekre az egyedi eseményekre tudunk saját eseménykezelőket írni. A SharpMap honlapján megtalálható tutorial-ban kapunk egy alap osztályt, amely segítségünkre lehet egy saját Tool megírásához. Ezenfelül kapunk egy minta példát egy ilyen Tool megvalósítsára.
 +
 
 +
A tutorial, az alap osztály, a minta Tool és a MapBox által nyújtott események/eseménykezelők elérhetőek itt: http://sharpmap.codeplex.com/wikipage?title=Tutorial%20-%20Example%205%3a%20Create%20a%20custom%20tool%20for%20the%20MapBox%20control&referringTitle=SharpMap%20Tutorial
  
A fent említett funkciók elérhetőek a SharpMap hivatalos honlapján levő '''SharpMap Tutorial''' link alatt, itt: http://sharpmap.codeplex.com/wikipage?title=SharpMap%20Tutorial
+
 
 +
'''Megjegyzés:''' ''A fent említett funkciók elérhetőek a SharpMap hivatalos honlapján levő'' '''''SharpMap Tutorial''''' ''link alatt, itt: http://sharpmap.codeplex.com/wikipage?title=SharpMap%20Tutorial''
  
  
 
== '''Egyszerű példaprogram''' ==
 
== '''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.
+
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.
 
Első lépésként hozzunk létre egy ”Demo1” nevű új projektet.
143. sor: 181. sor:
 
Nézzük meg mit jelentenek az egyes sorok a kódban.
 
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.
+
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
 
   //--> countriesLayer réteg elkészítése a shape fájlból
149. sor: 187. sor:
 
   countriesLayer.DataSource = new SharpMap.Data.Providers.ShapeFile(@"C:\Users\Bence\Documents\mo_shp\megye_region.shp", true);
 
   countriesLayer.DataSource = new SharpMap.Data.Providers.ShapeFile(@"C:\Users\Bence\Documents\mo_shp\megye_region.shp", true);
 
   mapBox1.Map.Layers.Add(countriesLayer);
 
   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.''
 
'''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
 
A Form1 fejlécében is jelenítsük meg ezt a nevet
171. sor: 211. sor:
 
== '''Egyszerű példaprogram: Térkép mozgatás''' ==
 
== '''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.
+
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:
 
A program C# kódja:
260. sor: 300. sor:
  
 
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.
 
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.
 +
 +
 +
== '''Egyszerű példaprogram: Térkép mozgatás webes alkalmazásban''' ==
 +
 +
Az előző példaprogramhoz nagyon hasonló webes térkép alkalmazás van megvalósítva '''ASP.NET 2.0''' és '''SharpMap''' használatával.
 +
 +
A leírás, a kódrészletek és a teljes kód letölthető ezen a linken: http://www.codeproject.com/Articles/12457/Creating-an-Interactive-Map-in-ASP-NET-Using-S
 +
 +
=Külső hivatkozások=
 +
* [http://sharpmap.codeplex.com/ A SharpMap hivatalos honlapja]
  
  

A lap jelenlegi, 2016. június 1., 11:53-kori változata

A SharpMap egy nyílt forráskódú térinformatikai programkönyvtár, amely alkalmas asztali és webes alkalmazások fejlesztésére egyaránt. Lehetőséget ad térinformatikai adatok különböző formátumokból történő betöltésére, és térképek megjelenítésére. A programkönyvtár C#-ban íródott és a .NET 4.0 keretrendszeren alapszik. A programcsomag GNU LGPL licensz alatt használható.

Felépítés

  • SharpMap: Központi modul, amely tartalmazza a térbeli elemek modelljét.
  • SharpMap.UI: Windows Forms felhasználói vezérlőket tartalmazó modul
  • SharpMap.Web: ASP.NET webes alkalmazások felhasználói felületéhez szükséges funkciókat tartalmazó modul.
  • SharpMap.Extensions: további bővítményeket tartalmazó komponens. Olyan bővítményeket ad, amelyekkel lehetőség van Oracle, [SpatiaLite SpatiaLite (SQLite)] illetve PostGIS PostGIS (PostgreSQL) adatbázis használatára. A modul továbbá biztosítja GDAL/OGR modulok használatára.


Telepítés

A SharpMap programcsomag hivatalos weblapján http://sharpmap.codeplex.com elérhető a bináris változat, valamint a forráskód egyaránt. Binárisan a programcsomag .NET szerelvények formájában érhető el, amelyek behivatkozhatóak bármilyen .NET 4.0 (vagy frissebb) alkalmazásban.


A programkönyvtár elérhető NuGet csomagok formájában is:

Modul NuGet parancs
Központi modul Install-Package SharpMap
Windows Forms felhasználói felület modul Install-Package SharpMap.UI
ASP.NET felhasználói felület modul Install-Package SharpMap.Web
Bővítmények modulja Install-Package SharpMap.Extensions


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.


Funkciók

Főbb funkciók

A SharpMap főbb funkciói lehetőséget adnak:

- GIS adatok kezelésére

- Térbeli adatok betöltésére adatbázisból. Pl: Oracle, PostGIS, SpatiaLite

- Térbeli adatok betöltése shape fájlból, WMS-ről.

- Térképek renderelésére

- Rétegek használata adatok megjelenítésére


Vektor rétegek

Vektor rétegeket a SharpMap.Layers.VectorLayer nevű objektummal tudunk létrehozni. A rétegen megjeleníteni kívánt térbeli adatokat pedig a SharpMap.Data.Providers nevű függvény segítségével tudjuk betölteni. Pl.: egy shape fájlból töltjük be az adatokat.

SharpMap.Layers.VectorLayer vlay = new SharpMap.Layers.VectorLayer("States");
SharpMap.Data.Providers.ShapeFile("path_to_data\\states_ugl.shp", true);


WMS rétegek

Lehetőségünk van WMS szerverről betölteni az adatokat a rétegünkre. Ezt a SharpMap.Layers.WmsLayer használatával tudjuk megtenni.

SharpMap.Layers.WmsLayer wmsL = new SharpMap.Layers.WmsLayer("US Cities", "http://sampleserver1.arcgisonline.com/ArcGIS/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer/WMSServer");

WMS rétegnél be kell még állítanunk a következő paramétereket.

//PNG formátum.
wmsL.SetImageFormat("image/png");
//Verziószám 1.1.0
wmsL.Version = "1.1.0";
//Réteg hozzáadása
wmsL.AddLayer("Cities");
//Vetületi rendszer azonosítója (SRID)
wmsL.SRID = 4326;


Térkép stílusok

Ahogy fentebb láthattuk,lehetőségünk van vektor rétegek létrehozására. Ezekhez a rétegekhez hozzárendelhetünk stílusokat, amelyekkel a térképünket tudjuk szinezni. Tegyük fel, hogy már van egy vektor rétegünk (vlay), amit egy shape fájlból töltünk be. A SharpMap.Styles.VectorStyle-al tudunk új stílusokat létrehozni. Az objektum Fill metódusával tudjuk kitölteni a színezni kívánt objektumot a térképen mégpedig a System.Drawing.SolidBrush segítségével.

Egy lehetséges példa a megvalósításra, ahol a területet szinezzük:

SharpMap.Styles.VectorStyle landStyle = new SharpMap.Styles.VectorStyle();
landStyle.Fill = new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(232, 232, 232));

Egy másik példa a vizek szinezésére:

SharpMap.Styles.VectorStyle waterStyle = new SharpMap.Styles.VectorStyle();
waterStyle.Fill = new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(198,198,255));

A stílusokat lehetőségünk van egy szótár adatszerkezetben eltárolni(Dictionary).

Dictionary<string, SharpMap.Styles.IStyle> styles = new Dictionary<string,SharpMap.Styles.IStyle>();
styles.Add("land", landStyle);
styles.Add("water", waterStyle);

Végül a stílusokat úgynevezett Theme-ként tudjuk hozzáadni az előzőleg elkészített vlay nevű vektor rétegünkhöz, ehhez a SharpMap.Rendering.Thematics névterében megtalálható UniqueValuesTheme metódust használjuk.

vlay.Theme = new SharpMap.Rendering.Thematics.UniqueValuesTheme<string>("class", styles, landStyle);


Egyedi vezérlők

A SharpMap-ben megtalálható MapBox biztosít számunkra néhány egyedi eseményt azokon az eseményeken kívül amiket a System.Windows.Forms.Control névtérből származtat. Ezekre az egyedi eseményekre tudunk saját eseménykezelőket írni. A SharpMap honlapján megtalálható tutorial-ban kapunk egy alap osztályt, amely segítségünkre lehet egy saját Tool megírásához. Ezenfelül kapunk egy minta példát egy ilyen Tool megvalósítsára.

A tutorial, az alap osztály, a minta Tool és a MapBox által nyújtott események/eseménykezelők elérhetőek itt: http://sharpmap.codeplex.com/wikipage?title=Tutorial%20-%20Example%205%3a%20Create%20a%20custom%20tool%20for%20the%20MapBox%20control&referringTitle=SharpMap%20Tutorial


Megjegyzés: A fent említett funkciók elérhetőek a SharpMap hivatalos honlapján levő SharpMap Tutorial link alatt, itt: http://sharpmap.codeplex.com/wikipage?title=SharpMap%20Tutorial


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.


Egyszerű példaprogram: Térkép mozgatás webes alkalmazásban

Az előző példaprogramhoz nagyon hasonló webes térkép alkalmazás van megvalósítva ASP.NET 2.0 és SharpMap használatával.

A leírás, a kódrészletek és a teljes kód letölthető ezen a linken: http://www.codeproject.com/Articles/12457/Creating-an-Interactive-Map-in-ASP-NET-Using-S

Külső hivatkozások


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