<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="hu">
	<id>http://gis.inf.elte.hu/giswiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jmdtdy</id>
	<title>GIS Wiki - Szerkesztő közreműködései [hu]</title>
	<link rel="self" type="application/atom+xml" href="http://gis.inf.elte.hu/giswiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jmdtdy"/>
	<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/wiki/Speci%C3%A1lis:Szerkeszt%C5%91_k%C3%B6zrem%C5%B1k%C3%B6d%C3%A9sei/Jmdtdy"/>
	<updated>2026-05-09T16:13:41Z</updated>
	<subtitle>Szerkesztő közreműködései</subtitle>
	<generator>MediaWiki 1.31.7</generator>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=555</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=555"/>
		<updated>2017-05-17T07:43:57Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra (Spring)&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
* Biztonság (Token)&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el, ez a következő linken érhető el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vagy egyben&lt;br /&gt;
&amp;lt;code&amp;gt;mvn install jetty: run&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. A szerver az alábbiakat nyújtja:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
A quickstart application csak a gwt-s kliens egy részét tartalmazza, ezért használja a &amp;lt;code&amp;gt;GeomajasServerExtension&amp;lt;/code&amp;gt;-t, a szerveroldal létező példánya helyett, viszont jó kiindulási pont a framework megismeréséhez.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordítható le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, így elég csak ezt lefordítani. A dokumentációban említett gs.js fájlt azonban már nem generálja le, csak egy dinamikus azonosítóval ellátott js-t. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript) letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető. Eredeti oldal, ami néha nem megy: (http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/).&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A Geomajas és a Geosparc==&lt;br /&gt;
&lt;br /&gt;
A geomajas mostanra a geosparc (http://www.geosparc.com/) alapja lett, amivel egyedi webes GIS alkalmazásokat készítenek.&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, egyenként az api és a gwt2 projekt rész lefordítható.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei ettől függetlenül egyenként is lefordíthatóak kisebb-nagyobb szerencsével.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner és az eclipse===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll. Az eclipse marketplace-ről letölthető GWT-s pluginnal és az eredeti GWT-s toollal sem sikerült a JettyRunner hibamentes konfigurációja, amely futtatásánál a SpringFramewörk valamiyel nhiányzó layerre panaszkodik.&lt;br /&gt;
&lt;br /&gt;
A fent említett paraméterekkel az eclipse neon.1, neon.2 és a neon.3, illetve a kepler-es verzión is kipróbálva ugyanez a hiba jelentkezett. A kísérlet, minek során a quickstart application fordítására tettem kísérletet, az eclipse a maven-es pom.xml-ben hibát talált, valószínűleg kompatibilitási okokból.   &lt;br /&gt;
&lt;br /&gt;
===Maven-es mintaprojekt===&lt;br /&gt;
A források között található régebbi dokumentációk egyikében hivatkozás van egy alap geomajas projekt létrehozására külső url-ről a maven segítségével, azonban a funkció már nem elérhető.&lt;br /&gt;
&lt;br /&gt;
===Eltérések a dokumentációktól===&lt;br /&gt;
Sok helyen a dokumentációban hivatkozott komponensek nem léteznek, vagy nem elérhetőek. Legjobb példa a Javascriptes kliens kód, amely a dokumentáció alapján letölthető lenne a http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/ URL-ről. Ez tartalmazna egy gs.js-t és egy index.html-t. A githubról letölthető Javascript Client (https://github.com/geomajas/geomajas-project-javascript) distribution része ugyanezt a kódot generálja, vagy csak egy részét, ami működik azonban a dokumentációban említett elméletben geomajas javascript fájl helyett egy dinamikusan generált javascript keletkezik. Ez elindításkor nehezményezi a gs.js hiányát, azonban a dokumentációban szereplő példa részletek futtathatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas weboldal.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;br /&gt;
* http://files.geomajas.org/documentation/geomajas-project-server/snapshot/geomajas-server-documenatation/html/master.html - Geomajas szerver oldal dokumentációja.&lt;br /&gt;
&lt;br /&gt;
* http://www.gwtproject.org/ - GWT oldala a pluginekkel.&lt;br /&gt;
* https://maven.apache.org/ - Maven oldala, az utasításokkal, pom.xml felépítésével...&lt;br /&gt;
* http://www.geosparc.com/ - Geosparc hivatalos oldala&lt;br /&gt;
* Előadás és JS minta - http://people.inf.elte.hu/bagtaai/MSc/JMDTDY_ttaf.zip&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=449</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=449"/>
		<updated>2017-05-02T05:31:02Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Maven-es mintaprojekt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra (Spring)&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
* Biztonság (Token)&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el, ez a következő linken érhető el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vagy egyben&lt;br /&gt;
&amp;lt;code&amp;gt;mvn install jetty: run&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. A szerver az alábbiakat nyújtja:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
A quickstart application csak a gwt-s kliens egy részét tartalmazza, ezért használja a &amp;lt;code&amp;gt;GeomajasServerExtension&amp;lt;/code&amp;gt;-t, a szerveroldal létező példánya helyett, viszont jó kiindulási pont a framework megismeréséhez.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordítható le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, így elég csak ezt lefordítani. A dokumentációban említett gs.js fájlt azonban már nem generálja le, csak egy dinamikus azonosítóval ellátott js-t. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript) letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető. Eredeti oldal, ami néha nem megy: (http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/).&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A Geomajas és a Geosparc==&lt;br /&gt;
&lt;br /&gt;
A geomajas mostanra a geosparc (http://www.geosparc.com/) alapja lett, amivel egyedi webes GIS alkalmazásokat készítenek.&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, egyenként az api és a gwt2 projekt rész lefordítható.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei ettől függetlenül egyenként is lefordíthatóak kisebb-nagyobb szerencsével.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner és az eclipse===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll. Az eclipse marketplace-ről letölthető GWT-s pluginnal és az eredeti GWT-s toollal sem sikerült a JettyRunner hibamentes konfigurációja, amely futtatásánál a SpringFramewörk valamiyel nhiányzó layerre panaszkodik.&lt;br /&gt;
&lt;br /&gt;
A fent említett paraméterekkel az eclipse neon.1, neon.2 és a neon.3, illetve a kepler-es verzión is kipróbálva ugyanez a hiba jelentkezett. A kísérlet, minek során a quickstart application fordítására tettem kísérletet, az eclipse a maven-es pom.xml-ben hibát talált, valószínűleg kompatibilitási okokból.   &lt;br /&gt;
&lt;br /&gt;
===Maven-es mintaprojekt===&lt;br /&gt;
A források között található régebbi dokumentációk egyikében hivatkozás van egy alap geomajas projekt létrehozására külső url-ről a maven segítségével, azonban a funkció már nem elérhető.&lt;br /&gt;
&lt;br /&gt;
===Eltérések a dokumentációktól===&lt;br /&gt;
Sok helyen a dokumentációban hivatkozott komponensek nem léteznek, vagy nem elérhetőek. Legjobb példa a Javascriptes kliens kód, amely a dokumentáció alapján letölthető lenne a http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/ URL-ről. Ez tartalmazna egy gs.js-t és egy index.html-t. A githubról letölthető Javascript Client (https://github.com/geomajas/geomajas-project-javascript) distribution része ugyanezt a kódot generálja, vagy csak egy részét, ami működik azonban a dokumentációban említett elméletben geomajas javascript fájl helyett egy dinamikusan generált javascript keletkezik. Ez elindításkor nehezményezi a gs.js hiányát, azonban a dokumentációban szereplő példa részletek futtathatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas weboldal.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;br /&gt;
* http://files.geomajas.org/documentation/geomajas-project-server/snapshot/geomajas-server-documenatation/html/master.html - Geomajas szerver oldal dokumentációja.&lt;br /&gt;
&lt;br /&gt;
* http://www.gwtproject.org/ - GWT oldala a pluginekkel.&lt;br /&gt;
* https://maven.apache.org/ - Maven oldala, az utasításokkal, pom.xml felépítésével...&lt;br /&gt;
* http://www.geosparc.com/ - Geosparc hivatalos oldala&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=448</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=448"/>
		<updated>2017-05-02T05:29:37Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* A Geomajas és a Geosparc */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra (Spring)&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
* Biztonság (Token)&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el, ez a következő linken érhető el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vagy egyben&lt;br /&gt;
&amp;lt;code&amp;gt;mvn install jetty: run&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. A szerver az alábbiakat nyújtja:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
A quickstart application csak a gwt-s kliens egy részét tartalmazza, ezért használja a &amp;lt;code&amp;gt;GeomajasServerExtension&amp;lt;/code&amp;gt;-t, a szerveroldal létező példánya helyett, viszont jó kiindulási pont a framework megismeréséhez.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordítható le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, így elég csak ezt lefordítani. A dokumentációban említett gs.js fájlt azonban már nem generálja le, csak egy dinamikus azonosítóval ellátott js-t. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript) letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető. Eredeti oldal, ami néha nem megy: (http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/).&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A Geomajas és a Geosparc==&lt;br /&gt;
&lt;br /&gt;
A geomajas mostanra a geosparc (http://www.geosparc.com/) alapja lett, amivel egyedi webes GIS alkalmazásokat készítenek.&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, egyenként az api és a gwt2 projekt rész lefordítható.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei ettől függetlenül egyenként is lefordíthatóak kisebb-nagyobb szerencsével.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner és az eclipse===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll. Az eclipse marketplace-ről letölthető GWT-s pluginnal és az eredeti GWT-s toollal sem sikerült a JettyRunner hibamentes konfigurációja, amely futtatásánál a SpringFramewörk valamiyel nhiányzó layerre panaszkodik.&lt;br /&gt;
&lt;br /&gt;
A fent említett paraméterekkel az eclipse neon.1, neon.2 és a neon.3, illetve a kepler-es verzión is kipróbálva ugyanez a hiba jelentkezett. A kísérlet, minek során a quickstart application fordítására tettem kísérletet, az eclipse a maven-es pom.xml-ben hibát talált, valószínűleg kompatibilitási okokból.   &lt;br /&gt;
&lt;br /&gt;
===Maven-es mintaprojekt===&lt;br /&gt;
A források között található régebbi dokumentációk egyikében hivatkozás van egy alap geomajas projekt létrehozására külső url-ről, azonban a funkció már nem elérhető.&lt;br /&gt;
&lt;br /&gt;
===Eltérések a dokumentációktól===&lt;br /&gt;
Sok helyen a dokumentációban hivatkozott komponensek nem léteznek, vagy nem elérhetőek. Legjobb példa a Javascriptes kliens kód, amely a dokumentáció alapján letölthető lenne a http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/ URL-ről. Ez tartalmazna egy gs.js-t és egy index.html-t. A githubról letölthető Javascript Client (https://github.com/geomajas/geomajas-project-javascript) distribution része ugyanezt a kódot generálja, vagy csak egy részét, ami működik azonban a dokumentációban említett elméletben geomajas javascript fájl helyett egy dinamikusan generált javascript keletkezik. Ez elindításkor nehezményezi a gs.js hiányát, azonban a dokumentációban szereplő példa részletek futtathatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas weboldal.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;br /&gt;
* http://files.geomajas.org/documentation/geomajas-project-server/snapshot/geomajas-server-documenatation/html/master.html - Geomajas szerver oldal dokumentációja.&lt;br /&gt;
&lt;br /&gt;
* http://www.gwtproject.org/ - GWT oldala a pluginekkel.&lt;br /&gt;
* https://maven.apache.org/ - Maven oldala, az utasításokkal, pom.xml felépítésével...&lt;br /&gt;
* http://www.geosparc.com/ - Geosparc hivatalos oldala&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=447</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=447"/>
		<updated>2017-05-02T05:29:19Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Hibák */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra (Spring)&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
* Biztonság (Token)&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el, ez a következő linken érhető el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vagy egyben&lt;br /&gt;
&amp;lt;code&amp;gt;mvn install jetty: run&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. A szerver az alábbiakat nyújtja:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
A quickstart application csak a gwt-s kliens egy részét tartalmazza, ezért használja a &amp;lt;code&amp;gt;GeomajasServerExtension&amp;lt;/code&amp;gt;-t, a szerveroldal létező példánya helyett, viszont jó kiindulási pont a framework megismeréséhez.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordítható le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, így elég csak ezt lefordítani. A dokumentációban említett gs.js fájlt azonban már nem generálja le, csak egy dinamikus azonosítóval ellátott js-t. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript) letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető. Eredeti oldal, ami néha nem megy: (http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/).&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A Geomajas és a Geosparc==&lt;br /&gt;
&lt;br /&gt;
A geomajas mostanra a geosparc (http://www.geosparc.com/) része lett, amivel egyedi webes GIS alkalmazásokat készítenek.&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, egyenként az api és a gwt2 projekt rész lefordítható.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei ettől függetlenül egyenként is lefordíthatóak kisebb-nagyobb szerencsével.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner és az eclipse===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll. Az eclipse marketplace-ről letölthető GWT-s pluginnal és az eredeti GWT-s toollal sem sikerült a JettyRunner hibamentes konfigurációja, amely futtatásánál a SpringFramewörk valamiyel nhiányzó layerre panaszkodik.&lt;br /&gt;
&lt;br /&gt;
A fent említett paraméterekkel az eclipse neon.1, neon.2 és a neon.3, illetve a kepler-es verzión is kipróbálva ugyanez a hiba jelentkezett. A kísérlet, minek során a quickstart application fordítására tettem kísérletet, az eclipse a maven-es pom.xml-ben hibát talált, valószínűleg kompatibilitási okokból.   &lt;br /&gt;
&lt;br /&gt;
===Maven-es mintaprojekt===&lt;br /&gt;
A források között található régebbi dokumentációk egyikében hivatkozás van egy alap geomajas projekt létrehozására külső url-ről, azonban a funkció már nem elérhető.&lt;br /&gt;
&lt;br /&gt;
===Eltérések a dokumentációktól===&lt;br /&gt;
Sok helyen a dokumentációban hivatkozott komponensek nem léteznek, vagy nem elérhetőek. Legjobb példa a Javascriptes kliens kód, amely a dokumentáció alapján letölthető lenne a http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/ URL-ről. Ez tartalmazna egy gs.js-t és egy index.html-t. A githubról letölthető Javascript Client (https://github.com/geomajas/geomajas-project-javascript) distribution része ugyanezt a kódot generálja, vagy csak egy részét, ami működik azonban a dokumentációban említett elméletben geomajas javascript fájl helyett egy dinamikusan generált javascript keletkezik. Ez elindításkor nehezményezi a gs.js hiányát, azonban a dokumentációban szereplő példa részletek futtathatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas weboldal.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;br /&gt;
* http://files.geomajas.org/documentation/geomajas-project-server/snapshot/geomajas-server-documenatation/html/master.html - Geomajas szerver oldal dokumentációja.&lt;br /&gt;
&lt;br /&gt;
* http://www.gwtproject.org/ - GWT oldala a pluginekkel.&lt;br /&gt;
* https://maven.apache.org/ - Maven oldala, az utasításokkal, pom.xml felépítésével...&lt;br /&gt;
* http://www.geosparc.com/ - Geosparc hivatalos oldala&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=446</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=446"/>
		<updated>2017-05-02T05:24:25Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Forrás, Linkek */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra (Spring)&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
* Biztonság (Token)&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el, ez a következő linken érhető el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vagy egyben&lt;br /&gt;
&amp;lt;code&amp;gt;mvn install jetty: run&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. A szerver az alábbiakat nyújtja:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
A quickstart application csak a gwt-s kliens egy részét tartalmazza, ezért használja a &amp;lt;code&amp;gt;GeomajasServerExtension&amp;lt;/code&amp;gt;-t, a szerveroldal létező példánya helyett, viszont jó kiindulási pont a framework megismeréséhez.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordítható le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, így elég csak ezt lefordítani. A dokumentációban említett gs.js fájlt azonban már nem generálja le, csak egy dinamikus azonosítóval ellátott js-t. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript) letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető. Eredeti oldal, ami néha nem megy: (http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/).&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A Geomajas és a Geosparc==&lt;br /&gt;
&lt;br /&gt;
A geomajas mostanra a geosparc (http://www.geosparc.com/) része lett, amivel egyedi webes GIS alkalmazásokat készítenek.&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei ettől függetlenül egyenként is lefordíthatóak kisebb-nagyobb szerencsével.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner és az eclipse===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll. Az eclipse marketplace-ről letölthető GWT-s pluginnal és az eredeti GWT-s toollal sem sikerült a JettyRunner hibamentes konfigurációja, amely futtatásánál a SpringFramewörk valamiyel nhiányzó layerre panaszkodik.&lt;br /&gt;
&lt;br /&gt;
A fent említett paraméterekkel az eclipse neon.1, neon.2 és a neon.3, illetve a kepler-es verzión is kipróbálva ugyanez a hiba jelentkezett.&lt;br /&gt;
&lt;br /&gt;
===Maven-es mintaprojekt===&lt;br /&gt;
A források között található régebbi dokumentációk egyikében hivatkozás van egy alap geomajas projekt létrehozására külső url-ről, azonban a funkció már nem elérhető.&lt;br /&gt;
&lt;br /&gt;
===Eltérések a dokumentációktól===&lt;br /&gt;
Sok helyen a dokumentációban hivatkozott komponensek nem léteznek, vagy nem elérhetőek. Legjobb példa a Javascriptes kliens kód, amely a dokumentáció alapján letölthető lenne a http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/ URL-ről. Ez tartalmazna egy gs.js-t és egy index.html-t. A githubról letölthető Javascript Client (https://github.com/geomajas/geomajas-project-javascript) distribution része ugyanezt a kódot generálja, vagy csak egy részét, ami működik azonban a dokumentációban említett elméletben geomajas javascript fájl helyett egy dinamikusan generált javascript keletkezik. Ez elindításkor nehezményezi a gs.js hiányát, azonban a dokumentációban szereplő példa részletek futtathatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas weboldal.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;br /&gt;
* http://files.geomajas.org/documentation/geomajas-project-server/snapshot/geomajas-server-documenatation/html/master.html - Geomajas szerver oldal dokumentációja.&lt;br /&gt;
&lt;br /&gt;
* http://www.gwtproject.org/ - GWT oldala a pluginekkel.&lt;br /&gt;
* https://maven.apache.org/ - Maven oldala, az utasításokkal, pom.xml felépítésével...&lt;br /&gt;
* http://www.geosparc.com/ - Geosparc hivatalos oldala&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=445</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=445"/>
		<updated>2017-05-02T05:20:50Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra (Spring)&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
* Biztonság (Token)&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el, ez a következő linken érhető el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vagy egyben&lt;br /&gt;
&amp;lt;code&amp;gt;mvn install jetty: run&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. A szerver az alábbiakat nyújtja:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
A quickstart application csak a gwt-s kliens egy részét tartalmazza, ezért használja a &amp;lt;code&amp;gt;GeomajasServerExtension&amp;lt;/code&amp;gt;-t, a szerveroldal létező példánya helyett, viszont jó kiindulási pont a framework megismeréséhez.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordítható le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, így elég csak ezt lefordítani. A dokumentációban említett gs.js fájlt azonban már nem generálja le, csak egy dinamikus azonosítóval ellátott js-t. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript) letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető. Eredeti oldal, ami néha nem megy: (http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/).&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A Geomajas és a Geosparc==&lt;br /&gt;
&lt;br /&gt;
A geomajas mostanra a geosparc (http://www.geosparc.com/) része lett, amivel egyedi webes GIS alkalmazásokat készítenek.&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei ettől függetlenül egyenként is lefordíthatóak kisebb-nagyobb szerencsével.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner és az eclipse===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll. Az eclipse marketplace-ről letölthető GWT-s pluginnal és az eredeti GWT-s toollal sem sikerült a JettyRunner hibamentes konfigurációja, amely futtatásánál a SpringFramewörk valamiyel nhiányzó layerre panaszkodik.&lt;br /&gt;
&lt;br /&gt;
A fent említett paraméterekkel az eclipse neon.1, neon.2 és a neon.3, illetve a kepler-es verzión is kipróbálva ugyanez a hiba jelentkezett.&lt;br /&gt;
&lt;br /&gt;
===Maven-es mintaprojekt===&lt;br /&gt;
A források között található régebbi dokumentációk egyikében hivatkozás van egy alap geomajas projekt létrehozására külső url-ről, azonban a funkció már nem elérhető.&lt;br /&gt;
&lt;br /&gt;
===Eltérések a dokumentációktól===&lt;br /&gt;
Sok helyen a dokumentációban hivatkozott komponensek nem léteznek, vagy nem elérhetőek. Legjobb példa a Javascriptes kliens kód, amely a dokumentáció alapján letölthető lenne a http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/ URL-ről. Ez tartalmazna egy gs.js-t és egy index.html-t. A githubról letölthető Javascript Client (https://github.com/geomajas/geomajas-project-javascript) distribution része ugyanezt a kódot generálja, vagy csak egy részét, ami működik azonban a dokumentációban említett elméletben geomajas javascript fájl helyett egy dinamikusan generált javascript keletkezik. Ez elindításkor nehezményezi a gs.js hiányát, azonban a dokumentációban szereplő példa részletek futtathatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas weboldal.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;br /&gt;
* http://files.geomajas.org/documentation/geomajas-project-server/snapshot/geomajas-server-documenatation/html/master.html - Geomajas szerver oldal dokumentációja.&lt;br /&gt;
&lt;br /&gt;
* http://www.gwtproject.org/ - GWT oldala a pluginekkel.&lt;br /&gt;
* https://maven.apache.org/ - Maven oldala, az utasításokkal, pom.xml felépítésével...&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=444</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=444"/>
		<updated>2017-05-02T05:14:53Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* A GWT quickstart application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. A szerver az alábbiakat nyújtja:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
A quickstart application csak a gwt-s kliens egy részét tartalmazza, ezért használja a &amp;lt;code&amp;gt;GeomajasServerExtension&amp;lt;/code&amp;gt;-t, a szerveroldal létező példánya helyett, viszont jó kiindulási pont a framework megismeréséhez.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordítható le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, így elég csak ezt lefordítani. A dokumentációban említett gs.js fájlt azonban már nem generálja le, csak egy dinamikus azonosítóval ellátott js-t. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript) letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető. Eredeti oldal, ami néha nem megy: (http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/).&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A Geomajas és a Geosparc==&lt;br /&gt;
&lt;br /&gt;
A geomajas mostanra a geosparc (http://www.geosparc.com/) része lett, amivel egyedi webes GIS alkalmazásokat készítenek.&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei ettől függetlenül egyenként is lefordíthatóak kisebb-nagyobb szerencsével.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner és az eclipse===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll. Az eclipse marketplace-ről letölthető GWT-s pluginnal és az eredeti GWT-s toollal sem sikerült a JettyRunner hibamentes konfigurációja, amely futtatásánál a SpringFramewörk valamiyel nhiányzó layerre panaszkodik.&lt;br /&gt;
&lt;br /&gt;
A fent említett paraméterekkel az eclipse neon.1, neon.2 és a neon.3, illetve a kepler-es verzión is kipróbálva ugyanez a hiba jelentkezett.&lt;br /&gt;
&lt;br /&gt;
===Maven-es mintaprojekt===&lt;br /&gt;
A források között található régebbi dokumentációk egyikében hivatkozás van egy alap geomajas projekt létrehozására külső url-ről, azonban a funkció már nem elérhető.&lt;br /&gt;
&lt;br /&gt;
===Eltérések a dokumentációktól===&lt;br /&gt;
Sok helyen a dokumentációban hivatkozott komponensek nem léteznek, vagy nem elérhetőek. Legjobb példa a Javascriptes kliens kód, amely a dokumentáció alapján letölthető lenne a http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/ URL-ről. Ez tartalmazna egy gs.js-t és egy index.html-t. A githubról letölthető Javascript Client (https://github.com/geomajas/geomajas-project-javascript) distribution része ugyanezt a kódot generálja, vagy csak egy részét, ami működik azonban a dokumentációban említett elméletben geomajas javascript fájl helyett egy dinamikusan generált javascript keletkezik. Ez elindításkor nehezményezi a gs.js hiányát, azonban a dokumentációban szereplő példa részletek futtathatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas weboldal.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;br /&gt;
* http://files.geomajas.org/documentation/geomajas-project-server/snapshot/geomajas-server-documenatation/html/master.html - Geomajas szerver oldal dokumentációja.&lt;br /&gt;
&lt;br /&gt;
* http://www.gwtproject.org/ - GWT oldala a pluginekkel.&lt;br /&gt;
* https://maven.apache.org/ - Maven oldala, az utasításokkal, pom.xml felépítésével...&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=443</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=443"/>
		<updated>2017-05-02T05:13:49Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* A GWT quickstart application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. A szerver az alábbiakat nyújtja:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
A quickstart application a gwt-s kliens részét tartalmazza, ezért használja a &amp;lt;code&amp;gt;GeomajasServerExtension&amp;lt;/code&amp;gt;-t, a szerveroldal létező példánya heyett.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordítható le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, így elég csak ezt lefordítani. A dokumentációban említett gs.js fájlt azonban már nem generálja le, csak egy dinamikus azonosítóval ellátott js-t. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript) letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető. Eredeti oldal, ami néha nem megy: (http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/).&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A Geomajas és a Geosparc==&lt;br /&gt;
&lt;br /&gt;
A geomajas mostanra a geosparc (http://www.geosparc.com/) része lett, amivel egyedi webes GIS alkalmazásokat készítenek.&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei ettől függetlenül egyenként is lefordíthatóak kisebb-nagyobb szerencsével.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner és az eclipse===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll. Az eclipse marketplace-ről letölthető GWT-s pluginnal és az eredeti GWT-s toollal sem sikerült a JettyRunner hibamentes konfigurációja, amely futtatásánál a SpringFramewörk valamiyel nhiányzó layerre panaszkodik.&lt;br /&gt;
&lt;br /&gt;
A fent említett paraméterekkel az eclipse neon.1, neon.2 és a neon.3, illetve a kepler-es verzión is kipróbálva ugyanez a hiba jelentkezett.&lt;br /&gt;
&lt;br /&gt;
===Maven-es mintaprojekt===&lt;br /&gt;
A források között található régebbi dokumentációk egyikében hivatkozás van egy alap geomajas projekt létrehozására külső url-ről, azonban a funkció már nem elérhető.&lt;br /&gt;
&lt;br /&gt;
===Eltérések a dokumentációktól===&lt;br /&gt;
Sok helyen a dokumentációban hivatkozott komponensek nem léteznek, vagy nem elérhetőek. Legjobb példa a Javascriptes kliens kód, amely a dokumentáció alapján letölthető lenne a http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/ URL-ről. Ez tartalmazna egy gs.js-t és egy index.html-t. A githubról letölthető Javascript Client (https://github.com/geomajas/geomajas-project-javascript) distribution része ugyanezt a kódot generálja, vagy csak egy részét, ami működik azonban a dokumentációban említett elméletben geomajas javascript fájl helyett egy dinamikusan generált javascript keletkezik. Ez elindításkor nehezményezi a gs.js hiányát, azonban a dokumentációban szereplő példa részletek futtathatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas weboldal.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;br /&gt;
* http://files.geomajas.org/documentation/geomajas-project-server/snapshot/geomajas-server-documenatation/html/master.html - Geomajas szerver oldal dokumentációja.&lt;br /&gt;
&lt;br /&gt;
* http://www.gwtproject.org/ - GWT oldala a pluginekkel.&lt;br /&gt;
* https://maven.apache.org/ - Maven oldala, az utasításokkal, pom.xml felépítésével...&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=442</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=442"/>
		<updated>2017-05-02T05:11:07Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. A szerver az alábbiakat nyújtja:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordítható le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, így elég csak ezt lefordítani. A dokumentációban említett gs.js fájlt azonban már nem generálja le, csak egy dinamikus azonosítóval ellátott js-t. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript) letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető. Eredeti oldal, ami néha nem megy: (http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/).&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==A Geomajas és a Geosparc==&lt;br /&gt;
&lt;br /&gt;
A geomajas mostanra a geosparc (http://www.geosparc.com/) része lett, amivel egyedi webes GIS alkalmazásokat készítenek.&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei ettől függetlenül egyenként is lefordíthatóak kisebb-nagyobb szerencsével.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner és az eclipse===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll. Az eclipse marketplace-ről letölthető GWT-s pluginnal és az eredeti GWT-s toollal sem sikerült a JettyRunner hibamentes konfigurációja, amely futtatásánál a SpringFramewörk valamiyel nhiányzó layerre panaszkodik.&lt;br /&gt;
&lt;br /&gt;
A fent említett paraméterekkel az eclipse neon.1, neon.2 és a neon.3, illetve a kepler-es verzión is kipróbálva ugyanez a hiba jelentkezett.&lt;br /&gt;
&lt;br /&gt;
===Maven-es mintaprojekt===&lt;br /&gt;
A források között található régebbi dokumentációk egyikében hivatkozás van egy alap geomajas projekt létrehozására külső url-ről, azonban a funkció már nem elérhető.&lt;br /&gt;
&lt;br /&gt;
===Eltérések a dokumentációktól===&lt;br /&gt;
Sok helyen a dokumentációban hivatkozott komponensek nem léteznek, vagy nem elérhetőek. Legjobb példa a Javascriptes kliens kód, amely a dokumentáció alapján letölthető lenne a http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/ URL-ről. Ez tartalmazna egy gs.js-t és egy index.html-t. A githubról letölthető Javascript Client (https://github.com/geomajas/geomajas-project-javascript) distribution része ugyanezt a kódot generálja, vagy csak egy részét, ami működik azonban a dokumentációban említett elméletben geomajas javascript fájl helyett egy dinamikusan generált javascript keletkezik. Ez elindításkor nehezményezi a gs.js hiányát, azonban a dokumentációban szereplő példa részletek futtathatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas weboldal.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;br /&gt;
* http://files.geomajas.org/documentation/geomajas-project-server/snapshot/geomajas-server-documenatation/html/master.html - Geomajas szerver oldal dokumentációja.&lt;br /&gt;
&lt;br /&gt;
* http://www.gwtproject.org/ - GWT oldala a pluginekkel.&lt;br /&gt;
* https://maven.apache.org/ - Maven oldala, az utasításokkal, pom.xml felépítésével...&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=441</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=441"/>
		<updated>2017-05-02T05:01:55Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Javascript API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. A szerver az alábbiakat nyújtja:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordítható le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, így elég csak ezt lefordítani. A dokumentációban említett gs.js fájlt azonban már nem generálja le, csak egy dinamikus azonosítóval ellátott js-t. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript) letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető. Eredeti oldal, ami néha nem megy: (http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/).&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei ettől függetlenül egyenként is lefordíthatóak kisebb-nagyobb szerencsével.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner és az eclipse===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll. Az eclipse marketplace-ről letölthető GWT-s pluginnal és az eredeti GWT-s toollal sem sikerült a JettyRunner hibamentes konfigurációja, amely futtatásánál a SpringFramewörk valamiyel nhiányzó layerre panaszkodik.&lt;br /&gt;
&lt;br /&gt;
A fent említett paraméterekkel az eclipse neon.1, neon.2 és a neon.3, illetve a kepler-es verzión is kipróbálva ugyanez a hiba jelentkezett.&lt;br /&gt;
&lt;br /&gt;
===Maven-es mintaprojekt===&lt;br /&gt;
A források között található régebbi dokumentációk egyikében hivatkozás van egy alap geomajas projekt létrehozására külső url-ről, azonban a funkció már nem elérhető.&lt;br /&gt;
&lt;br /&gt;
===Eltérések a dokumentációktól===&lt;br /&gt;
Sok helyen a dokumentációban hivatkozott komponensek nem léteznek, vagy nem elérhetőek. Legjobb példa a Javascriptes kliens kód, amely a dokumentáció alapján letölthető lenne a http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/ URL-ről. Ez tartalmazna egy gs.js-t és egy index.html-t. A githubról letölthető Javascript Client (https://github.com/geomajas/geomajas-project-javascript) distribution része ugyanezt a kódot generálja, vagy csak egy részét, ami működik azonban a dokumentációban említett elméletben geomajas javascript fájl helyett egy dinamikusan generált javascript keletkezik. Ez elindításkor nehezményezi a gs.js hiányát, azonban a dokumentációban szereplő példa részletek futtathatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas weboldal.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;br /&gt;
* http://files.geomajas.org/documentation/geomajas-project-server/snapshot/geomajas-server-documenatation/html/master.html - Geomajas szerver oldal dokumentációja.&lt;br /&gt;
&lt;br /&gt;
* http://www.gwtproject.org/ - GWT oldala a pluginekkel.&lt;br /&gt;
* https://maven.apache.org/ - Maven oldala, az utasításokkal, pom.xml felépítésével...&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=440</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=440"/>
		<updated>2017-05-02T05:01:26Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Javascript API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. A szerver az alábbiakat nyújtja:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordítható le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, így elég csak ezt lefordítani. A dokumentációban említett gs.js fájlt azonban már nem generálja le, csak egy dinamikus azonosítóval ellátott js-t. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető. Eredeti oldal, ami néha nem megy: (http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/).&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei ettől függetlenül egyenként is lefordíthatóak kisebb-nagyobb szerencsével.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner és az eclipse===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll. Az eclipse marketplace-ről letölthető GWT-s pluginnal és az eredeti GWT-s toollal sem sikerült a JettyRunner hibamentes konfigurációja, amely futtatásánál a SpringFramewörk valamiyel nhiányzó layerre panaszkodik.&lt;br /&gt;
&lt;br /&gt;
A fent említett paraméterekkel az eclipse neon.1, neon.2 és a neon.3, illetve a kepler-es verzión is kipróbálva ugyanez a hiba jelentkezett.&lt;br /&gt;
&lt;br /&gt;
===Maven-es mintaprojekt===&lt;br /&gt;
A források között található régebbi dokumentációk egyikében hivatkozás van egy alap geomajas projekt létrehozására külső url-ről, azonban a funkció már nem elérhető.&lt;br /&gt;
&lt;br /&gt;
===Eltérések a dokumentációktól===&lt;br /&gt;
Sok helyen a dokumentációban hivatkozott komponensek nem léteznek, vagy nem elérhetőek. Legjobb példa a Javascriptes kliens kód, amely a dokumentáció alapján letölthető lenne a http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/ URL-ről. Ez tartalmazna egy gs.js-t és egy index.html-t. A githubról letölthető Javascript Client (https://github.com/geomajas/geomajas-project-javascript) distribution része ugyanezt a kódot generálja, vagy csak egy részét, ami működik azonban a dokumentációban említett elméletben geomajas javascript fájl helyett egy dinamikusan generált javascript keletkezik. Ez elindításkor nehezményezi a gs.js hiányát, azonban a dokumentációban szereplő példa részletek futtathatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas weboldal.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;br /&gt;
* http://files.geomajas.org/documentation/geomajas-project-server/snapshot/geomajas-server-documenatation/html/master.html - Geomajas szerver oldal dokumentációja.&lt;br /&gt;
&lt;br /&gt;
* http://www.gwtproject.org/ - GWT oldala a pluginekkel.&lt;br /&gt;
* https://maven.apache.org/ - Maven oldala, az utasításokkal, pom.xml felépítésével...&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=439</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=439"/>
		<updated>2017-05-02T04:53:44Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Javascript API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. A szerver az alábbiakat nyújtja:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordítható le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető. Eredeti oldal, ami néha nem megy: (http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/).&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei ettől függetlenül egyenként is lefordíthatóak kisebb-nagyobb szerencsével.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner és az eclipse===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll. Az eclipse marketplace-ről letölthető GWT-s pluginnal és az eredeti GWT-s toollal sem sikerült a JettyRunner hibamentes konfigurációja, amely futtatásánál a SpringFramewörk valamiyel nhiányzó layerre panaszkodik.&lt;br /&gt;
&lt;br /&gt;
A fent említett paraméterekkel az eclipse neon.1, neon.2 és a neon.3, illetve a kepler-es verzión is kipróbálva ugyanez a hiba jelentkezett.&lt;br /&gt;
&lt;br /&gt;
===Maven-es mintaprojekt===&lt;br /&gt;
A források között található régebbi dokumentációk egyikében hivatkozás van egy alap geomajas projekt létrehozására külső url-ről, azonban a funkció már nem elérhető.&lt;br /&gt;
&lt;br /&gt;
===Eltérések a dokumentációktól===&lt;br /&gt;
Sok helyen a dokumentációban hivatkozott komponensek nem léteznek, vagy nem elérhetőek. Legjobb példa a Javascriptes kliens kód, amely a dokumentáció alapján letölthető lenne a http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/ URL-ről. Ez tartalmazna egy gs.js-t és egy index.html-t. A githubról letölthető Javascript Client (https://github.com/geomajas/geomajas-project-javascript) distribution része ugyanezt a kódot generálja, vagy csak egy részét, ami működik azonban a dokumentációban említett elméletben geomajas javascript fájl helyett egy dinamikusan generált javascript keletkezik. Ez elindításkor nehezményezi a gs.js hiányát, azonban a dokumentációban szereplő példa részletek futtathatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas weboldal.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;br /&gt;
* http://files.geomajas.org/documentation/geomajas-project-server/snapshot/geomajas-server-documenatation/html/master.html - Geomajas szerver oldal dokumentációja.&lt;br /&gt;
&lt;br /&gt;
* http://www.gwtproject.org/ - GWT oldala a pluginekkel.&lt;br /&gt;
* https://maven.apache.org/ - Maven oldala, az utasításokkal, pom.xml felépítésével...&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=438</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=438"/>
		<updated>2017-05-02T04:53:11Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Szerver oldal */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. A szerver az alábbiakat nyújtja:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető. Eredeti oldal, ami néha nem megy: (http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/).&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei ettől függetlenül egyenként is lefordíthatóak kisebb-nagyobb szerencsével.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner és az eclipse===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll. Az eclipse marketplace-ről letölthető GWT-s pluginnal és az eredeti GWT-s toollal sem sikerült a JettyRunner hibamentes konfigurációja, amely futtatásánál a SpringFramewörk valamiyel nhiányzó layerre panaszkodik.&lt;br /&gt;
&lt;br /&gt;
A fent említett paraméterekkel az eclipse neon.1, neon.2 és a neon.3, illetve a kepler-es verzión is kipróbálva ugyanez a hiba jelentkezett.&lt;br /&gt;
&lt;br /&gt;
===Maven-es mintaprojekt===&lt;br /&gt;
A források között található régebbi dokumentációk egyikében hivatkozás van egy alap geomajas projekt létrehozására külső url-ről, azonban a funkció már nem elérhető.&lt;br /&gt;
&lt;br /&gt;
===Eltérések a dokumentációktól===&lt;br /&gt;
Sok helyen a dokumentációban hivatkozott komponensek nem léteznek, vagy nem elérhetőek. Legjobb példa a Javascriptes kliens kód, amely a dokumentáció alapján letölthető lenne a http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/ URL-ről. Ez tartalmazna egy gs.js-t és egy index.html-t. A githubról letölthető Javascript Client (https://github.com/geomajas/geomajas-project-javascript) distribution része ugyanezt a kódot generálja, vagy csak egy részét, ami működik azonban a dokumentációban említett elméletben geomajas javascript fájl helyett egy dinamikusan generált javascript keletkezik. Ez elindításkor nehezményezi a gs.js hiányát, azonban a dokumentációban szereplő példa részletek futtathatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas weboldal.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;br /&gt;
* http://files.geomajas.org/documentation/geomajas-project-server/snapshot/geomajas-server-documenatation/html/master.html - Geomajas szerver oldal dokumentációja.&lt;br /&gt;
&lt;br /&gt;
* http://www.gwtproject.org/ - GWT oldala a pluginekkel.&lt;br /&gt;
* https://maven.apache.org/ - Maven oldala, az utasításokkal, pom.xml felépítésével...&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=407</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=407"/>
		<updated>2017-04-25T05:57:13Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Forrás, Linkek */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. Négy mód áll rendelkezésre a szerver bővítéséhez:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető. Eredeti oldal, ami néha nem megy: (http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/).&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei ettől függetlenül egyenként is lefordíthatóak kisebb-nagyobb szerencsével.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner és az eclipse===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll. Az eclipse marketplace-ről letölthető GWT-s pluginnal és az eredeti GWT-s toollal sem sikerült a JettyRunner hibamentes konfigurációja, amely futtatásánál a SpringFramewörk valamiyel nhiányzó layerre panaszkodik.&lt;br /&gt;
&lt;br /&gt;
A fent említett paraméterekkel az eclipse neon.1, neon.2 és a neon.3, illetve a kepler-es verzión is kipróbálva ugyanez a hiba jelentkezett.&lt;br /&gt;
&lt;br /&gt;
===Maven-es mintaprojekt===&lt;br /&gt;
A források között található régebbi dokumentációk egyikében hivatkozás van egy alap geomajas projekt létrehozására külső url-ről, azonban a funkció már nem elérhető.&lt;br /&gt;
&lt;br /&gt;
===Eltérések a dokumentációktól===&lt;br /&gt;
Sok helyen a dokumentációban hivatkozott komponensek nem léteznek, vagy nem elérhetőek. Legjobb példa a Javascriptes kliens kód, amely a dokumentáció alapján letölthető lenne a http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/ URL-ről. Ez tartalmazna egy gs.js-t és egy index.html-t. A githubról letölthető Javascript Client (https://github.com/geomajas/geomajas-project-javascript) distribution része ugyanezt a kódot generálja, vagy csak egy részét, ami működik azonban a dokumentációban említett elméletben geomajas javascript fájl helyett egy dinamikusan generált javascript keletkezik. Ez elindításkor nehezményezi a gs.js hiányát, azonban a dokumentációban szereplő példa részletek futtathatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas weboldal.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;br /&gt;
* http://files.geomajas.org/documentation/geomajas-project-server/snapshot/geomajas-server-documenatation/html/master.html - Geomajas szerver oldal dokumentációja.&lt;br /&gt;
&lt;br /&gt;
* http://www.gwtproject.org/ - GWT oldala a pluginekkel.&lt;br /&gt;
* https://maven.apache.org/ - Maven oldala, az utasításokkal, pom.xml felépítésével...&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=406</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=406"/>
		<updated>2017-04-25T05:55:31Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Javascript API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. Négy mód áll rendelkezésre a szerver bővítéséhez:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető. Eredeti oldal, ami néha nem megy: (http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/).&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei ettől függetlenül egyenként is lefordíthatóak kisebb-nagyobb szerencsével.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner és az eclipse===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll. Az eclipse marketplace-ről letölthető GWT-s pluginnal és az eredeti GWT-s toollal sem sikerült a JettyRunner hibamentes konfigurációja, amely futtatásánál a SpringFramewörk valamiyel nhiányzó layerre panaszkodik.&lt;br /&gt;
&lt;br /&gt;
A fent említett paraméterekkel az eclipse neon.1, neon.2 és a neon.3, illetve a kepler-es verzión is kipróbálva ugyanez a hiba jelentkezett.&lt;br /&gt;
&lt;br /&gt;
===Maven-es mintaprojekt===&lt;br /&gt;
A források között található régebbi dokumentációk egyikében hivatkozás van egy alap geomajas projekt létrehozására külső url-ről, azonban a funkció már nem elérhető.&lt;br /&gt;
&lt;br /&gt;
===Eltérések a dokumentációktól===&lt;br /&gt;
Sok helyen a dokumentációban hivatkozott komponensek nem léteznek, vagy nem elérhetőek. Legjobb példa a Javascriptes kliens kód, amely a dokumentáció alapján letölthető lenne a http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/ URL-ről. Ez tartalmazna egy gs.js-t és egy index.html-t. A githubról letölthető Javascript Client (https://github.com/geomajas/geomajas-project-javascript) distribution része ugyanezt a kódot generálja, vagy csak egy részét, ami működik azonban a dokumentációban említett elméletben geomajas javascript fájl helyett egy dinamikusan generált javascript keletkezik. Ez elindításkor nehezményezi a gs.js hiányát, azonban a dokumentációban szereplő példa részletek futtathatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas weboldal.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;br /&gt;
* http://files.geomajas.org/documentation/geomajas-project-server/snapshot/geomajas-server-documenatation/html/master.html - Geomajas szerver oldal dokumentációja.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=405</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=405"/>
		<updated>2017-04-25T05:54:03Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. Négy mód áll rendelkezésre a szerver bővítéséhez:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei ettől függetlenül egyenként is lefordíthatóak kisebb-nagyobb szerencsével.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner és az eclipse===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll. Az eclipse marketplace-ről letölthető GWT-s pluginnal és az eredeti GWT-s toollal sem sikerült a JettyRunner hibamentes konfigurációja, amely futtatásánál a SpringFramewörk valamiyel nhiányzó layerre panaszkodik.&lt;br /&gt;
&lt;br /&gt;
A fent említett paraméterekkel az eclipse neon.1, neon.2 és a neon.3, illetve a kepler-es verzión is kipróbálva ugyanez a hiba jelentkezett.&lt;br /&gt;
&lt;br /&gt;
===Maven-es mintaprojekt===&lt;br /&gt;
A források között található régebbi dokumentációk egyikében hivatkozás van egy alap geomajas projekt létrehozására külső url-ről, azonban a funkció már nem elérhető.&lt;br /&gt;
&lt;br /&gt;
===Eltérések a dokumentációktól===&lt;br /&gt;
Sok helyen a dokumentációban hivatkozott komponensek nem léteznek, vagy nem elérhetőek. Legjobb példa a Javascriptes kliens kód, amely a dokumentáció alapján letölthető lenne a http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/ URL-ről. Ez tartalmazna egy gs.js-t és egy index.html-t. A githubról letölthető Javascript Client (https://github.com/geomajas/geomajas-project-javascript) distribution része ugyanezt a kódot generálja, vagy csak egy részét, ami működik azonban a dokumentációban említett elméletben geomajas javascript fájl helyett egy dinamikusan generált javascript keletkezik. Ez elindításkor nehezményezi a gs.js hiányát, azonban a dokumentációban szereplő példa részletek futtathatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas weboldal.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;br /&gt;
* http://files.geomajas.org/documentation/geomajas-project-server/snapshot/geomajas-server-documenatation/html/master.html - Geomajas szerver oldal dokumentációja.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=404</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=404"/>
		<updated>2017-04-25T05:53:08Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Hibák */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. Négy mód áll rendelkezésre a szerver bővítéséhez:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei ettől függetlenül egyenként is lefordíthatóak kisebb-nagyobb szerencsével.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner és az eclipse===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll. Az eclipse marketplace-ről letölthető GWT-s pluginnal és az eredeti GWT-s toollal sem sikerült a JettyRunner hibamentes konfigurációja, amely futtatásánál a SpringFramewörk valamiyel nhiányzó layerre panaszkodik.&lt;br /&gt;
&lt;br /&gt;
A fent említett paraméterekkel az eclipse neon.1, neon.2 és a neon.3, illetve a kepler-es verzión is kipróbálva ugyanez a hiba jelentkezett.&lt;br /&gt;
&lt;br /&gt;
==Maven-es mintaprojekt==&lt;br /&gt;
A források között található régebbi dokumentációk egyikében hivatkozás van egy alap geomajas projekt létrehozására külső url-ről, azonban a funkció már nem elérhető.&lt;br /&gt;
&lt;br /&gt;
==Eltérések a dokumentációktól==&lt;br /&gt;
Sok helyen a dokumentációban hivatkozott komponensek nem léteznek, vagy nem elérhetőek. Legjobb példa a Javascriptes kliens kód, amely a dokumentáció alapján letölthető lenne a http://dev.geomajas.org/geomajas-project-javascript-gwt2-distribution-1.0.0-SNAPSHOT/ URL-ről. Ez tartalmazna egy gs.js-t és egy index.html-t. A githubról letölthető Javascript Client (https://github.com/geomajas/geomajas-project-javascript) distribution része ugyanezt a kódot generálja, vagy csak egy részét, ami működik azonban a dokumentációban említett elméletben geomajas javascript fájl helyett egy dinamikusan generált javascript keletkezik. Ez elindításkor nehezményezi a gs.js hiányát, azonban a dokumentációban szereplő példa részletek futtathatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas weboldal.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;br /&gt;
* http://files.geomajas.org/documentation/geomajas-project-server/snapshot/geomajas-server-documenatation/html/master.html - Geomajas szerver oldal dokumentációja.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=403</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=403"/>
		<updated>2017-04-25T05:41:20Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* JettyRunner */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. Négy mód áll rendelkezésre a szerver bővítéséhez:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei ettől függetlenül egyenként is lefordíthatóak kisebb-nagyobb szerencsével.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll. Az eclipse marketplace-ről letölthető GWT-s pluginnal és az eredeti GWT-s toollal sem sikerült a JettyRunner hibamentes konfigurációja, amely futtatásánál a SpringFramewörk valamiyel nhiányzó layerre panaszkodik.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas weboldal.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;br /&gt;
* http://files.geomajas.org/documentation/geomajas-project-server/snapshot/geomajas-server-documenatation/html/master.html - Geomajas szerver oldal dokumentációja.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=402</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=402"/>
		<updated>2017-04-25T05:37:55Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Javadoc */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. Négy mód áll rendelkezésre a szerver bővítéséhez:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei ettől függetlenül egyenként is lefordíthatóak kisebb-nagyobb szerencsével.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas weboldal.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;br /&gt;
* http://files.geomajas.org/documentation/geomajas-project-server/snapshot/geomajas-server-documenatation/html/master.html - Geomajas szerver oldal dokumentációja.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=401</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=401"/>
		<updated>2017-04-25T05:37:13Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Forrás, Linkek */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. Négy mód áll rendelkezésre a szerver bővítéséhez:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei egyenként is lefordíthatóak.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas weboldal.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;br /&gt;
* http://files.geomajas.org/documentation/geomajas-project-server/snapshot/geomajas-server-documenatation/html/master.html - Geomajas szerver oldal dokumentációja.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=400</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=400"/>
		<updated>2017-04-25T05:36:04Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Szerver oldal */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. Négy mód áll rendelkezésre a szerver bővítéséhez:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a Geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható. Ezek a &amp;quot;feature&amp;quot;-ök tartalmazzák a geometriát és az attribútumok halmazát. Az attribútumok lehetnek komplexek: &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; is.&lt;br /&gt;
* Pipeline-ok: Minden layerekkel foglalkozó Geomajas rész pipeline-okkal van megoldva. A pipeline-ok utasítások sorozatai, amelyek sorrendben hajtódnak végre. Habár minden layernek van default pipeline működése, ez felülírható.&lt;br /&gt;
* Biztonság: A biztonsági szolgáltatások közé tartozik a tokenes authentikáció, illetve a tokenhez tartozó hozzáféréssel elérhető objektumok megkeresése és visszatérése. Képes továbbá saját security ppolicy olvasására is.&lt;br /&gt;
&lt;br /&gt;
A vektor layer és az &amp;lt;code&amp;gt;InternalFeautre&amp;lt;/code&amp;gt; objektumai közötti konverziót a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt; mondja meg. Ez a következőképpen néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface FeatureModel {&lt;br /&gt;
&lt;br /&gt;
 void setLayerInfo(VectorLayerInfo vectorLayerInfo) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Attribute getAttribute(Object feature, String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Map&amp;lt;String, Attribute&amp;gt; getAttributes(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getId(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Geometry getGeometry(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttributes(Object feature, java.util.Map&amp;lt;String, Attribute&amp;gt; attributes) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setGeometry(Object feature, Geometry geometry) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object newInstance(String id) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 int getSrid() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 String getGeometryAttributeName() throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 boolean canHandle(Object feature);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A Geomajas POJO alapú, így nem vár komplex attribútumokat paraméterként, minden sima Java Object. Ez jól látható a vektor layer megvalósításában, amely az alábbi módon néz ki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface VectorLayer extends Layer&amp;lt;VectorLayerInfo&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
 boolean isCreateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isUpdateCapable();&lt;br /&gt;
&lt;br /&gt;
 boolean isDeleteCapable();&lt;br /&gt;
&lt;br /&gt;
 FeatureModel getFeatureModel();&lt;br /&gt;
&lt;br /&gt;
 Object create(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object saveOrUpdate(Object feature) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object read(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void delete(String featureId) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Iterator&amp;lt;?&amp;gt; getElements(Filter filter, int offset, int maxResultSize) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds(Filter filter) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Envelope getBounds() throws LayerException;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sok esetben az információ eljuttatása a layer objektumokhoz szabályokat követ:&lt;br /&gt;
* Ha egy primitív attribútum változik meg egy új értékre, akkor ez az új érték lecseréli a régit.&lt;br /&gt;
* Bármely attribútum értéke ha &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra állítódik, törlődik.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; attribútum értéke módosul egy létező objektumra, akkor az érték lecserélődik és az állapota frissül.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;-ra, vagy üresre módosul, üres kollekció lesz belőle. Az így árván maradt objektumok törléséről, vagy megmaradásáról a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben lehet nyilatkozni.&lt;br /&gt;
* Ha egy &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; attribútum értéke egy új attribútum csoportra változik, akkor a meglévő attribútumok frissülnek, új attribútumok jönnek létre, a hiányzó értékekről pedig a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben implementált viselkedés alkalmazódik.&lt;br /&gt;
* Az előző szabályok rekurzívan alkalmazhatóak.&lt;br /&gt;
&lt;br /&gt;
Ezen szabályok betartására példa az &amp;lt;code&amp;gt;Entity&amp;lt;/code&amp;gt; interface, amely az objektum-fák gráf összeillesztésénél játszik szerepet, ugyanis az összeillesztés megvalósítása nem a &amp;lt;code&amp;gt;FeatureModel&amp;lt;/code&amp;gt;-ben található, hanem az &amp;lt;code&amp;gt;EntityAttributeService&amp;lt;/code&amp;gt;-ben, amely feltételezi, hogy minden entitás megvalósítja a már említett interface-t.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
@Api(allMethods = true)&lt;br /&gt;
@UserImplemented&lt;br /&gt;
public interface Entity {&lt;br /&gt;
&lt;br /&gt;
 Object getId(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Entity getChild(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setChild(String name, Entity entity) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 EntityCollection getChildCollection(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 void setAttribute(String name, Object value) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
 Object getAttribute(String name) throws LayerException;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Egy gyökérentitástól kezdve a &amp;lt;code&amp;gt;@OneToMany&amp;lt;/code&amp;gt; és &amp;lt;code&amp;gt;@ManyToOne&amp;lt;/code&amp;gt; kapcsolatok bejárhatóak a &amp;lt;code&amp;gt;getChild()&amp;lt;/code&amp;gt; metódus segítségével.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei egyenként is lefordíthatóak.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas official site.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=399</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=399"/>
		<updated>2017-04-25T04:54:37Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
==Szerver oldal ==&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerveroldali rész felelős az alkalmazás intergálhatóságért, célja a business logika integrálása GIS eszközökbe. A szerveroldalon konfigurálhatóak a layerek, térképek és a szolgáltatások. Bár sok megjelenítéssel kapcsolatos technológát (vektorgrafika, renderelés) tartalmaz, konkrét megjelenítéssel nem foglalkozik. A szolgáltatások dependecy injection-nel vannak összekötve, továbbá az inversion of controlnak hála a szerver nagyon rugalmas.&lt;br /&gt;
&lt;br /&gt;
A Geomajas szerver oldal a Spring framework-öt használja. Négy mód áll rendelkezésre a szerver bővítéséhez:&lt;br /&gt;
* Utasítások: Az utasítások elsődleges interakciós pontok a szerver és a kliens között. A szolgáltatások, térképek, layerek megkeresése mind utasításokkal történit.&lt;br /&gt;
* Layerek: Ezek tárolják a térképek tulajdonságaihoz a hozzáférési pontokat. Egy Layer lehet raszteres, vagy vektor alapú és szerkeszthető. A vektor layer részeit képező objektumok a &amp;quot;feature object&amp;quot;-ként érhetőek el, amit a geomajas átkovertál számára használható formátumba, ezáltal nem kell interfaceket implementálni, minden POJO-k segítségével megoldható.     &lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei egyenként is lefordíthatóak.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas official site.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=398</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=398"/>
		<updated>2017-04-25T04:34:23Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Hibák */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei egyenként is lefordíthatóak.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas official site.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=356</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=356"/>
		<updated>2017-04-16T05:49:16Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Áttekintés */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
Főbb funkciók:&lt;br /&gt;
&lt;br /&gt;
* Integrált szerver-kliens architektúra&lt;br /&gt;
* Attribútum és geometria szerkesztés&lt;br /&gt;
* Egyedi attribútumdefiníció&lt;br /&gt;
* Magas szintű query lehetőségek (CQL)&lt;br /&gt;
* Bővíthető plugin mechanizmus&lt;br /&gt;
* Átfogó böngésző támogatás&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei egyenként is lefordíthatóak.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas official site.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=355</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=355"/>
		<updated>2017-04-16T05:39:46Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Javascript API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei egyenként is lefordíthatóak.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas official site.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=354</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=354"/>
		<updated>2017-04-16T05:39:00Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* A GWT quickstart application */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei egyenként is lefordíthatóak.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas official site.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=353</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=353"/>
		<updated>2017-04-16T05:37:57Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Forrás, Linkek */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei egyenként is lefordíthatóak.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas official site.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;br /&gt;
* http://mapservercloud.com:8080/geomajas/applications/tutorial/html/ - Működő bemutató a komponensekről.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=352</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=352"/>
		<updated>2017-04-16T05:35:42Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Áttekintés */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
A kliensoldal bár használható különálló módon, igazi hatékonyság és funkcióbőség a szerver és a kliens összehangolt működésével érhető el.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei egyenként is lefordíthatóak.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas official site.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=351</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=351"/>
		<updated>2017-04-16T05:32:58Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Hibák */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei egyenként is lefordíthatóak.&lt;br /&gt;
&lt;br /&gt;
===JettyRunner===&lt;br /&gt;
A geomajas fejlesztői oldalán leírtak alapján, a GWT kliens és szerver oldal, az eclipse segítségével is fordítható lett volna, azonban a GWT pluginnal felkonfigurált eclipse a projekt betöltését követően a JettyRunner jetty szerverkonfiguráció futtatásánál elszáll.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas official site.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=350</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=350"/>
		<updated>2017-04-16T05:29:39Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Javascript API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei egyenként is lefordíthatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas official site.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=349</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=349"/>
		<updated>2017-04-16T05:29:20Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Javascript API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt; segítségével érhetőek el.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   // custom code; the featureHolder contains the features&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei egyenként is lefordíthatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas official site.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=348</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=348"/>
		<updated>2017-04-16T05:28:47Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Javascript API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A layerekhez különböző funkciók társíthatóak, amelyek a &amp;lt;code&amp;gt;FeatureSearchService&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var service = map.getFeatureSearchService();&lt;br /&gt;
// A layer egy specifikus műveletének lekérése&lt;br /&gt;
service.searchById(layer, [id], function(featureHolder){&lt;br /&gt;
   var feature = featureHolder.getFeatures()[0];&lt;br /&gt;
   alert(&amp;quot;Feature found: &amp;quot; + feature.getLabel());&lt;br /&gt;
});&lt;br /&gt;
// összes művelet megkeresése&lt;br /&gt;
service.searchInBounds(layer, bounds, function(features) {&lt;br /&gt;
   // custom code; the featureHolder contains the features&lt;br /&gt;
   alert(&amp;quot;Features found: &amp;quot; + featureHolder.getFeatures().size());&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei egyenként is lefordíthatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas official site.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=347</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=347"/>
		<updated>2017-04-16T05:23:39Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Javascript API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei egyenként is lefordíthatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas official site.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=346</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=346"/>
		<updated>2017-04-16T05:22:49Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Javascript API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei egyenként is lefordíthatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas official site.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=345</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=345"/>
		<updated>2017-04-16T05:21:21Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Javadoc */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a maven a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei egyenként is lefordíthatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas official site.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=328</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=328"/>
		<updated>2017-04-11T05:35:10Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Hibák */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;br /&gt;
&lt;br /&gt;
===Javadoc===&lt;br /&gt;
Valamilyen oknál fogva a java, a régebbi javadocos kódrészleteket nem tudja értelmezni a projekteken belül és fordításnál szintaktikai hibát eredményez. A projektek szükséges részei egyenként is lefordíthatóak.&lt;br /&gt;
&lt;br /&gt;
==Forrás, Linkek==&lt;br /&gt;
&lt;br /&gt;
A wiki oldal megírásához az alábbi oldalakat használtam:&lt;br /&gt;
* http://www.geomajas.org/geomajas - Geomajas official site.&lt;br /&gt;
* https://github.com/geomajas - Geomajas Github.&lt;br /&gt;
* http://www.geomajas.org/client-javascript/snapshot - Javascript Snapshot és kis konfigurálással működőképessé varázsolható dokumentáció.&lt;br /&gt;
* http://files.geomajas.org/maven/ - A régebbi Geomajas dokumentációk.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=327</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=327"/>
		<updated>2017-04-11T05:24:48Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők eseménykezelők, ezek közül az előre definiáltak:&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;navigation&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a NavigationController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;zoomToRectangle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a ZoomToRectangleController,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionDrag&amp;#039;&amp;lt;/code&amp;gt;-al a FeatureSelectionController érhető el a &amp;lt;code&amp;gt;SelectionMethod.CLICK_AND_DRAG&amp;lt;/code&amp;gt;-el együtt,&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;#039;featureSelectionSingle&amp;#039;&amp;lt;/code&amp;gt;-el elérhető a FeatureSelectionController a &amp;lt;code&amp;gt;SelectionMethod.SINGLE_SELECTION&amp;lt;/code&amp;gt;-el.&lt;br /&gt;
&lt;br /&gt;
Hozzáadni az alábbi módon tudunk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
map.setMapController(gm.MapControllerFactory.createMapController(&amp;quot;default_kontroller_neve&amp;quot;));&lt;br /&gt;
&amp;lt;/source&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Van lehetőség saját &amp;lt;code&amp;gt;MapController&amp;lt;/code&amp;gt; létrehozására is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Üres kontroller létrehozása&lt;br /&gt;
var customMapController = gm.MapControllerFactory.createMapController();&lt;br /&gt;
&lt;br /&gt;
// Egyedi egérmozgás kezelő:&lt;br /&gt;
customMapController.setMouseMoveHandler(function(event) {&lt;br /&gt;
  &lt;br /&gt;
   var screenLocation = mapController.getLocation(event, &amp;quot;screen&amp;quot;);&lt;br /&gt;
   var worldLocation = mapController.getLocation(event, &amp;quot;world&amp;quot;);&lt;br /&gt;
   var screenLocationAsText = &amp;quot;Screen: &amp;quot; + screenLocation.getX() + &amp;quot;, &amp;quot; + screenLocation.getY();&lt;br /&gt;
   var worldLocationAsText = &amp;quot;World: &amp;quot; + worldLocation.getX() + &amp;quot;, &amp;quot; + worldLocation.getY();&lt;br /&gt;
   &lt;br /&gt;
});&lt;br /&gt;
// Egyéb események, amelyek:&lt;br /&gt;
//setMouseOverHandler&lt;br /&gt;
//setMouseOutHandler&lt;br /&gt;
//setDownHandler&lt;br /&gt;
//setUpHandler&lt;br /&gt;
//setDragHandler&lt;br /&gt;
//setDoubleClickHandler&lt;br /&gt;
&lt;br /&gt;
// Kontrollerre köthető események (activation, deactivation):&lt;br /&gt;
customMapController.setActivationHandler(function() {&lt;br /&gt;
   &lt;br /&gt;
   alert(&amp;#039;Custom controller activated!&amp;#039;)&lt;br /&gt;
});&lt;br /&gt;
//setDeactivationHandler&lt;br /&gt;
&lt;br /&gt;
// MapController hozzáadása a térképhez:&lt;br /&gt;
map.setMapController(customMapController);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=326</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=326"/>
		<updated>2017-04-11T05:00:22Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A térkép objektumhoz hozzárendelhetők események: az inicializációhoz, a térkép megszűnéséhez, vagy a térkép betöltéséhez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //Maphez hozzárendelhető események&lt;br /&gt;
    map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the added layer&lt;br /&gt;
        alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
        // custom code; event contains the removed layer&lt;br /&gt;
	alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
    });&lt;br /&gt;
    map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
        // custom code&lt;br /&gt;
	alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=325</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=325"/>
		<updated>2017-04-11T04:52:00Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Javascript API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=324</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=324"/>
		<updated>2017-04-11T04:51:18Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Javascript API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Client Javascript API a Client GWT-t használja. A Javascriptes projektnél a javadoc-os résznél elakad a maven, így csak az API és a gwt2 projekt fordíthat le egyenként. A gwt2 projekt tartalma egy javascript api-t használó mintaalkalmazás, az API ennek a részeként is lefordul, így elég csak ezt lefordítani. &lt;br /&gt;
&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
                //Maphez hozzárendelhető események&lt;br /&gt;
		map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
		   // custom code; event contains the added layer&lt;br /&gt;
		   alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
		});&lt;br /&gt;
		map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
		   // custom code; event contains the removed layer&lt;br /&gt;
		   alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
		});&lt;br /&gt;
		map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
		   // custom code&lt;br /&gt;
		   alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=321</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=321"/>
		<updated>2017-04-06T08:32:46Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* A GWT mintaalkalmazás projekt szerkezete */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT quickstart application==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
                //Maphez hozzárendelhető események&lt;br /&gt;
		map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
		   // custom code; event contains the added layer&lt;br /&gt;
		   alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
		});&lt;br /&gt;
		map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
		   // custom code; event contains the removed layer&lt;br /&gt;
		   alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
		});&lt;br /&gt;
		map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
		   // custom code&lt;br /&gt;
		   alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=320</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=320"/>
		<updated>2017-04-06T08:32:21Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Javascript API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT mintaalkalmazás projekt szerkezete==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
                //Maphez hozzárendelhető események&lt;br /&gt;
		map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
		   // custom code; event contains the added layer&lt;br /&gt;
		   alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
		});&lt;br /&gt;
		map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
		   // custom code; event contains the removed layer&lt;br /&gt;
		   alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
		});&lt;br /&gt;
		map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
		   // custom code&lt;br /&gt;
		   alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=319</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=319"/>
		<updated>2017-04-06T08:31:44Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT mintaalkalmazás projekt szerkezete==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
== Javascript API ==&lt;br /&gt;
A Githubról a Javascript project (https://github.com/geomajas/geomajas-project-javascript)letöltése után, lefordíthatjuk a gwt2-es projektet, ami legenerálja a szükséges javascript fájlokat és létrehozza a megfelelő index.html-eket, mind szerver mind kliens oldalon. Az eredmény ideiglenesen a http://people.inf.elte.hu/bagtaai címen elérhető.&lt;br /&gt;
&lt;br /&gt;
A map betöltéséhez ez a modul egy &amp;lt;code&amp;gt;onGeomajasLoad&amp;lt;/code&amp;gt; függvényt használ, ami lényegében az inicializációt hajtja végre. Az alábbi kódrészlet mutatja a legenerált index.html-ben szereplő példát.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
	var map;&lt;br /&gt;
	var WMS_BASE_URL = &amp;quot;http://apps.geomajas.org/geoserver/demo_world/ows&amp;quot;;&lt;br /&gt;
	var wmsVersion = &amp;quot;1.3.0&amp;quot;; //default value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	function onGeomajasLoad() {&lt;br /&gt;
		var mapConfig = new gm.MapConfiguration();&lt;br /&gt;
		mapConfig.setCrs(&amp;quot;EPSG:4326&amp;quot;, &amp;quot;DEGREES&amp;quot;);&lt;br /&gt;
		mapConfig.setMinimumResolution(2.1457672119140625E-5)&lt;br /&gt;
		mapConfig.setMaxBounds(new gm.Bbox(-180, -90, 360, 180));&lt;br /&gt;
&lt;br /&gt;
		// Map létrehozása és inicializálása&lt;br /&gt;
			&lt;br /&gt;
		map = new gm.Map(&amp;quot;js-map-element&amp;quot;, mapConfig);&lt;br /&gt;
&lt;br /&gt;
                //Maphez hozzárendelhető események&lt;br /&gt;
		map.getEventBus().addLayerAddedHandler(function(event) {&lt;br /&gt;
		   // custom code; event contains the added layer&lt;br /&gt;
		   alert(&amp;#039;layer added: &amp;#039; + event.getAddedLayer().getTitle());&lt;br /&gt;
		});&lt;br /&gt;
		map.getEventBus().addLayerRemovedHandler(function(event) {&lt;br /&gt;
		   // custom code; event contains the removed layer&lt;br /&gt;
		   alert(&amp;#039;layer removed: &amp;#039; + event.getRemovedLayer().getTitle());&lt;br /&gt;
		});&lt;br /&gt;
		map.getEventBus().addMapInitializationHandler(function(event) {&lt;br /&gt;
		   // custom code&lt;br /&gt;
		   alert(&amp;#039;map fully initialized&amp;#039;);&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		// Kiürítjük a map-et&lt;br /&gt;
		map.getLayersModel().clear();&lt;br /&gt;
		&lt;br /&gt;
		var tileConfig = new gm.layer.TileConfiguration(256, 256, new gm.Coordinate(-180, -90),&lt;br /&gt;
				map.getViewPort());&lt;br /&gt;
		var layerConfig = new gm.WmsLayerConfiguration();&lt;br /&gt;
&lt;br /&gt;
		layerConfig.setBaseUrl(WMS_BASE_URL);&lt;br /&gt;
		layerConfig.setFormat(&amp;quot;image/png&amp;quot;);&lt;br /&gt;
		layerConfig.setVersion(wmsVersion);&lt;br /&gt;
		layerConfig.setLayers(&amp;quot;demo_world:simplified_country_borders&amp;quot;);&lt;br /&gt;
		layerConfig.setMinimumResolution(2.1457672119140625E-5);&lt;br /&gt;
		layerConfig.setMaximumResolution(Number.MAX_VALUE);&lt;br /&gt;
&lt;br /&gt;
		// Létrehozunk egy WMS Layert és hozzáadjuk a maphez:&lt;br /&gt;
&lt;br /&gt;
		var wmsLayer = new gm.WmsLayer(&amp;quot;Blue Marble&amp;quot;, map, layerConfig, tileConfig);&lt;br /&gt;
		wmsLayer.setMaxBounds(new gm.Bbox(-180, -90, 360, 360));&lt;br /&gt;
		map.getLayersModel().addLayer(wmsLayer);		&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes. A javascriptes projekt a javadoc generálásánál elszáll, de egyenként fordítható az api és a gwt2 projekt.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=318</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=318"/>
		<updated>2017-04-06T08:15:01Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* A projekt szerkezete */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A GWT mintaalkalmazás projekt szerkezete==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=317</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=317"/>
		<updated>2017-04-04T04:54:15Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: /* Áttekintés */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon Java (GWT) és Javascript nyelven tesz megvalósításokat elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A projekt szerkezete==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=316</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=316"/>
		<updated>2017-04-04T04:53:04Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon GWT és Javascript nyelven megvalósításokat tesz elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használnak (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A projekt szerkezete==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pontot az Application.java fájl tartalmazza, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű: létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modul, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a ezt a Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
A checkstyle egy kódformázó plugin, amit a régebbi eclipsekben használtak, azonban az újakban már eleve benne van. Kezdetben a plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=310</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=310"/>
		<updated>2017-03-29T09:09:39Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon GWT és Javascript nyelven megvalósításokat tesz elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használ (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A projekt szerkezete==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pont az Application.java fájl, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű, Létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modulok, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a létrehozott Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes.&lt;br /&gt;
&lt;br /&gt;
===Checkstyle===&lt;br /&gt;
Kezdetben a checkstyle plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
===FirefoxBinary===&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a &amp;lt;code&amp;gt; mvn install -DskipTests &amp;lt;/code&amp;gt; utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=309</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=309"/>
		<updated>2017-03-29T09:06:52Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon GWT és Javascript nyelven megvalósításokat tesz elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használ (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A projekt szerkezete==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pont az Application.java fájl, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű, Létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modulok, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a létrehozott Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;br /&gt;
&lt;br /&gt;
==Hibák==&lt;br /&gt;
A Quickstart application, mavenes fordítása és futtatása probléma nélkül megtörtént, azonban a client-gwt2, és a szerveroldali projekt fordítása korántsem volt zökkenőmentes.&lt;br /&gt;
&lt;br /&gt;
=Checkstyle=&lt;br /&gt;
Kezdetben a checkstyle plugin (https://maven.apache.org/plugins/maven-checkstyle-plugin/) verzióját nem találta meg a maven, ezt orvosolta a fejlesztők levelezéséből kiderített client-gwt2 projektben található settings.xml megfelelő helyre történő átmozgatása.&lt;br /&gt;
&lt;br /&gt;
=FirefoxBinary=&lt;br /&gt;
A kliensoldali kód azonban így sem fordult le, a tesztek futtatásakor a selenium (http://www.seleniumhq.org/) plugin nem tudta elérni a FirefoxBinary-t és nem tudta lefuttatni a hozzá tartozó részeket. Ezt orvosolta a mvn install -DskipTests utasítás, ami a teszteket kihagyva képes sikeres fordítást produkálni.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=308</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=308"/>
		<updated>2017-03-29T08:54:40Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon GWT és Javascript nyelven megvalósításokat tesz elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használ (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A projekt szerkezete==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pont az Application.java fájl, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű, Létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modulok, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a létrehozott Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=307</id>
		<title>Geomajas</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=Geomajas&amp;diff=307"/>
		<updated>2017-03-29T08:50:16Z</updated>

		<summary type="html">&lt;p&gt;Jmdtdy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Áttekintés==&lt;br /&gt;
A Geomajas (http://www.geomajas.org/) egy Java nyelven íródott Open Source Web Mapping Framework. Mind szerver, mind kliensoldali komponenseket kínál. Szerveroldalon Java, Javascript, míg kliensoldalon GWT és Javascript nyelven megvalósításokat tesz elérhetővé.&lt;br /&gt;
&lt;br /&gt;
==Előkészületek==&lt;br /&gt;
A mintaprogramok fordításához és futtatásához Maven-t használ (https://maven.apache.org/). Ahhoz, hogy futtatni és fordítani tudjuk a github-os projekteket, a Maven telepítési könyvtárában a settings.xml-ben (HOME/.m2/settings.xml) fel kell venni néhány dependency-t, ez az xml a github-os gwt kliensnél megtalálható. (https://github.com/geomajas/geomajas-project-client-gwt2)&lt;br /&gt;
&lt;br /&gt;
Kezdésként a GWT-s standalone applicationt indítsuk el. (https://github.com/geomajas/geomajas-gwt2-quickstart-application) Fordítsuk le a Mavennel a projektet, majd futtassuk.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mvn install&lt;br /&gt;
&lt;br /&gt;
mvn jetty: run&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ezután látogassunk el a http://localhost:8080/-ra, ahol megtekinthető az eredmény.&lt;br /&gt;
&lt;br /&gt;
==A projekt szerkezete==&lt;br /&gt;
A GWT-s projekt általában egy gyökér könyvtárbeli szerver és kliens oldali csomagból áll. A kliens oldali belépési pont az Application.java fájl, ami a következő helyen található: ..\geomajas-gwt2-quickstart-application-master\src\main\java\org\geomajas\quickstart\gwt2\client. &lt;br /&gt;
&lt;br /&gt;
Ez megvalósítja a com.google.gwt.core.client.EntryPoint interfészt, így implementálni kell az onModuleLoad metódust. A kód egyszerű, Létrejön egy ApplicationLayout, majd hozzáadódik a megjelenítéshez.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;
import com.google.gwt.user.client.ui.RootLayoutPanel;&lt;br /&gt;
&lt;br /&gt;
public class Application implements EntryPoint {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public void onModuleLoad() {&lt;br /&gt;
		ApplicationLayout layout = new ApplicationLayout();&lt;br /&gt;
		RootLayoutPanel.get().add(layout);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az ApplicationLayout geomajas specifikus layout, a következő módon keletkezik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
public ApplicationLayout() {&lt;br /&gt;
		initWidget(UIBINDER.createAndBindUi(this));&lt;br /&gt;
		ApplicationResource.INSTANCE.css().ensureInjected();&lt;br /&gt;
&lt;br /&gt;
		mapPresenter = GeomajasImpl.getInstance().createMapPresenter();&lt;br /&gt;
		mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler());&lt;br /&gt;
&lt;br /&gt;
		GeomajasServerExtension.getInstance().initializeMap(mapPresenter, &amp;quot;app&amp;quot;, &amp;quot;mapMain&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		mapLayoutPanel = new MapLayoutPanel();&lt;br /&gt;
		mapLayoutPanel.setPresenter(mapPresenter);&lt;br /&gt;
		mapPanel.add(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService = ApplicationService.getInstance();&lt;br /&gt;
		appService.setMapPresenter(mapPresenter);&lt;br /&gt;
		appService.setMapLayoutPanel(mapLayoutPanel);&lt;br /&gt;
&lt;br /&gt;
		appService.getMapPresenter().getEventBus().addHandler(FeatureMouseOverHandler.TYPE, new MyFeatureMouseOverHandler());&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Miután betöltődik a kontextusthoz szükséges GWT-s modulok, létrejön egy MapPresenter, majd hozzá egy default inicializáló. Ezután a szerverkódból inicializáljuk ezt. Ezt követi a Layout beállítása, hozzáadása a megjelenítéshez, valamint egy ApplicationService létrehozása, amely kiszolgálja a létrehozott Layert. Ezután hozzáadásra kerül egy egyedi eseménykezelő.&lt;/div&gt;</summary>
		<author><name>Jmdtdy</name></author>
		
	</entry>
</feed>