GIS Geometries

Ce plugin ajoute au plugin GIS la possibilité d’afficher et d’éditer des formes géométriques.

Avertissement : ce plugin ne fonctionne que sur les sites qui utilisent une base de données MySQL en version 5.6 minimum. La compatibilité avec les bases SQLite sera peut-être ajoutée par la suite.

Présentation et installation

GIS Geometries est une extension du plugin GIS, il est donc nécessaire d’installer celui-ci auparavant.

Le plugin utilise les librairies Leaflet Draw et geoPHP. Cette dernière sera téléchargée automatiquement lors de l’activation du plugin GIS Gemoetries.

Fonctionnalités :

  • possibilité de dessiner des formes géométriques à la main
  • possibilité de définir le style des formes géométriques (si l’option correspondante est activée dans la page de configuration de GIS)
  • import/export les données aux formats GPX et KML.

Fonctionnement

Dans l’espace privé

Lors de la création d’un nouvel objet géolocalisé, le plugin ajoute trois boutons visibles sous les boutons de zoom dans la capture d’écran suivante. Ces boutons permettent de choisir le type de forme à dessiner : un point, un polygone ou une ligne.

Après avoir cliqué sur le type de forme souhaité, vous pouvez commencer à tracer la forme en cliquant sur la carte.

Le plugin ajoute aussi un champ « Importer » dans le formulaire afin de créer une forme géométrique à partir d’un fichier GPX ou KML. Il devient ainsi possible d’importer des formes complexes comme les contours d’un département par exemple (récupérés depuis le site karamelise.fr par exemple).

Une fois importés ou dessinés, les objets géolocalisés du site peuvent être exportés au format GPX ou KML depuis leur page de « vue ».

Lors de la modification d’un objet géolocalisé il est possible de :

  • déplacer un point de l’objet en le faisant glisser,
  • supprimer un point de l’objet en cliquant sur celui-ci,
  • ajouter un nouveau point intermédiaire en cliquant sur celui-ci.

Dans l’espace public

Vous n’avez rien à faire de spécial :) Les squelettes JSON fournis par GIS prennent automatiquement l’affichage des nouveaux types d’objets dans les cartes de votre site.

Si vous utilisez des anciens squelettes JSON personnalisés, vous pouvez les adapter à GIS Geometries en remplaçant :

"geometry": {"type": "Point", "coordinates": [#LON, #LAT]},

par :

["geometry": (#GEOMETRY|wkt_to_json),]

Ainsi vos squelette persos prendront en charge les lignes et les polygones en plus des points.

Remarques

Si vous désactivez GIS Geometries les lignes et les polygones de vos cartes seront affichés sous forme de points correspondants au centre de la forme géométrique.

Malgré cela, il est recommandé de désinstaller le plugin si vous n’en avez plus besoin, afin d’être certain d’effacer le champ geo (de type GEOMETRY) de la table gis, sans quoi vous rencontrerez une erreur SQL lors de la création d’un nouveau point avec GIS.

Si votre carte affiche des lignes ou des polygones, l’activation du clustering fonctionnera uniquement sur les points (cf paramètre cluster du modèle de GIS), et les autres formes ne seront pas affichées.

Notes de développement : https://blog.eliaz.fr/article160.html

Discussion

23 discussions

  • 5

    Bonjour,

    Petit souci que je n’arrive pas à résoudre avec GIS géométries..
    L’enregistrement des points, lignes et polygones fonctionne très bien depuis l’espace public, avec la saisie « carte ».

    Par contre depuis l’espace privé, quand on essaye de modifier un point existant, et qu’on clique « enregistrer », on a l’erreur suivante :

    Une erreur technique a empêché l’enregistrement correct du champ 'zoom','geo'.

    dans spip.log, j’ai ca :

    Jan 16 15:45:05 10.253.11.24 (pid 3403) :Pri:ERREUR: Erreur mysql 1416
    Jan 16 15:45:05 10.253.11.24 (pid 3403) :Pri:ERREUR: Cannot get geometry object from data you send to the GEOMETRY field - 
    UPDATE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c2FtdTI8L2NvZGU+"></span>.spip_gis
    SET zoom=11,geo='POLYGON((2.1694335993379 48.883554726616,2.161880498752 48.828437449862,2.1893463190645 48.826177250492,2.1694335993379 48.883554726616))'
    WHERE id_gis=101
    Jan 16 15:45:05 10.253.11.24 (pid 3403) :Pri:ERREUR: Erreur mysql 1416
    Jan 16 15:45:05 10.253.11.24 (pid 3403) :Pri:ERREUR: Cannot get geometry object from data you send to the GEOMETRY field - query inconnue
    Jan 16 15:45:05 10.253.11.24 (pid 3403) :Pri:ERREUR: Erreur 1416 de mysql: Cannot get geometry object from data you send to the GEOMETRY field
    
    UPDATE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+c2FtdTI8L2NvZGU+"></span>.spip_gis
    SET zoom=11,geo='POLYGON((2.1694335993379 48.883554726616,2.161880498752 48.828437449862,2.1893463190645 48.826177250492,2.1694335993379 48.883554726616))'
    WHERE id_gis=101
    Jan 16 15:45:05 10.253.11.24 (pid 3403) :Pri:CRITIQUE: Erreur enregistrement en base gis/101 champs :array (
      'zoom' => 
      array (
        'post' => '11',
        'save' => NULL,
      ),
      'geo' => 
      array (
        'post' => 'POLYGON((2.1694335993379 48.883554726616,2.161880498752 48.828437449862,2.1893463190645 48.826177250492,2.1694335993379 48.883554726616))',
        'save' => '' . "\0" . '' . "\0" . '' . "\0" . '' . "\0" . '--' . "\0" . '' . "\0" . '' . "\0" . '-' . "\0" . '' . "\0" . '' . "\0" . '-' . "\0" . '' . "\0" . '' . "\0" . '°ÿ¿' . "\0" . '' . "\0" . '[-@^…?R-qH@-' . "\0" . 'À' . "\0" . 'ˆK-@/ø-=
    jH@-' . "\0" . 'À' . "\0" . 'ȃ-@ûÇ--ÀiH@°ÿ¿' . "\0" . '' . "\0" . '[-@^…?R-qH@',
      ),
    )

    J’ai cherché du coté de gis dans action/editer_gis.php, ainsi que dans gis_geometries, le fichier de pipeline qui semble gérer les pre et post insertions liées à ce champ.. Mais je ne comprends pas comment corriger ce bug, ou déjà trouver son origine.. !

    Je comprends bien que Mysql attend un format binaire différent de la chaine que je lui envoie, mais je ne vois pas ce que j’aurais pu modifier pour que ca ne fonctionne plus

    Si vous avez une idée ou suggestion.. Je suis preneur !

    Merci d’avance !

    • C’est comme si le pipeline pre_insertion ne s’executait pas quand on passe par l’interface privée.. étrange !

    • J’ai refait quelques tests...
      Tout a l’air d’être fait dans la fonction « gisgeom_pre_insertion ».. J’ai rajouté un envoi de mail dans cette fonction pour savoir quand elle était appelée.

      Le souci c’est que cette fonction qui est appelée quand on passe par les formulaires de l’espace public n’est PAS appelée quand on passe par l’interface privée.. !

      Par l’interface publique, je recois bien le résultat attendu :

      Array
      (
          [args] => Array
              (
                  [table] => spip_gis
              )
      
          [data] => Array
              (
                  [geo] =>     --   -   -   = À xñ-@†¾-c\oH@Y À -ð-@/ƒn«IiH@= À xà-@/ƒn«IiH@Ìÿ¿ ˜u-@dWó5@rH@= À xñ-@†¾-c\oH@
              )
      
      )

      Mais dans l’interface privée, la fonction n’est jamais appelée.. Pourquoi ? Comment faire pour qu’elle soit invoquée avant l’insertion du point GIS ?

    • Ah non, le pipeline s’execute correctement lors d’une nouvelle insertion (lier un nouveau point).. C’est vraiment juste quand on veut modifier un point existant, Edition => points geolocalisés => « modifier le point ».. (/ecrire/ ?exec=gis_edit&id_gis=xx)

    • Bon j’ai trouvé la solution alors je la donne ici, au cas ou d’autres aient le meme bug..
      Le pipeline « pre_insertion » n’est appelé QUE lors de la création d’un nouvel objet. Il faut avoir la meme fonction pipeline appelée en « pre_edition ».. Ce que j’ai trouvé de plus simple pour résoudre cela, c’est en créant un nouveau plugin très simple

      Paquet.xml :

      <paquet
      	prefix="gisgeom_correction"
      	categorie="divers"
      	version="1"
      	etat="stable"
      	compatibilite="[3.0.0;3.0.*]"
      >	
      	<nom>GIS Geometries Corrections</nom>
      	<auteur>Vince</auteur>
      	<pipeline nom="pre_edition" inclure="gisgeom_pipelines.php" ></pipeline>
      </paquet>

      et fichier gisgeom_pipelines.php, modifié :

      <?php
      if (!defined('_ECRIRE_INC_VERSION')) return;
      
      function gisgeom_correction_pre_edition($flux){
      	if($flux['args']['table'] == 'spip_gis') {
      		if(_request('geojson')) {
      			$json = _request('geojson');
      		} else {
      			$point = array('type' => 'Feature','geometry' => array('type'=> 'Point','coordinates' => array(_request('lat')?_request('lat'):0,_request('lon')?_request('lon'):0)));
      			$json = json_encode($point);
      		}
      		include_spip('gisgeom_fonctions');
      		$wkt = json_to_wkt($json);
      		// convertir le WKT en binaire avant l'insertion
      		$binary = sql_getfetsel("GeomFromText('$wkt')");
      		$flux['data']['geo'] = $binary;
      	}
      	return $flux;
      }
      
      ?>

      Et maintenant, l’édition des points fonctionne.

    • Salut Levince et désolé pour le délai de réponse :\

      Rencontres-tu toujours le problème avec la dernière version de GIS et GIS geometries ?

      Pour info, lors de la modification d’un objet c’est le pipeline gisgeom_post_edition qui est appelé. Tu as peut-être un plugin qui bloquait l’utilisation d’un des pipelines utilisés par GIS geometries (ça peut arriver quand un plugin ne renvoie pas le flux correctement pour laisser la main aux autre plugins qui souhaiteraient agir dessus).

      ++

    Répondre à ce message

  • 3

    Tout fonctionne bien dans l’interface admin, mais petit problème dans l’espace public : aucun point ne s’affiche (ni point ni polygone), et quand on dé-zoom ou bouge la carte, on obtient le point... mais pas le polygone. Ceci avec deux marqueurs sur un auteur visiteur, un point et un polygone.

    Voici une page test : il faut simplement faire RECHERCHER :
    http://reneta.fr/spip.php?rubrique19

    Le json est le suivant :

    		<BOUCLE_auteurs(AUTEURS){gis}{type_compte=eta}{id_mot == ^(#ENV{id_mot}|table_valeur{0}|sinon{.*})$} {id_mot == ^(#ENV{id_mot}|table_valeur{1}|sinon{.*})$}{tout}{par nom}{0, #ENV{limit}}{","}>
    		<?
    		$href="<a HREF='spip.php?auteur#ID_AUTEUR' class=lien_map>" ;
    		?>		
    		{"type": "Feature",
    		["geometry": (#GEOMETRY|wkt_to_json),]
    		"id":"#ID_GIS",
    		"properties": {
    			"title":<?=json_encode($href."[(#LOGO_AUTEUR{left}|image_reduire{60,0}|sansguillemet)] &nbsp;&nbsp;[(#NOM*|sansguillemet)]</A>")?>,
    			"description":
    			<? $description = "&nbsp;&nbsp;[(#BIO|sansguillemet|couper{100})]" ;
    			echo json_encode($description) ;
    			?>[
    			(#LOGO_GIS|gis_icon_properties)]
    		}}</BOUCLE_auteurs>

    Si je garde la ligne geometry du json de GIS :
    "geometry": {"type": "Point", "coordinates": [#LON, #LAT]},

    j’obtiens tout de suite les deux marqueurs, mais sous la forme de points (ce qui est normal vu la doc je pense).

    Une idée ?

    • Héhé, il semblerait que ta carte utilise le système de clustering, qui n’est valide que pour les points. Essaye en désactivant cette option pour voir.

    • Comme d’habitude, réponse rapide et pertinente !

      Merci.

      PS : la non compatibilité avec le clustering, c’est une impossibilité technique ou bien par manque de temps de développement ?

    • De rien,

      la non compatibilité avec le clustering, c’est une impossibilité technique ou bien par manque de temps de développement ?

      Pour l’instant, c’est une impossibilité technique de la librairie qu’on utilise pour le clustering cf :

      https://github.com/Leaflet/Leaflet.markercluster

      Et merci pour le signalement, je vais compléter l’article pour avertir de cette incompatibilité.

    Répondre à ce message

  • 1

    Bonjour b_b,
    Tout d’abord merci pour cet excellent plugin.
    J’aurais besoin d’aide, voilà en local l’installation s’est correctement déroulé. j’ai rentré tout mes points sans problème.
    J’ai installé spip 3.0.16 sur mon serveur OVH, j’ai activé tous les plugins dont GIS 4 et j’ai restauré ma base, mais j’obtiens des erreurs de squelette Erreur MySQL HY000 / 1 (voir l’image) .
    Encore merci pour ton aide. Pat

    Ma version de Mysql est 5.6.11 et j’ai restauré la base par le dump Spip

    • Salut,

      Aïe... il y a bien une incompatibilité avec les dumps de SPIP de ce côté :\

      je cite ma réponse publiée sur la page de GIS :

      GIS Geometries utilise l’extension de données spatiales de MySQL, mais les données des dumps de SPIP sont stockés dans une base SQLite. Du coup ça « casse » les dumps car SQLite ne gère pas les données spatiales par défaut...

      En attendant mieux, tu peux transférer ta base avec un dump mysql et cela fonctionnera sans pb.

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom