Presque 7 ans plus tard, il était temps de partager ce code que je n'ai encore jamais utilisé, ref https://seenthis.net/messages/178291
Pour la petite histoire, j'ai eu une sacré frayeur quand j'ai remarqué que je ne l'avais plus sous la main et que je l'avais certainement effacé par erreur il y a bien longtemps. Heureusement pour moi, il était au chaud (plutôt au froid) dans un disque de sauvegarde, publions le avant qu'il ne se cache de nouveau :p
une passe de phpcbf avec exclusion du sniff Generic.Arrays.DisallowLongArraySyntax et sans toucher au fichier inc/iptc.php
pour référence, la commande utilisée `vendor/bin/phpcbf plugins/gis --exclude=Generic.Arrays.DisallowLongArraySyntax --ignore=lang/*,inc/iptc.php`
Ticket #5 : rendre la balise `#DISTANCE` plus générique, afin qu'elle continue de fonctionner avec les autres tables ayant cette colonne.
Reviewed-on: #6
d'indiquer une liste de tracés kml, gpx ou autre.
C'était déjà possible depuis un squelette, en transmettant directement un tableau,
cela l'est maintenant depuis le modèle en transmettant une liste d'identifiants
séparés par une virgule. Il peut même y avoir les URLs comme avant, tant qu'il
n'y a pas de virgule dans l'URL tout de même…
Pour simplifier l'écriture, et mutualiser pour si besoin améliorer plus tard, on
met cela dans une fonction dédiée.
Exemple : `<carte_gis|point=non|kml=20,21,22,23,24>`
On lui donne donc au minimum les paramètres "objet" et "id_objet", et le modèle n'affiche alors une carte que s'il y a au moins un point OU au moins un tracé (quelque soit le format, json, gpx, kml).
S'il y a plusieurs points, et plus tracés, ça affiche tout ce qu'il arrive à trouver qui serait lié à l'objet demandé.
Pour plus de paramétrage, on peut continuer de passer les mêmes paramètres que pour le modèle par défaut "carte_gis", car ensuite on l'appelle.
Au passage on ajoute "objet" aux paramètres autorisés, quel était l'intérêt d'avoir "id_objet" sans le "objet" ?
Et on ajoute {objet?}{id_objet?} au JSON générique "gis.html", ce qui permet de récupérer tous les points d'un objet quelconque. HOP ça devient générique.
- Nouveau filtre |gis_icon_properties qui renvoie les propriétés JSON de l'icône d'un point.
- Petit changement de comportement pour les logo des points. Si le logo ne dépasse pas 44px de largeur, on ne le retaille pas. Ainsi on permet aux utilisateurs d'utiliser des marqueurs persos en respectant leur taille et transparence.
En effet, on considère que si quelqu'un en amont a ajouté un groupement sur un champ de GIS (ville, pays, etc), cela signifie logiquement qu'il veut fusionner pour ne sortir que ces informations, donc on ne force pas la "séparation" avec le "id_gis".
Plutot que generer plein de JS specifique a la carte, on rend tout le js generique et on lui passe simplement un tableau de configuration contenant toutes les specificites de la carte a afficher
par compatibilite l'objet map construit reste attache a la globale map#ENV{id} mais il est aussi attache a l'objet du DOM qui porte la carte.
On peut donc toujours le retrouver par $('#maptruc').get(0).map ce qui est plus generique
Les methodes AddJSON et removeAllMarkers compatibilite GIS 3 y sont attaches
Les methodes setGeoJsonFeatureIcon, setGeoJsonFeaturePopup et parseGeoJson y sont egalement attachees (on peut donc avoir une map avec cluster et une map sans cluster dans la meme page sans risque de conflit de fonction)
La lib leafclusterer.js est inclue par gis.js a la demande (via argument de #PRODUIRE_FOND) ce qui evite de charger les libs en 2 hits quand on utilise les clusters
Un nouveau critère {distancefrom} qui peut être utilisé soit lorsque le critère {gis} est présent sur un objet, soit lorsqu'on est déjà sur une boucle (GIS).
Le principe est de ne sélectionner que les objets qui ont une localisation (un point lié) respectant une certaine distance à un autre point qu'on donne en paramètre.
Ce point peut être soit un tableau avec "lat" et "lon", soit un id_gis.
Ça s'écrit donc par exemple :
(PATATES){gis}{distancefrom #ARRAY{lat,#ENV{lat},lon,#ENV{lon}}, <=, #ENV{distance}}
pour trouver toutes les patates dans un rayon de la variable "distance" autour d'un point qu'on donne.
La fonction distance() sait maintenant prendre soit un point GIS, soit un tableau de coordonnées quelconques. Ce qui permet soit de calculer la distance entre n'importe quoi (pas juste du id_gis), soit aussi de ne pas faire des requêtes supplémentaires quand on a déjà les infos sous la main !
Au passage, sécu : on force intval() sur les valeurs car sinon ceux qui utilisaient ça dans un squelette avec des #ENV, ça pouvait passer n'importe quoi à la requête SQL !
_GIS_LAYER_DEFAUT_FORCE pour forcer une couche par défaut (non modifiable)
_GIS_LAYER_DEFAUT pour définir une couche par défaut si pas de config (modifiable)
* il manquait la verification de la clé de yandex
* mapstraction envoie une exception pour mapSetType pour OpenLayers
et une fonction spip3:
* il vaut mieux utiliser lire_config que passer par les globales
* c'est le fond qui se met par défaut dans toutes las cartes du site. Par défaut, c'est la valeur ROAD, comme avant.
* on peut le choisir par un select dans la page de configuration
* on peut le surcharger, comme pour l'API, par les variables _GIS_MAPTYPES, _GIS_MAPTYPES_FORCE et _GIS_MAPTYPES_DEFAUT
* le type de carte peut toujours etre passe en parametre dans le modele, ca ne change pas
On upgrade du coup de version
On ajoute un squelette de liste des points (notamment pour la recherche)
On tweak sur les ajax pour charger uniquement ce que l'on souhaite en ajax dans affiche milieu
On ajoute la fonction de génération d'url dans le privé sur les pages de points
On améliore les CSS et on met une class sur la carte du formulaire d'édition de point