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

Innen: GIS Wiki
 
(17 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 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.
+
== Felépítés ==
  
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''': Központi modul, amely tartalmazza a térbeli elemek modelljét.
- 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.
 
- 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.
 
  
 +
* '''SharpMap.UI''': <span class="plainlinks">[https://en.wikipedia.org/wiki/Windows_Forms Windows Forms]</span> felhasználói vezérlőket tartalmazó modul
  
== '''Telepítés''' ==
+
* '''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 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.  
+
* '''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 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.
 
  
'''SharpMap felvétele a referenciák közé:'''
 
  
- Indítsuk el a VisualStudio-t
+
== Telepítés ==
- Hozzunk létre egy új projektet (pl. Windows Forms Application)
+
 
- SharpMap osztályok felvétele a referenciák közé:
+
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.
  - 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
+
 
 +
A programkönyvtár elérhető <span class="plainlinks">[https://en.wikipedia.org/wiki/NuGet NuGet]</span> csomagok formájában is:
 +
 
 +
{| 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>
 +
|}
 +
 
 +
 
 +
== '''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.
 
Í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
+
=== Vezérlők hozzáadása a Toolbox-hoz: ===
- 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)
+
 
 +
- 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.
 
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.
+
 
 +
'''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''' ==
 
== '''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.
  
 
A Design ablakban levő Formra tegyünk rá egy MapBox-ot:
 
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
+
 
 +
- 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.
 
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=
 +
* [http://sharpmap.codeplex.com/ A SharpMap hivatalos honlapja]
 +
 +
 +
== '''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''

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