SharpMap

Innen: GIS Wiki
A lap korábbi változatát látod, amilyen Bence.nagy (vitalap | szerkesztései) 2016. május 23., 15:37-kor történt szerkesztése után volt.

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


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.


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 szürkére 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


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