r1030 - in trunk: echobase-domain/src/main/java/fr/ifremer/echobase/config echobase-domain/src/main/resources/i18n echobase-services/src/main/java/fr/ifremer/echobase/services/service/spatial echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/spatial echobase-ui/src/main/resources/config echobase-ui/src/main/webapp/WEB-INF/jsp/spatial src/site/rst
Author: sbavencoff Date: 2014-06-16 09:54:40 +0200 (Mon, 16 Jun 2014) New Revision: 1030 Url: http://forge.codelutin.com/projects/echobase/repository/revisions/1030 Log: refs #4194 : Visualisation des donn?\195?\169es spatiales Modified: trunk/echobase-domain/src/main/java/fr/ifremer/echobase/config/EchoBaseConfiguration.java trunk/echobase-domain/src/main/java/fr/ifremer/echobase/config/EchoBaseConfigurationOption.java trunk/echobase-domain/src/main/resources/i18n/echobase-domain_en_GB.properties trunk/echobase-domain/src/main/resources/i18n/echobase-domain_fr_FR.properties trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/service/spatial/SpatialService.java trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/spatial/ShowMap.java trunk/echobase-ui/src/main/resources/config/struts-spatial.xml trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/spatial/show.jsp trunk/src/site/rst/install.rst.vm Modified: trunk/echobase-domain/src/main/java/fr/ifremer/echobase/config/EchoBaseConfiguration.java =================================================================== --- trunk/echobase-domain/src/main/java/fr/ifremer/echobase/config/EchoBaseConfiguration.java 2014-06-05 10:41:01 UTC (rev 1029) +++ trunk/echobase-domain/src/main/java/fr/ifremer/echobase/config/EchoBaseConfiguration.java 2014-06-16 07:54:40 UTC (rev 1030) @@ -259,6 +259,37 @@ return result; } + public File getQgisTemplate() { + File file = applicationConfig.getOptionAsFile( + EchoBaseConfigurationOption.QGIS_TEMPLATE.key); + Preconditions.checkNotNull(file); + return file; + } + + public File getLizmapTemplate() { + File file = applicationConfig.getOptionAsFile( + EchoBaseConfigurationOption.LIZMAP_TEMPLATE.key); + Preconditions.checkNotNull(file); + return file; + } + + public File getLizmapTarget() { + File file = applicationConfig.getOptionAsFile( + EchoBaseConfigurationOption.LIZMAP_TARGET.key); + Preconditions.checkNotNull(file); + return file; + } + + public String getLizmapUrl(){ + String url = applicationConfig.getOption(EchoBaseConfigurationOption.LIZMAP_URL.key); + return url; + } + + public String getLizmapRepository(){ + String repository = applicationConfig.getOption(EchoBaseConfigurationOption.LIZMAP_REPOSITORY.key); + return repository; + } + /** * Creates a directory given the configuration given key. * Modified: trunk/echobase-domain/src/main/java/fr/ifremer/echobase/config/EchoBaseConfigurationOption.java =================================================================== --- trunk/echobase-domain/src/main/java/fr/ifremer/echobase/config/EchoBaseConfigurationOption.java 2014-06-05 10:41:01 UTC (rev 1029) +++ trunk/echobase-domain/src/main/java/fr/ifremer/echobase/config/EchoBaseConfigurationOption.java 2014-06-16 07:54:40 UTC (rev 1030) @@ -90,7 +90,27 @@ DOCUMENTATION_URL("echobase.documentationUrl", n("echobase.config.documentationUrl.description"), "http://doc.codelutin.com/echobase", - URL.class); + URL.class), + QGIS_TEMPLATE("echobase.qgis.template.file", + n("echobase.config.qgis.template.file.description"), + "${echobase.data.directory}/lizmap/templates/{{voyageName}}.qgs", + File.class), + LIZMAP_TEMPLATE("echobase.lizmap.template.file", + n("echobase.config.lizmap.template.file.description"), + "${echobase.data.directory}/lizmap/templates/{{voyageName}}.qgs.cfg", + File.class), + LIZMAP_TARGET("echobase.lizmap.target.file", + n("echobase.config.lizmap.target.file.description"), + "${echobase.data.directory}/lizmap/qgis", + File.class), + LIZMAP_URL("echobase.lizmap.url", + n("echobase.config.lizmap.url.description"), + "http://localhost/lizmap-web-client-2.9.4/lizmap/www/index.php/view/map/", + String.class), + LIZMAP_REPOSITORY("echobase.lizmap.repository", + n("echobase.config.lizmap.url.description"), + "echobase", + String.class); /** Configuration key. */ protected final String key; Modified: trunk/echobase-domain/src/main/resources/i18n/echobase-domain_en_GB.properties =================================================================== --- trunk/echobase-domain/src/main/resources/i18n/echobase-domain_en_GB.properties 2014-06-05 10:41:01 UTC (rev 1029) +++ trunk/echobase-domain/src/main/resources/i18n/echobase-domain_en_GB.properties 2014-06-16 07:54:40 UTC (rev 1030) @@ -35,8 +35,12 @@ echobase.config.h2Version.description=H2 jdbc driver version echobase.config.internal.db.directory.description=Directory of the internal database echobase.config.lib.directory.description=Directory where to put internal libraries (jdbc drivers, embedded war) +echobase.config.lizmap.target.file.description=Repository directory of Qgis and LizMap files +echobase.config.lizmap.template.file.description=Lizmap configuration file template +echobase.config.lizmap.url.description=Lizmap URL echobase.config.log.config.file.description=Log configuration file echobase.config.postgresqlVersion.description=Postgresql driver version +echobase.config.qgis.template.file.description=Qgis file template echobase.config.version.description=Application version echobase.config.war.location.description=Location of the war used to create embedded applications echobase.configuration.description=EchoBase configuration Modified: trunk/echobase-domain/src/main/resources/i18n/echobase-domain_fr_FR.properties =================================================================== --- trunk/echobase-domain/src/main/resources/i18n/echobase-domain_fr_FR.properties 2014-06-05 10:41:01 UTC (rev 1029) +++ trunk/echobase-domain/src/main/resources/i18n/echobase-domain_fr_FR.properties 2014-06-16 07:54:40 UTC (rev 1030) @@ -35,8 +35,12 @@ echobase.config.h2Version.description=Version du pilote jdbc H2 echobase.config.internal.db.directory.description=Répertoire de la base interne echobase.config.lib.directory.description=Chemin où sont stockés les libraires internes (drivers + application embarquée) +echobase.config.lizmap.target.file.description=Le répertoire de dépôt des fichiers Qgis et lizmap +echobase.config.lizmap.template.file.description=Le modièle du fichier de configuration de Lizmap +echobase.config.lizmap.url.description=L'URL de Lizmap echobase.config.log.config.file.description=Fichier de configuration des logs echobase.config.postgresqlVersion.description=Version du pilote jdbc Postgresql +echobase.config.qgis.template.file.description=Le modèle du fichier Qgis echobase.config.version.description=Version de l'application echobase.config.war.location.description=Chemin d'accèss au war embarqué à utiliser pour créer des applications embarquées echobase.configuration.description=Configuration d'EchoBase Modified: trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/service/spatial/SpatialService.java =================================================================== --- trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/service/spatial/SpatialService.java 2014-06-05 10:41:01 UTC (rev 1029) +++ trunk/echobase-services/src/main/java/fr/ifremer/echobase/services/service/spatial/SpatialService.java 2014-06-16 07:54:40 UTC (rev 1030) @@ -21,15 +21,26 @@ * #L% */ +import com.google.common.base.Preconditions; import fr.ifremer.echobase.EchoBaseTechnicalException; +import fr.ifremer.echobase.entities.data.Voyage; import fr.ifremer.echobase.io.EchoBaseIOUtil; +import fr.ifremer.echobase.persistence.JdbcConfiguration; import fr.ifremer.echobase.services.EchoBaseServiceSupport; import fr.ifremer.echobase.services.service.UserDbPersistenceService; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.util.TimeLog; import javax.inject.Inject; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.Scanner; /** * Spatial service. @@ -48,6 +59,10 @@ public static final String POSTGIS_VIEW_SQL = "/postgis-view.sql"; + public static final String[] TEMPLATE_MARKUP = {"{{dbname}}", "{{host}}", "{{port}}", "{{userName}}", "{{password}}", "{{voyageName}}", "{{voyageId}}" }; + + public static final String START_JDBC_URL = "jdbc:postgresql://"; + @Inject private UserDbPersistenceService persistenceService; @@ -139,4 +154,109 @@ } } } + + public String generateMap(JdbcConfiguration conf, String voyageId) { + Preconditions.checkState(StringUtils.isNotBlank(voyageId)); + Voyage voyage = persistenceService.getVoyage(voyageId); + return generateMap(conf, voyage); + } + + public String generateMap (JdbcConfiguration conf, Voyage voyage) { + Preconditions.checkNotNull(conf); + Preconditions.checkNotNull(voyage); + + String[] templateValues = getTemplateValues(conf, voyage); + + File qgisFile = generateMapFile(getConfiguration().getQgisTemplate(), templateValues); + + generateMapFile(getConfiguration().getLizmapTemplate(), templateValues); + + String name = qgisFile.getName(); + name = name.substring(0, name.lastIndexOf(".")); + + return name; + + } + + protected File generateMapFile(File template, String[] templateValues) { + + File lizmapTarget = getConfiguration().getLizmapTarget(); + + if (!lizmapTarget.isDirectory()) { + throw new EchoBaseTechnicalException("Map target (" + lizmapTarget.getAbsolutePath() + ") is not directory"); + } + + String name = template.getName(); + name = StringUtils.replaceEach(name, TEMPLATE_MARKUP, templateValues); + + File target = new File(lizmapTarget, name); + + if (!target.isFile()) { + + Scanner scanner = null; + BufferedWriter writer = null; + try { + scanner = new Scanner(template, StandardCharsets.UTF_8.name()); + + writer = Files.newBufferedWriter(target.toPath(), StandardCharsets.UTF_8); + + String line; + + while(scanner.hasNextLine() ) { + line = scanner.nextLine(); + line = StringUtils.replaceEach(line, TEMPLATE_MARKUP, templateValues); + writer.write(line); + writer.newLine(); + } + } catch (FileNotFoundException e) { + throw new EchoBaseTechnicalException(e); + } catch (IOException e) { + throw new EchoBaseTechnicalException(e); + } finally { + scanner.close(); + if (writer != null) { + try { + writer.close(); + } catch (IOException e) { + throw new EchoBaseTechnicalException(e); + } + } + } + } + + return target; + + } + + protected String[] getTemplateValues(JdbcConfiguration conf, Voyage voyage) { + + String[] templateValues = new String[TEMPLATE_MARKUP.length]; + + String url = conf.getUrl(); + if (!url.startsWith(START_JDBC_URL)) { + throw new EchoBaseTechnicalException("JDBC URL '" + url + "' is no reference to a Postrges database"); + } + + int hostIndex = START_JDBC_URL.length() - 1; + int portIndex = url.indexOf(':', hostIndex); + int dbnameIndex = url.indexOf("/", portIndex); + + // dbname + templateValues[0] = url.substring(dbnameIndex + 1); + // host + templateValues[1] = url.substring(hostIndex + 1, portIndex); + // port + templateValues[2] = url.substring(portIndex + 1, dbnameIndex); + // userName + templateValues[3] = conf.getLogin(); + // password + templateValues[4] = conf.getPassword(); + // voyage name + templateValues[5] = voyage.getName(); + // voyage id + templateValues[6] = voyage.getTopiaId(); + + return templateValues; + } + } Modified: trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/spatial/ShowMap.java =================================================================== --- trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/spatial/ShowMap.java 2014-06-05 10:41:01 UTC (rev 1029) +++ trunk/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/spatial/ShowMap.java 2014-06-16 07:54:40 UTC (rev 1030) @@ -21,10 +21,17 @@ * #L% */ +import fr.ifremer.echobase.EchoBaseTechnicalException; +import fr.ifremer.echobase.persistence.JdbcConfiguration; +import fr.ifremer.echobase.services.service.spatial.SpatialService; import fr.ifremer.echobase.ui.actions.EchoBaseActionSupport; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.http.client.utils.URIBuilder; +import javax.inject.Inject; +import java.net.URISyntaxException; + /** * To display only the spatial data map. * <p/> @@ -40,17 +47,53 @@ /** Logger. */ private static final Log log = LogFactory.getLog(ShowMap.class); - protected final ShowSpatialModel model = new ShowSpatialModel(); + @Inject + protected transient SpatialService spatialService; - public ShowSpatialModel getModel() { - return model; + protected String voyageId; + + protected String lizmpaProject; + + public String getVoyageId() { + return voyageId; } + public void setVoyageId(String voyageId) { + this.voyageId = voyageId; + } + + public String getLizmapUrl() { + String url = null; + try { + URIBuilder uriBuilder = new URIBuilder(getServiceContext().getConfiguration().getLizmapUrl()); + uriBuilder.addParameter("repository", getServiceContext().getConfiguration().getLizmapRepository()); + uriBuilder.addParameter("project", lizmpaProject); + url = uriBuilder.build().toString(); + + } catch (URISyntaxException e) { + throw new EchoBaseTechnicalException(e); + } + return url; + } + + public String getLizmapRepository() { + return getServiceContext().getConfiguration().getLizmapRepository(); + } + + public String getLizmapProject() { + return lizmpaProject; + } + + @Override public String execute() throws Exception { + JdbcConfiguration dbConf = getEchoBaseSession().getWorkingDbConfiguration(); + + lizmpaProject = spatialService.generateMap(dbConf, voyageId); + if (log.isInfoEnabled()) { - log.info("Loading spatial view for voyage: " + model.getVoyageId()); + log.info("Loading spatial view for voyage: " + voyageId); } return SUCCESS; } Modified: trunk/echobase-ui/src/main/resources/config/struts-spatial.xml =================================================================== --- trunk/echobase-ui/src/main/resources/config/struts-spatial.xml 2014-06-05 10:41:01 UTC (rev 1029) +++ trunk/echobase-ui/src/main/resources/config/struts-spatial.xml 2014-06-16 07:54:40 UTC (rev 1030) @@ -36,7 +36,9 @@ <action name="showMap" class="fr.ifremer.echobase.ui.actions.spatial.ShowMap"> <interceptor-ref name="prepareParamsStackLogguedWithDb"/> - <result>/WEB-INF/jsp/spatial/showMap.jsp</result> + <result type="redirect"> + <param name="location">%{lizmapUrl}</param> + </result> </action> <!-- Add echobase spatial tables, functions and triggers to working db --> Modified: trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/spatial/show.jsp =================================================================== --- trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/spatial/show.jsp 2014-06-05 10:41:01 UTC (rev 1029) +++ trunk/echobase-ui/src/main/webapp/WEB-INF/jsp/spatial/show.jsp 2014-06-16 07:54:40 UTC (rev 1030) @@ -30,51 +30,6 @@ <s:if test="model.withSpatial"> - <script type="text/javascript"> - - jQuery(document).ready(function () { - - var voyageComboBox = $('[name="model.voyageId"]'); - - var loadvoyageData = function(voyageId) { - - var spatialView = $('#spatialViewContainer'); - var spatialViewContent = $('#spatialViewContent'); - if (voyageId!='') { - - // load spatial view - spatialViewContent.html('<s:text name="echobase.spatialView.loading"/>'); - spatialView.show(); - console.info('Load spatial view '+voyageId); - - - jQuery.get( - '<s:url action="showMap" namespace="/spatial"/>', - { - "model.voyageId": voyageComboBox.val() - }, - function (result) { - - // inject result - spatialViewContent.html(result); - }); - } else { - - // hide spatial view - spatialView.hide(); - spatialViewContent.html(""); - } - }; - - voyageComboBox.change(function () { - loadvoyageData(this.value); - }); - - loadvoyageData('<s:property value="model.voyageId"/>'); - - }); - </script> - <s:form namespace="/spatial" method="POST" enctype="multipart/form-data"> <div class="toolbar"> @@ -97,25 +52,27 @@ </div> <br/> - <s:select key="model.voyageId" requiredLabel="true" - label='%{getText("echobase.common.voyage")}' - list="voyages" headerKey="" headerValue=""/> + <div class="label"> + <s:property value="getText('echobase.common.voyage')"/> : + </div> + <ul> + <s:iterator value="voyages"> + <li> + <s:url action="showMap" id="showMapUrl"> + <s:param name="voyageId" value="%{key}"/> + </s:url> + <s:a href="%{showMapUrl}" target="_blank"> + <s:property value="%{value}"/> + </s:a> + </li> + </s:iterator> + </ul> + <s:hidden key="model.withSpatial" label=' '/> </fieldset> - - <div id="spatialViewContainer"> - <fieldset> - <legend> - <s:text name="echobase.legend.showData.result"/> - </legend> - - <div id="spatialViewContent"></div> - </fieldset> - </div> - </s:form> </s:if> <s:else> Modified: trunk/src/site/rst/install.rst.vm =================================================================== --- trunk/src/site/rst/install.rst.vm 2014-06-05 10:41:01 UTC (rev 1029) +++ trunk/src/site/rst/install.rst.vm 2014-06-16 07:54:40 UTC (rev 1030) @@ -138,8 +138,18 @@ | | |-- echobase-embedded-2.3-SNAPSHOT.war | | |-- h2-1.3.173.jar | | `-- postgresql-9.1-901-1.jdbc4.jar - | `-- logs - | `-- echobase.log + | |-- logs + | | `-- echobase.log + | `-- lizmap + | |-- data + | | |-- France&Spain.shp + | | |-- pelgas09.shp + | | `-- ... + | |-- qgis + | `-- templates + | |-- {{voyageName}}.qgs + | |-- {{voyageName}}.qgs.cfg + | `-- ... |-- echobase.war `-- war `-- echobase-full-${project.version}-SNAPSHOT.war @@ -220,3 +230,72 @@ .. _créer une base travail: ./db.html#creation-d-une-base-postgresql .. _détail des options disponibles: ./application-config-report.html + +Visualisation des données spatiales +----------------------------------- + + +Qgis map server +~~~~~~~~~~~~~~~ + +Suivez `le guide de Qgis map server <http://hub.qgis.org/projects/quantum-gis/wiki/QGIS_Server_Tutorial#Webserver-configuration>`_. + +Lizmap +~~~~~~ + +Suivez `le guide de lizmap <http://docs.3liz.com/fr/lizmap-web-client/installation/linux.html>`_. + + +Configuration pour Echobase +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + 1. Répetoires + + * **/var/local/echobase/data/lizmap/templates** contient deux fichiers de modèles : + + * **{{voyageName}}.qgs** est le fichier de project Qgis + * **{{voyageName}}.qgs.cfg** est généré par le plugin lizmap de Qgis. + + Dans ses fichiers, les références à la base de données et au voyage sont remplacer par des balises suivantes : + + * *{{dbName}}* : le nom de la base de données, + * *{{host}}* : l'adresse du serveur de base, + * *{{port}}* : le port d'écoute de la base, + * *{{userName}}* : le identitfiant de connexion, + * *{{password}}* : le mot de passe, + * *{{voyageName}}* : le label du voyage, + * *{{voyageId}}* : l'identifiant du voyage. + + * **/var/local/echobase/data/lizmap/data** contient les fichiers de données utiles aux fichiers Qgis + + * **/var/local/echobase/data/lizmap/Qgis** répertoire de dépôt des fichiers de modèles une fois adaptés à une base de donnée et à un voyage. + + + Ces répetoires et fichiers sont définis par les propriétées : + + * echobase.qgis.template.file : le modèle du fichier Qgis + * echobase.lizmap.template.file : le modièle du fichier de configuration de Lizmap + * echobase.lizmap.target.file : le répertoire de dépôt des fichiers Qgis et lizmap + + 2. Configuration de lizmap + + Il faut indiquer à lizmap le repertoir où trouver les fichiers Qgis et de configuration. + + Allez sur la page d'administration de Lizmap + + :: + + http://localhost/lizmap-web-client-2.9.4/lizmap/www/admin.php + login / password : admin / admin + + Dans lizmap Configuration cliquez sur *Create a repository* + + * *id* : l'identifiant du dépôt, doit etre identique à la propriété **echobase.lizmap.repository** (par défaut "echobase") + * *Label* : Le label utilisé par lizmap + * *path* : le répertoire de dépôt des fichiers Qgis et lizmap (par défaut **/var/local/echobase/data/lizmap/Qgis/**) doit finir par un "/" + + Cliquez sur *save* + + Dans la partie *View repositories*, cochez *anonymous* + + Cliquez sur *save*
participants (1)
-
sbavencoff@users.forge.codelutin.com