Le but de ce plugin est d’ajouter la prise en charge de l’édition et de l’affiche de formes géométriques au plugin GIS pour SPIP.
Champs à ajouter dans la table spip_gis
- type : valeur par défaut vide, point par défaut pour les points existants lors de l’installation de gis_geom
- geo : un champ de type Geometry disponible depuis mysql 4.1
API javascript
Mapstraction Interractive semble faire tout ce dont on a besoin pour dessiner sur une carte, mais ce projet n’est pas très bien documenté et ses auteurs n’ont pas encore répondu à nos sollicitations pour les aider à le brancher de façon propre sur Mapstraction.
Leaflet semble une piste intéressante, du coup j’ai développé le plugin leaflet.draw pour l’ajout de formes sur la carte. Avec celui-ci on a tout ce qu’il faut, mais uniquement avec cette API.
Principe de fonctionnement
Phase d’édition d’un objet
L’API javascript de carto renvoie les données de la géométrie éditée au format GeoJSON ou WKT.
Le plugin ajoute deux champs au formulaire editer_gis à l’aide du pipeline recuperer_fond :
- type : le type de l’objet
- geojson : la valeur du champ geo au format GeoJSON (mysql spatial)
- ? les valeurs de lat et lon de l’objet (à partir du centroid généré avec geoPHP pour les formes géométriques)
Puis, le contenu de ces champs est traité par le pipeline pre_edition pour les enregistrer en base.
Boucles et balises
On peut tenter d’afficher directement un champ Geometry dans une boucle mais les données au format natif utilisé par mysql ne seront pas exploitables, exemple :
�:��u�3@0�>�@�P��aAݒ�P@0�>�@�P��aAݒ�P@�2�]?7P@�:��u�3@�2�]?7P@�:��u�3@0�>�@�P�
La même valeur affichée au format WKT en utilisant AsText() dans la requête sql :
POLYGON((19.708824201307586 -67.67581993229828,66.68083888421046 -67.67581993229828,66.68083888421046 64.86324256770172,19.708824201307586 64.86324256770172,19.708824201307586 -67.67581993229828))
Le plugin devra donc procurer une balise du type #GEOMETRY
qui sera une représentation au format WKT du contenu du champ geo de la table spip_gis.
SELECT AsText(geo) FROM spip_gis;
On pourra fournir des filtres afin de convertir cette balise dans différents formats à l’aide de la classe geoPHP.
[(#GEOMETRY|wkt_to_json)]
"{"type":"Polygon","coordinates":[[[19.708824201308,-67.675819932298],[66.68083888421,-67.675819932298],[66.68083888421,64.863242567702],[19.708824201308,64.863242567702],[19.708824201308,-67.675819932298]]]}"
[(#GEOMETRY|wkt_to_kml)]
"<Polygon><outerBoundaryIs><LinearRing><coordinates>19.708824201308,-67.675819932298 66.68083888421,-67.675819932298 66.68083888421,64.863242567702 19.708824201308,64.863242567702 19.708824201308,-67.675819932298</coordinates></LinearRing></outerBoundaryIs></Polygon>"
[(#GEOMETRY|wkt_to_gpx)]
"<gpx creator="geoPHP" version="1.0"><trk><trkseg><trkpt lat="-67.675819932298" lon="19.708824201308" /><trkpt lat="-67.675819932298" lon="66.68083888421" /><trkpt lat="64.863242567702" lon="66.68083888421" /><trkpt lat="64.863242567702" lon="19.708824201308" /><trkpt lat="-67.675819932298" lon="19.708824201308" /></trkseg></trk></gpx>"
[(#GEOMETRY|wkt_to_georss)]
"<polygon>-67.675819932298 19.708824201308 -67.675819932298 66.68083888421 64.863242567702 66.68083888421 64.863242567702 19.708824201308 -67.675819932298 19.708824201308</polygon>"
Liens en vrac
GeoPHP is a open-source native PHP library for doing geometry operations. It is written entirely in PHP and can therefore run on shared hosts. It can read and write a wide variety of formats : WKT (including EWKT), WKB (including EWKB), GeoJSON, KML, GPX, GeoRSS). https://github.com/phayes/geoPHP
Geofield provides a field type that stores geographic location data for points, lines, and polygons. Data in this field supports mapping modules including Open Layers.
http://drupal.org/node/1089574
Geo and Geocode Modules Documentation Wiki
http://groups.drupal.org/node/20314
La classe WKT d’OpenLayers qui permet de lire/écrire du WKT
http://dev.openlayers.org/sandbox/docs/lib/OpenLayers/Format/WKT.js