„SharpMap” változatai közötti eltérés
(15 közbenső módosítás, amit egy másik szerkesztő végzett, nincs mutatva) | |||
1. sor: | 1. sor: | ||
− | + | 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ó. | |
− | + | == Felépítés == | |
− | + | * '''SharpMap''': Központi modul, amely tartalmazza a térbeli elemek modelljét. | |
− | |||
− | |||
+ | * '''SharpMap.UI''': <span class="plainlinks">[https://en.wikipedia.org/wiki/Windows_Forms Windows Forms]</span> felhasználói vezérlőket tartalmazó modul | ||
− | + | * '''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. | |
− | + | * '''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. | |
− | |||
− | |||
− | + | == 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 <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. | |
− | + | ||
− | + | ||
+ | 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 | ||
+ | |||
+ | - 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 | ||
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ő kódot másoljuk be a konstruktorba: | + | 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"); | 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); | countriesLayer.DataSource = new SharpMap.Data.Providers.ShapeFile(@"C:\Users\Bence\Documents\mo_shp\megye_region.shp", true); | ||
54. sor: | 171. sor: | ||
this.Text = countriesLayer.LayerName; | this.Text = countriesLayer.LayerName; | ||
− | //--> | + | //--> réteg stílus paramétereinek beállítása |
countriesLayer.Style.Fill = Brushes.LightBlue; | countriesLayer.Style.Fill = Brushes.LightBlue; | ||
countriesLayer.Style.EnableOutline = true; | countriesLayer.Style.EnableOutline = true; | ||
64. 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 |
SharpMap.Layers.VectorLayer countriesLayer = new SharpMap.Layers.VectorLayer("megye"); | 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); | 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 | ||
79. sor: | 198. sor: | ||
Következő kódsorok a megjelenési stílusra vonatkozó paraméterek. | 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.Fill = Brushes.LightBlue; | ||
countriesLayer.Style.EnableOutline = true; | countriesLayer.Style.EnableOutline = true; | ||
89. sor: | 208. sor: | ||
RefreshMap(); | 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ó.
Tartalomjegyzék
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