Compare commits

...

40 Commits

Author SHA1 Message Date
spip.franck@lien-d-amis.net 8929dfb842 - Je monte la version de saisie (en gardant la même branche pour réduire le risque de casse) pour être certain que si un jour, un commit qui concerne l'un des plug et saisie, que la version de saisies soit une version sûr ! 4 years ago
spip.franck@lien-d-amis.net 06eedd0f0f zone.spip est maintenant en https, donc j'ajoute le "s" 5 years ago
spip.franck@lien-d-amis.net 321f717901 spip.net est maintenant en https, donc, j'ajoute le "s" à http 5 years ago
spip.franck@lien-d-amis.net 625f3ea468 En finir une fois pour toutes avec spip-contrib, pour mettre à la place contrib.spip 6 years ago
spip.franck@lien-d-amis.net 38acd019e4 Contrib est en https, donc j'ajoute le "s", plus divers broutilles 6 years ago
spip.franck@lien-d-amis.net 5e35dedf16 Ce n'est plus spip-contrib, mais contrib.spip 8 years ago
denisb@a-working-class-hero-is-something-to.be 66cf9ee71e gis/trunk, gis/branches : correction du 'prefix' de sélecteur générique pour son 'utilise' (spip.factory) 9 years ago
lesage.sylvain@laposte.net fd31a11423 report de 54170 11 years ago
brunobergot@gmail.com e6fe0d8d82 On avance dans l'expérimentation : 11 years ago
brunobergot@gmail.com 7957c190cc correction du chemin de la lib 11 years ago
lesage.sylvain@laposte.net 10ecc1f79b il manquait yandex dans la liste des API avec clé obligatoire 11 years ago
lesage.sylvain@laposte.net c3540056c0 report de r53774 11 years ago
brunobergot@gmail.com 9c5d555b34 ajout d'une branche expérimentale pour le dev du clsutering de marqueurs côté serveur 11 years ago
kent1@arscenic.info 24a134f6fc if (!defined("_ECRIRE_INC_VERSION")) return; sur tout fichier PHP pour sécurité future principalement 11 years ago
pierrekuhn82@gmail.com ac6e74b815 On ferme les versions spip, entités numérique. 11 years ago
brunobergot@gmail.com ab86e6caed descriptif et slogan avec entités chépakoi pour tonton 11 years ago
brunobergot@gmail.com fe3567149d bien récupérer l'id de la carte lors de son utilisation depuis le texte d'un élément SPIP 11 years ago
brunobergot@gmail.com 0c5773a125 maj de l'url de la lib 11 years ago
brunobergot@gmail.com b6351f493d On se branche sur notre propre version de la lib Mapstraction pour ne pas avoir à attendre leur release pour chaque modif mineure. La lib est générée sur le serveur de mediaspip à partir de la branche suivante : https://github.com/brunob/mxn/tree/gis 11 years ago
brunobergot@gmail.com 48142bdae1 - centrer les icones persos au milieu en bas avec icon_anchor qui n'est pas encore dispo dans addJSON de mapstraction (ça va venir) 11 years ago
brunobergot@gmail.com a62a523279 on vire l'API yahoo dont le service ferme le 13/11/2011 + masquer temporairement microsoft bing de la liste des APIs le temps qu'on répare son intégration 11 years ago
webmaster@art-logic.info bc13c4f490 pas de bio sur Gis 11 years ago
webmaster@art-logic.info 935f21ab85 Ajouts dans la branche V2 11 years ago
webmaster@art-logic.info 5095da5d10 On ajoute des bios et des descriptifs alternatifs 11 years ago
webmaster@art-logic.info a7e76d025c Un descriptif alternatif si des fois il n'y en a pas dans le Gis. 11 years ago
brunobergot@gmail.com 37eb4d601a oubli dans r49045 : il faut spécifier l'attribut icon_anchor des logos persos des points 11 years ago
kent1@arscenic.info 0684bb0a66 On joue avec des paramètres mi-anglais / mi-français ... on accepte deux paramètres pour chaque option dont le nom était dans une langue et pas dans l'autre 11 years ago
kent1@arscenic.info ff007f7599 pouvoir passer hauteur et largeur aux modèles (équivalents à width et height) 11 years ago
brunobergot@gmail.com dc88c19f2b pas de bordures les logos des points 11 years ago
kent1@arscenic.info 3049e33cdd Si pas de titre ou si le titre est égal au nom de fichier ou contient kml ou kmz : 11 years ago
kent1@arscenic.info b0f3496afa Inversion latitude et longitude 11 years ago
kent1@arscenic.info c5df1cdf7f On limite le calcul de moyenne de latitude et longitude aux 500 premiers points 11 years ago
kent1@arscenic.info f8f3ea8666 Si on n'a pas de latitude ni longitude directement dans Document, on fait une moyenne des latitude et longitude des Placemark 11 years ago
brunobergot@gmail.com 126ee08dda r51159 devait faire taire les logs :p 11 years ago
kent1@arscenic.info 2a5c1bc051 éviter une erreur dans les logs pour un pipeline qu'il ne trouvait pas... 11 years ago
kent1@arscenic.info c40901460b On backport les débeloppement qui étaient prévus pour cette branche au départ 11 years ago
brunobergot@gmail.com a71a505c04 un squelette JSON pour afficher les points liés aux rubriques (fourberie inside pour gérer un id_parent conditionnel) + la carte passe aussi l'id_parent présent dans l'env + on vire un vieux truc obsolète 11 years ago
brunobergot@gmail.com 886f346f74 JSON valide si on a plusieurs points attachés à un mots ou un auteur + maj todo (on devrait virer ce fichier non ?) 11 years ago
rastapopoulos@spip.org 192028b539 On change le statut pour le ZIP actuel de la version 2, comme le proposait tonton. Je mets donc en test. 11 years ago
rastapopoulos@spip.org 62a62c0385 On copie le trunk actuel dans une branche 2 qui serait pour SPIP 2.1, et le trunk serait pour SPIP 3. Mais du coup qu'en est-il des numéros de version du plugin ? Ça reste les mêmes dans les deux branches ? U peu chiant tout ça quand même. 11 years ago
  1. 5
      .gitattributes
  2. 1
      TODO.txt
  3. 68
      action/kml_infos.php
  4. 5
      base/gis.php
  5. 9
      base/gis_upgrade.php
  6. 25
      cluster.html
  7. 35
      formulaires/config_gis.html
  8. 8
      formulaires/config_gis_fonctions.php
  9. 5
      formulaires/editer_gis.html
  10. 2
      formulaires/editer_gis.php
  11. 2
      formulaires/rechercher_gis.php
  12. 2
      genie/gis_nettoyer_base.php
  13. 2
      gis_autoriser.php
  14. 119
      gis_fonctions.php
  15. 3
      gis_json.html
  16. 4
      gis_options.php
  17. 47
      gis_pipelines.php
  18. BIN
      images/bg_cluster.png
  19. 3
      inc/iptc.php
  20. 138
      inc/kml_infos.php
  21. 54
      javascript/gis.js
  22. 8
      json/gis.html
  23. 37
      json/gis_articles.html
  24. 11
      json/gis_auteurs.html
  25. 11
      json/gis_mots.html
  26. 20
      json/gis_rubriques.html
  27. 2
      lang/gis_en.php
  28. 11
      lang/gis_fr.php
  29. 128
      modeles/carte_gis.html
  30. 7
      modeles/carte_gis_preview.html
  31. 25
      plugin.xml
  32. 2
      prive/exec/gis_editer_fonctions.php
  33. 2
      prive/exec/gis_fonctions.php

5
.gitattributes vendored

@ -2,9 +2,11 @@
/TODO.txt -text
action/editer_gis.php -text
action/editer_lien_gis.php -text
action/kml_infos.php -text
action/supprimer_gis.php -text
base/gis.php -text
base/gis_upgrade.php -text
/cluster.html -text
fonds/cfg_gis.html -text
formulaires/config_gis.html -text
formulaires/config_gis_fonctions.php -text
@ -19,16 +21,19 @@ genie/gis_nettoyer_base.php -text
/gis_kml.html -text
/gis_options.php -text
/gis_pipelines.php -text
images/bg_cluster.png -text
images/gis-16.png -text
images/gis-24.png -text
images/gis.png -text
images/marker.png -text
inc/iptc.php -text
inc/kml_infos.php -text
javascript/gis.js -text
json/gis.html -text
json/gis_articles.html -text
json/gis_auteurs.html -text
json/gis_mots.html -text
json/gis_rubriques.html -text
lang/gis.xml -text
lang/gis_en.php -text
lang/gis_fr.php -text

1
TODO.txt

@ -1,4 +1,3 @@
Regarder la compression JS qui ne fonctionne pas
Avoir un crayon de modification de point depuis le public

68
action/kml_infos.php

@ -0,0 +1,68 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/charsets'); # pour le nom de fichier
include_spip('inc/actions');
function action_kml_infos_dist(){
global $redirect;
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
if (!preg_match(",^(-?)(\d+)\W(\w+)\W?(\d*)\W?(\d*)$,", $arg, $r)){
spip_log("action_kml_infos_dist incompris: " . $arg);
$redirect = urldecode(_request('redirect'));
return;
}
else{
action_kml_infos_post($r);
}
}
function action_kml_infos_post($r){
list(, $sign, $id_objet, $objet, $id_document, $suite) = $r;
if(intval($id_document)){
$recuperer_info = charger_fonction('kml_infos','inc');
$infos = $recuperer_info($id_document);
if($infos){
include_spip('inc/documents');
$fichier = sql_getfetsel('fichier','spip_documents','id_document='.intval($id_document));
if(is_numeric($latitude = $infos['latitude']) && is_numeric($longitude = $infos['longitude'])){
$c = array(
'titre' => $infos['titre'] ? $infos['titre'] : basename($fichier),
'lat'=> $latitude,
'lon' => $longitude,
'zoom' => $config['zoom'] ? $config['zoom'] :'4'
);
include_spip('action/editer_gis');
if($id_gis = sql_getfetsel("G.id_gis","spip_gis AS G LEFT JOIN spip_gis_liens AS T ON T.id_gis=G.id_gis ","T.id_objet=" . intval($id_document) . " AND T.objet='document'")){
// Des coordonnées sont déjà définies pour ce document => on les update
revisions_gis($id_gis,$c);
spip_log("GIS EXIFS : Update des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis","gis");
}
else{
// Aucune coordonnée n'est définie pour ce document => on les crées
$id_gis = insert_gis();
revisions_gis($id_gis,$c);
lier_gis($id_gis, 'document', $id_document);
spip_log("GIS EXIFS : Création des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis","gis");
}
}
unset($infos['longitude']);
unset($infos['latitude']);
if(count($infos) > 0){
include_spip('inc/modifier');
revision_document($id_document, $infos);
}
}
}
$redirect = urldecode(_request('redirect'));
return $redirect;
}
?>

5
base/gis.php

@ -40,7 +40,10 @@ function gis_declarer_tables_principales($tables_principales){
);
$spip_gis_key = array(
"PRIMARY KEY" => "id_gis");
"PRIMARY KEY" => "id_gis",
"KEY lat" => "lat",
"KEY lon" => "lon"
);
$tables_principales['spip_gis'] = array(
'field' => &$spip_gis,

9
base/gis_upgrade.php

@ -1,5 +1,7 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/meta');
/**
@ -76,6 +78,13 @@ function gis_upgrade($nom_meta_base_version,$version_cible){
sql_alter("TABLE spip_gis CHANGE lon lon DOUBLE NULL NULL");
ecrire_meta($nom_meta_base_version,$current_version="2.0.2",'non');
}
if (version_compare($current_version, '2.0.3','<')){
// ajouter des index sur les coords lat/lon
include_spip('base/abstract_sql');
sql_alter("TABLE spip_gis ADD INDEX (lat)");
sql_alter("TABLE spip_gis ADD INDEX (lon)");
ecrire_meta($nom_meta_base_version,$current_version="2.0.3",'non');
}
}
}

25
cluster.html

@ -0,0 +1,25 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
<head>
<title>Cluster - [(#NOM_SITE_SPIP|textebrut)]</title>
[<meta name="description" content="(#DESCRIPTIF_SITE_SPIP|couper{150}|attribut_html)" />]
<INCLURE{fond=inc-head}>
<meta name="robots" content="none" />
</head>
<body class="page_plan">
<div id="page">
<h1>Fais péter mémé !</h1>
<p>Ici on utilise le code de http://www.appelsiini.net/2008/11/introduction-to-marker-clustering-with-google-maps pour gérer des clusters côté serveur.</p>
[(#MODELE{carte_gis,objets=articles,limit=50000,cluster=oui})]
<p>La même sans cluster</p>
[(#MODELE{carte_gis,id_map=2,objets=articles,limit=50000})]
</div><!--#page-->
</body>
</html>

35
formulaires/config_gis.html

@ -27,10 +27,8 @@
cloudmade,<:gis:cfg_lbl_api_cloudmade:>,
google,<:gis:cfg_lbl_api_google:>,
googlev3,<:gis:cfg_lbl_api_googlev3:>,
microsoft,<:gis:cfg_lbl_api_microsoft:>,
openlayers,<:gis:cfg_lbl_api_openlayers:>,
ovi,<:gis:cfg_lbl_api_ovi:>,
yahoo,<:gis:cfg_lbl_api_yahoo:>,
yandex,<:gis:cfg_lbl_api_yandex:>})]})]
[(#VAL{_GIS_APIS}|defined|oui)
@ -53,6 +51,32 @@
defaut=#GET{api_defaut},valeur_forcee=#GET{api_forcee},readonly=#GET{api_readonly},disable=#GET{api_disable},explication=#GET{api_explications},
datas=#GET{apis}})]
[(#SET{maptypes,[(#ARRAY{
ROAD,<:gis:cfg_lbl_maptype_carte:>,
SATELLITE,<:gis:cfg_lbl_maptype_satellite:>,
HYBRID,<:gis:cfg_lbl_maptype_hybride:>,
PHYSICAL,<:gis:cfg_lbl_maptype_relief:>})]})]
[(#VAL{_GIS_MAPTYPES}|defined|oui)
[(#EVAL{_GIS_MAPTYPES}|unserialize|is_array|oui)#SET{apis,#EVAL{_GIS_MAPTYPES}|unserialize}]
]
[(#SET{maptype_defaut,carte})]
[(#VAL{_GIS_MAPTYPES_DEFAUT}|defined|oui)
[(#SET{maptype_defaut,[(#EVAL{_GIS_MAPTYPES_DEFAUT})]})]
]
[(#VAL{_GIS_MAPTYPES_FORCE}|defined|oui)
[(#SET{maptype_readonly,readonly})]
[(#SET{maptype_disable,disabled})]
[(#SET{maptype_force,[(#EVAL{_GIS_MAPTYPES_FORCE})]})]
[(#SET{maptype_explications,<:gis:explication_maptype_force:>})]
]
[(#SAISIE{selection,maptype,
label=<:gis:cfg_lbl_maptype:>,
cacher_option_intro=oui,
defaut=#GET{maptype_defaut},valeur_forcee=#GET{maptype_force},readonly=#GET{maptype_readonly},disable=#GET{maptype_disable},explication=#GET{maptype_explications},
datas=#GET{maptypes}})]
[(#SAISIE{oui_non,geocoder,
defaut='',
label=<:gis:cfg_lbl_geocoder:>,
@ -108,6 +132,13 @@
var map_container = 'map_config';
map = new mxn.Mapstraction(map_container,'[(#REM|gis_api_utilisee)]');
map.setCenterAndZoom(new mxn.LatLonPoint(#ENV{lat,0},#ENV{lon,0}),#ENV{zoom,0});
// Pour l'API Openlayers, la methode n'existe pas
try {
map.setMapType([mxn.Mapstraction.(#REM|gis_maptype_utilise)]);
}
catch(err) {
$(".editer_maptype").hide();
}
map.addControls({
pan: true,

8
formulaires/config_gis_fonctions.php

@ -4,13 +4,15 @@
* Utilisé notamment pour l'insertion dans les pipelines de CFG
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
/**
* Fonction de verification du formulaire de configuration CFG
* - On vérifie si dans les cas de cloudmade ou de google (v2), une clé a
* été fournie
* - On vérifie si dans les cas de cloudmade, de google (v2) ou de
* yandex, une clé a été fournie
*/
function cfg_config_gis_verifier(&$cfg){
if(in_array($cfg->val['api'],array('cloudmade','google'))){
if(in_array($cfg->val['api'],array('cloudmade','google','yandex'))){
$obligatoire = "api_key_".$cfg->val['api'];
if(!$cfg->val[$obligatoire]){
$erreur[$obligatoire] = _T('info_obligatoire');

5
formulaires/editer_gis.html

@ -75,11 +75,12 @@ var geocoder;]
"id":"#ID_GIS",
"title":[(#TITRE|supprimer_numero|json_encode)],
"description":[(#DESCRIPTIF|json_encode)][,(#LOGO_GIS|oui)
[(#SET{logo_doc,#LOGO_GIS|image_passe_partout{28,28}|image_recadre{28,28}|image_recadre{32,32,center}|image_aplatir{jpg,ffffff}})]
[(#SET{logo_doc,#LOGO_GIS|image_passe_partout{32,32}|image_recadre{32,32}})]
#SET{icon_w,#GET{logo_doc}|extraire_attribut{src}|largeur}
#SET{icon_h,#GET{logo_doc}|extraire_attribut{src}|hauteur}
["icon": (#GET{logo_doc}|extraire_attribut{src}|url_absolue|json_encode)],
"icon_size": [(#VAL{91}|chr)]#GET{icon_w},#GET{icon_h}[(#VAL{93}|chr)]]
"icon_size": [(#VAL{91}|chr)]#GET{icon_w},#GET{icon_h}[(#VAL{93}|chr)]],
"icon_anchor": [(#VAL{91}|chr)][(#GET{icon_w}|div{2})],[(#GET{icon_h})][(#VAL{93}|chr)]
}[(#VAL{93}|chr)]
}
form_map.addJSON(data);]

2
formulaires/editer_gis.php

@ -3,6 +3,8 @@
* Formulaire de création et d'édition d'un point géolocalisé
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/actions');
include_spip('inc/editer');

2
formulaires/rechercher_gis.php

@ -3,6 +3,8 @@
* Formulaire de création et d'édition d'un point géolocalisé
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/actions');
include_spip('inc/editer');

2
genie/gis_nettoyer_base.php

@ -1,5 +1,7 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
function genie_gis_nettoyer_base_dist($t){
$liens = array();

2
gis_autoriser.php

@ -1,5 +1,7 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
function gis_autoriser(){};
/**

119
gis_fonctions.php

@ -1,5 +1,7 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
/**
* Filtre dec_to_dms, http://www.statemaster.com/encyclopedia/Geographic-coordinate-conversion
*
@ -37,7 +39,7 @@ function dms_to_dec($ref,$deg,$min,$sec) {
/**
* Filtre distance pour renvoyer la distance entre deux points
* http://snipplr.com/view/2531/calculate-the-distance-between-two-coordinates-latitude-longitude/
* sinon voir ici : http://zone.spip.org/trac/spip-zone/browser/_plugins_/forms/geoforms/inc/gPoint.php
* sinon voir ici : https://zone.spip.org/trac/spip-zone/browser/_plugins_/forms/geoforms/inc/gPoint.php
*
* @param int $from id_gis du point de référence
* @param int $ti id_gis du point distant
@ -143,4 +145,119 @@ function gis_api_utilisee(){
return $config['api'] ? $config['api'] : $defaut;
}
}
/**
* Définition du fond cartographique à utiliser en prenant compte les defines
*/
function gis_maptype_utilise(){
$defaut = 'ROAD';
if(defined('_GIS_MAPTYPES_FORCE')){
return _GIS_MAPTYPES_FORCE;
}else{
if(defined('_GIS_MAPTYPES_DEFAUT')){
$defaut = _GIS_MAPTYPES_DEFAUT;
}
$config = @unserialize($GLOBALS['meta']['gis']);
return $config['maptype'] ? $config['maptype'] : $defaut;
}
}
// Cluster côté serveur
// http://www.appelsiini.net/2008/11/introduction-to-marker-clustering-with-google-maps
define('OFFSET', 268435456);
define('RADIUS', 85445659.4471); /* $offset / pi() */
function lonToX($lon) {
return round(OFFSET + RADIUS * $lon * pi() / 180);
}
function latToY($lat) {
return round(OFFSET - RADIUS *
log((1 + sin($lat * pi() / 180)) /
(1 - sin($lat * pi() / 180))) / 2);
}
function pixelDistance($lat1, $lon1, $lat2, $lon2, $zoom) {
$x1 = lonToX($lon1);
$y1 = latToY($lat1);
$x2 = lonToX($lon2);
$y2 = latToY($lat2);
return sqrt(pow(($x1-$x2),2) + pow(($y1-$y2),2)) >> (21 - $zoom);
}
function filtre_gis_cluster($flux, $distance=40, $zoom=3) {
$json = json_decode($flux,true);
$markers = $json['features'];
spip_log("total markers avant cluster ".count($markers),"bb");
$clustered = array();
/* Loop until all markers have been compared. */
while (count($markers)) {
$marker = array_pop($markers);
$cluster = array();
/* Compare against all markers which are left. */
foreach ($markers as $key => $target) {
$pixels = pixelDistance($marker['geometry']['coordinates'][1], $marker['geometry']['coordinates'][0],
$target['geometry']['coordinates'][1], $target['geometry']['coordinates'][0],
$zoom);
/* If two markers are closer than given distance remove */
/* target marker from array and add it to cluster. */
if ($distance > $pixels) {
unset($markers[$key]);
$cluster[] = $target;
}
}
/* If a marker has been added to cluster, add also the one */
/* we were comparing to and remove the original from array. */
if (count($cluster) > 0) {
$cluster[] = $marker;
$clustered[] = $cluster;
} else {
$clustered[] = $marker;
}
}
$result = array();
spip_log("total markers apres cluster ".count($clustered),"bb");
// crer les markers pour les clusters
foreach ($clustered as $key => $cluster) {
if (is_array($cluster[0])) {
$nb_markers = count($cluster);
// le cluster est centré sur le dernier point du tableau
// car c'est le point de référence pour les calculs de distance
$result[$key] = array_pop($cluster);
// on colle le nombre de points du cluster dans le titre du marker
$result[$key]['properties']['title'] = json_encode($nb_markers);
// marquer les markers qui sont des clusters, attribut category dans mxn.addJSON()
$result[$key]['properties']['category'] = 'cluster';
// pas d'infoBubble pour les markers de cluster
$result[$key]['properties']['infoBubble'] = '';
// récupérer les bounds pour afficher l'enssemble des points du clusters
$bounds = array(
'sw_lat' => $result[$key]['geometry']['coordinates'][1],
'sw_lon' => $result[$key]['geometry']['coordinates'][0],
'ne_lat' => $result[$key]['geometry']['coordinates'][1],
'ne_lon' => $result[$key]['geometry']['coordinates'][0]
);
foreach ($cluster as $marker) {
if ($bounds['sw_lat'] > $marker['geometry']['coordinates'][1])
$bounds['sw_lat'] = $marker['geometry']['coordinates'][1];
if ($bounds['sw_lon'] > $marker['geometry']['coordinates'][0])
$bounds['sw_lon'] = $marker['geometry']['coordinates'][0];
if ($bounds['ne_lat'] < $marker['geometry']['coordinates'][1])
$bounds['ne_lat'] = $marker['geometry']['coordinates'][1];
if ($bounds['ne_lon'] < $marker['geometry']['coordinates'][0])
$bounds['ne_lon'] = $marker['geometry']['coordinates'][0];
}
// on passe les bounds du cluster dans le champ data du marker
$result[$key]['properties']['data'] = $bounds;
} else {
$result[$key] = $cluster;
}
}
$result = '{"type": "FeatureCollection", "features": ' . json_encode($result) .'}';
return $result;
}
?>

3
gis_json.html

@ -3,4 +3,5 @@
"features": [
[(#INCLURE{fond=json/gis[_(#ENV{objets})],env})]
]
}
}
[(#ENV{cluster}|oui)#FILTRE{gis_cluster}]

4
gis_options.php

@ -1,6 +1,8 @@
<?php
define('_DIR_LIB_GIS',_DIR_RACINE.'lib/h8e7f8b9b-mxn-2.0.17/');
if (!defined("_ECRIRE_INC_VERSION")) return;
define('_DIR_LIB_GIS',_DIR_RACINE.'lib/mxn-gis-cluster-2.0.10/');
$table_des_traitements['VILLE'][]= 'typo(extraire_multi(%s))';
$table_des_traitements['PAYS'][]= 'typo(extraire_multi(%s))';

47
gis_pipelines.php

@ -1,5 +1,7 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
function gis_inserer_javascript($flux){
// initialisation des valeurs de config
@ -31,9 +33,7 @@ function gis_inserer_javascript($flux){
$flux .="\n".'<script type="text/javascript" src="http://api.maps.ovi.com/jsl.js"></script>'."\n";
if ($config['api'] == 'yandex')
$flux .="\n".'<script type="text/javascript" src="http://api-maps.yandex.ru/1.1/index.xml?key='.$config['api_key_yandex'].'"></script>'."\n";
if ($config['api'] == 'yahoo')
$flux .="\n".'<script type="text/javascript" src="http://api.maps.yahoo.com/ajaxymap?v=3.8&appid=MapstractionDemo"></script>'."\n";
// insertion de la lib mapstraction
if(in_array($config['api'],array('cartociudad','google','googlev3','yandex'))){
$geocoder = ($config['geocoder']) ? ',[geocoder]' : '';
@ -106,13 +106,15 @@ function gis_post_edition($flux){
if (($flux['args']['operation'] == 'ajouter_document')
AND ($document = sql_fetsel("*","spip_documents","id_document=".intval($flux['args']['id_objet'])))
) {
if ($document['extension'] == 'jpg') {
if(in_array($document['extension'],array('jpg','kml','kmz'))){
$config = @unserialize($GLOBALS['meta']['gis']);
if(!is_array($config))
$config = array();
include_spip('inc/documents');
$fichier = get_spip_doc($document['fichier']);
$id_document = $document['id_document'];
}
if ($document['extension'] == 'jpg') {
// on recupere les coords definies dans les exif du document s'il y en a
if ($exifs = @exif_read_data($fichier,'GPS')) {
if(!function_exists('dms_to_dec'))
@ -251,6 +253,41 @@ function gis_post_edition($flux){
spip_log("GIS EXIFS : Création des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis","gis");
}
}
}elseif(in_array($document['extension'],array('kml','kmz'))){
$recuperer_info = charger_fonction('kml_infos','inc');
$infos = $recuperer_info($document['id_document']);
if($infos){
if(is_numeric($latitude = $infos['latitude']) && is_numeric($longitude = $infos['longitude'])){
$c = array(
'titre' => $infos['titre'] ? $infos['titre'] : basename($fichier),
'descriptif' => $infos['descriptif'],
'lat'=> $latitude,
'lon' => $longitude,
'zoom' => $config['zoom'] ? $config['zoom'] :'4'
);
include_spip('action/editer_gis');
if($id_gis = sql_getfetsel("G.id_gis","spip_gis AS G LEFT JOIN spip_gis_liens AS T ON T.id_gis=G.id_gis ","T.id_objet=" . intval($id_document) . " AND T.objet='document'")){
// Des coordonnées sont déjà définies pour ce document => on les update
revisions_gis($id_gis,$c);
spip_log("GIS EXIFS : Update des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis","gis");
}
else{
// Aucune coordonnée n'est définie pour ce document => on les crées
$id_gis = insert_gis();
revisions_gis($id_gis,$c);
lier_gis($id_gis, 'document', $id_document);
spip_log("GIS EXIFS : Création des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis","gis");
}
}
unset($infos['longitude']);
unset($infos['latitude']);
if(count($infos) > 0){
include_spip('inc/modifier');
revision_document($id_document, $infos);
}
}
}
}
if (($flux['args']['operation'] == 'supprimer_document')
@ -283,7 +320,7 @@ function gis_declarer_type_surnoms($surnoms){
return $surnoms;
}
function gis_declarer_objets_surnoms($surnoms){
function gis_declarer_tables_objets_surnoms($surnoms){
$surnoms['gis'] = 'gis';
return $surnoms;
}

BIN
images/bg_cluster.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1003 B

3
inc/iptc.php

@ -1,4 +1,7 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
//#############################################################################################
//##############################################################################################

138
inc/kml_infos.php

@ -0,0 +1,138 @@
<?php
/**
* Plugin GIS
* Récupération de données dans les fichiers kml permettant de :
* -* récupérer latitude et longitude d'un point correspondant centré sur la moyenne des points ou polygones du kml
* -* récupérer un titre
* -* récupérer un descriptif
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
function inc_kml_infos($id_document){
if(!intval($id_document))
return false;
include_spip('inc/documents');
$document = sql_fetsel("*", "spip_documents","id_document=".intval($id_document));
$chemin = $document['fichier'];
$chemin = get_spip_doc($chemin);
$extension = $document['extension'];
if(in_array($extension,array('kml','kmz'))){
$supprimer_chemin = false;
/**
* Si on est dans un kmz (kml + autres fichiers compressés en zip),
* On dézip pour trouver le kml
*/
if($extension == 'kmz'){
include_spip('inc/pclzip');
$zip = new PclZip($chemin);
$list = $zip->listContent();
foreach($list as $fichier => $info_fichier){
if(substr(basename($info_fichier['filename']),-3) == 'kml'){
$zip->extractByIndex($info_fichier['index'],_DIR_TMP);
$chemin = _DIR_TMP.$info_fichier['filename'];
$supprimer_chemin = true;
break;
}
}
}
include_spip('inc/xml');
$ret = lire_fichier($chemin,$donnees);
$arbre = spip_xml_parse($donnees);
spip_xml_match_nodes(",^Document,",$arbre, $documents);
foreach($documents as $document => $info){
$infos['titre'] = $info[0]['name'][0];
$infos['descriptif'] = $info[0]['description'][0];
$infos['longitude'] = $info[0]['LookAt'][0]['longitude'][0] ? $info[0]['LookAt'][0]['longitude'][0] : false;
$infos['latitude'] = $info[0]['LookAt'][0]['latitude'][0] ? $info[0]['LookAt'][0]['latitude'][0] : false;
}
/**
* Si on n'a pas de longitude ou de latitude,
* on essaie de faire une moyenne des placemarks
*/
if(!$infos['longitude'] OR !$infos['latitude']){
spip_xml_match_nodes(",^Placemark,",$arbre, $placemarks);
$latitude = 0;
$longitude = 0;
$compte = 0;
foreach($placemarks as $places){
foreach($places as $placemark => $lieu){
if($compte > 500)
break;
if($lieu['LookAt'][0]['longitude'][0] && $latitude + $lieu['LookAt'][0]['latitude'][0]){
if($compte > 500)
break;
$latitude = $latitude + $lieu['LookAt'][0]['latitude'][0];
$longitude = $longitude + $lieu['LookAt'][0]['longitude'][0];
$compte++;
}else if($lieu['Point'][0]['coordinates'][0]){
if($compte > 500)
break;
$coordinates = explode(',',$lieu['Point'][0]['coordinates'][0]);
$latitude = $latitude + trim($coordinates[1]);
$longitude = $longitude + trim($coordinates[0]);
$compte++;
}else if($lieu['Polygon'][0]['outerBoundaryIs'][0]['LinearRing'][0]['coordinates'][0]){
if($compte > 500)
break;
$coordinates = explode(' ',trim($lieu['Polygon'][0]['outerBoundaryIs'][0]['LinearRing'][0]['coordinates'][0]));
foreach($coordinates as $coordinate){
if($compte > 500)
break;
$coordinate = explode(',',$coordinate);
$latitude = $latitude + trim($coordinate[1]);
$longitude = $longitude + trim($coordinate[0]);
$compte++;
}
}
}
}
if(($latitude != 0) && ($longitude != 0)){
$infos['latitude'] = $latitude / $compte;
$infos['longitude'] = $longitude / $compte;
}
}
/**
* Si pas de titre ou si le titre est égal au nom de fichier ou contient kml ou kmz :
* -* on regarde s'il n'y a qu'un seul Folder et on récupère son nom;
* -* on regarde s'il n'y a qu'un seul Placemark et on récupère son nom;
*/
if(!$infos['titre'] OR ($infos['titre'] == basename($chemin)) OR (preg_match(',\.km.,',$infos['titre']) > 0)){
spip_xml_match_nodes(",^Folder,",$arbre, $folders);
if(count($folders['Folder']) == 1){
foreach($folders['Folder'] as $folder => $dossier){
if($dossier['name'][0])
$infos['titre'] = $dossier['name'][0];
if(!$infos['descriptif'] && $dossier['description'][0])
$infos['descriptif'] = $dossier['description'][0];
}
}else{
if(!is_array($placemarks)){
spip_xml_match_nodes(",^Placemark,",$arbre, $placemarks);
}
if(count($placemarks) == 1){
foreach($placemarks as $places){
if(count($places) == 1){
foreach($places as $placemark => $lieu){
if($lieu['name'][0])
$infos['titre'] = $lieu['name'][0];
if(!$infos['descriptif'] && $lieu['description'][0])
$infos['descriptif'] = $lieu['description'][0];
}
}
}
}
}
}
}else
return false;
if($supprimer_chemin){
supprimer_fichier($chemin);
}
return $infos;
}
?>

54
javascript/gis.js

@ -1,4 +1,4 @@
var gis_get_navigator_location = function(map,zoom){
var gis_get_navigator_location = function(map,zoom) {
if(navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
map.setCenterAndZoom(new mxn.LatLonPoint(position.coords.latitude,position.coords.longitude),zoom ? zoom : 0);
@ -24,4 +24,54 @@ function zoomIci(latit, lonxit, zoom, idmap) {
map.panTo(new GLatLng(latit, lonxit));
map.setZoom(zoom)
}
*/
*/
function gis_load_json(map) {
// récuper le zoom de la carte
map.json_args.zoom = map.getZoom();
// et les coords des points sw et ne de la carte
var bounds = map.getBounds();
// pour les ajouter à la requête ajax
map.json_args.minlon = bounds.sw.lon;
map.json_args.minlat = bounds.sw.lat;
map.json_args.maxlon = bounds.ne.lon;
map.json_args.maxlat = bounds.ne.lat;
// applique-t-on le clustering ?
if (map.cluster) map.json_args.cluster= true;
// lancer la requête
jQuery.getJSON(map.json_url, map.json_args,
function(data) {
if (data){
// virer tous les markers de la carte
map.removeAllMarkers();
// et ajouter les markers renvoyés par la requete
map.addJSON(data);
if (map.cluster) gis_cluster(map);
}
}
);
}
function gis_cluster(map) {
for (i in map.markers) {
if (map.markers[i].attributes.category == 'cluster') {
var marker = map.markers[i];
// éviter de reboucler sur ce marker
marker.attributes.category = '';
// retirer le marker de la carte
map.removeMarker(marker);
// le remplacer par un marker de type cluster
marker.setIcon(map.cluster_icon, [40,40], [20,20]);
// on surveille le clic sur le marker
marker.click.addHandler(function(event_name, event_source, event_args) {
console.log('click');
var bounds = new mxn.BoundingBox(event_source.attributes.data.sw_lat, event_source.attributes.data.sw_lon, event_source.attributes.data.ne_lat, event_source.attributes.data.ne_lon);
console.log(event_source);
map.setBounds(bounds);
gis_load_json(map);
});
// et on l'ajoute à la carte
map.addMarker(marker);
}
}
}

8
json/gis.html

@ -5,15 +5,15 @@
"title":[(#TITRE|supprimer_numero|json_encode)],
"description":[(#DESCRIPTIF|json_encode)][(#SET{logo_doc,''})]
[(#LOGO_GIS|oui)
[(#SET{logo_doc,#LOGO_GIS|image_passe_partout{28,28}|image_recadre{28,28}|image_recadre{32,32,center}})]]
[(#SET{logo_doc,#LOGO_GIS|image_passe_partout{32,32}|image_recadre{32,32}})]]
[(#LOGO_GIS|non)
[(#CHEMIN{images/marker_defaut.png}|oui)[
(#SET{logo_doc,#CHEMIN{images/marker_defaut.png}|image_passe_partout{28,28}|image_recadre{28,28}})]
(#SET{logo_doc,#CHEMIN{images/marker_defaut.png}|image_passe_partout{32,32}|image_recadre{32,32}})]
]]
[(#GET{logo_doc}|oui)
#SET{icon_w,#GET{logo_doc}|extraire_attribut{src}|largeur}
#SET{icon_h,#GET{logo_doc}|extraire_attribut{src}|hauteur}
#SET{icon_anchorPoint,''}
[,"icon": (#GET{logo_doc}|extraire_attribut{src}|url_absolue|json_encode)],
"icon_size": [(#VAL{91}|chr)]#GET{icon_w},#GET{icon_h}[(#VAL{93}|chr)]
"icon_size": [(#VAL{91}|chr)]#GET{icon_w},#GET{icon_h}[(#VAL{93}|chr)],
"icon_anchor": [(#VAL{91}|chr)][(#GET{icon_w}|div{2})],[(#GET{icon_h})][(#VAL{93}|chr)]
]}</BOUCLE_gis>

37
json/gis_articles.html

@ -1,19 +1,22 @@
<BOUCLE_art(ARTICLES){id_article ?}{id_rubrique ?}{id_secteur ?}{id_mot ?}{id_auteur ?}{recherche ?}{0, #ENV{limit}}{","}><BOUCLE_gis(GIS){id_article}{","}>
<BOUCLE_art(ARTICLES){id_article ?}{id_rubrique ?}{id_secteur ?}{id_mot ?}{id_auteur ?}{recherche ?}{0, #ENV{limit}}{","}><BOUCLE_gis(GIS){id_article}{lat >= #ENV{minlat,-90}}{lat <= #ENV{maxlat,90}}{lon >= #ENV{minlon,-180}}{lon <= #ENV{maxlon,180}}{","}>
{"type": "Feature",
"geometry": {"type": "Point", "coordinates": [#LON, #LAT]},
"id":"#ID_GIS",
"title":[(#TITRE|sinon{#_art:TITRE}|supprimer_numero|json_encode)],
"description":[(#DESCRIPTIF|json_encode)][(#SET{logo_doc,''})]
[(#LOGO_GIS|oui)
[(#SET{logo_doc,#LOGO_GIS|image_passe_partout{28,28}|image_recadre{28,28}|image_recadre{32,32,center}})]]
[(#LOGO_GIS|non)
[(#CHEMIN{images/marker_defaut.png}|oui)
[(#SET{logo_doc,#CHEMIN{images/marker_defaut.png}|image_passe_partout{28,28}|image_recadre{28,28}})]
]]
[(#GET{logo_doc}|oui)
#SET{icon_w,#GET{logo_doc}|extraire_attribut{src}|largeur}
#SET{icon_h,#GET{logo_doc}|extraire_attribut{src}|hauteur}
#SET{icon_anchorPoint,''}
[,"icon": (#GET{logo_doc}|extraire_attribut{src}|url_absolue|json_encode)],
"icon_size": [(#VAL{91}|chr)]#GET{icon_w},#GET{icon_h}[(#VAL{93}|chr)]
]}</BOUCLE_gis></BOUCLE_art>
"properties": {
"id":"#ID_GIS",
"infoBubble":[(#TITRE|sinon{#_art:TITRE}|supprimer_numero|json_encode)],
"description":[(#DESCRIPTIF|sinon{#_art:DESCRIPTIF}|json_encode)][(#SET{logo_doc,''})]
[(#LOGO_GIS|oui)
[(#SET{logo_doc,#LOGO_GIS|image_passe_partout{32,32}|image_recadre{32,32}})]]
[(#LOGO_GIS|non)
[(#CHEMIN{images/marker_defaut.png}|oui)
[(#SET{logo_doc,#CHEMIN{images/marker_defaut.png}|image_passe_partout{32,32}|image_recadre{32,32}})]
]]
[(#GET{logo_doc}|oui)
#SET{icon_w,#GET{logo_doc}|extraire_attribut{src}|largeur}
#SET{icon_h,#GET{logo_doc}|extraire_attribut{src}|hauteur}
#SET{icon_anchorPoint,''}
[,"icon": (#GET{logo_doc}|extraire_attribut{src}|url_absolue|json_encode)],
"iconSize": [(#VAL{91}|chr)]#GET{icon_w},#GET{icon_h}[(#VAL{93}|chr)],
"iconAnchor": [(#VAL{91}|chr)][(#GET{icon_w}|div{2})],[(#GET{icon_h})][(#VAL{93}|chr)]
]}
}</BOUCLE_gis></BOUCLE_art>

11
json/gis_auteurs.html

@ -1,19 +1,20 @@
<BOUCLE_auteurs(AUTEURS){id_article ?}{id_auteur ?}{recherche ?}{0, #ENV{limit}}{","}><BOUCLE_gis(GIS){id_auteur}>
<BOUCLE_auteurs(AUTEURS){id_article ?}{id_auteur ?}{recherche ?}{0, #ENV{limit}}{","}><BOUCLE_gis(GIS){id_auteur}{","}>
{"type": "Feature",
"geometry": {"type": "Point", "coordinates": [#LON, #LAT]},
"id":"#ID_GIS",
"title":[(#TITRE|sinon{#_auteurs:NOM}|supprimer_numero|json_encode)],
"description":[(#DESCRIPTIF|json_encode)][(#SET{logo_doc,''})]
"description":[(#DESCRIPTIF|sinon{#_auteurs:BIO}|json_encode)][(#SET{logo_doc,''})]
[(#LOGO_GIS|oui)
[(#SET{logo_doc,#LOGO_GIS|image_passe_partout{28,28}|image_recadre{28,28}|image_recadre{32,32,center}})]]
[(#SET{logo_doc,#LOGO_GIS|image_passe_partout{32,32}|image_recadre{32,32}})]]
[(#LOGO_GIS|non)
[(#CHEMIN{images/marker_defaut.png}|oui)
[(#SET{logo_doc,#CHEMIN{images/marker_defaut.png}|image_passe_partout{28,28}|image_recadre{28,28}})]
[(#SET{logo_doc,#CHEMIN{images/marker_defaut.png}|image_passe_partout{32,32}|image_recadre{32,32}})]
]]
[(#GET{logo_doc}|oui)
#SET{icon_w,#GET{logo_doc}|extraire_attribut{src}|largeur}
#SET{icon_h,#GET{logo_doc}|extraire_attribut{src}|hauteur}
#SET{icon_anchorPoint,''}
[,"icon": (#GET{logo_doc}|extraire_attribut{src}|url_absolue|json_encode)],
"icon_size": [(#VAL{91}|chr)]#GET{icon_w},#GET{icon_h}[(#VAL{93}|chr)]
"icon_size": [(#VAL{91}|chr)]#GET{icon_w},#GET{icon_h}[(#VAL{93}|chr)],
"icon_anchor": [(#VAL{91}|chr)][(#GET{icon_w}|div{2})],[(#GET{icon_h})][(#VAL{93}|chr)]
]}</BOUCLE_gis></BOUCLE_auteurs>

11
json/gis_mots.html

@ -1,19 +1,20 @@
<BOUCLE_mots(MOTS){id_mot ?}{id_groupe ?}{id_article ?}{id_rubrique ?}{id_breve ?}{id_syndic ?}{id_forum ?}{recherche ?}{0, #ENV{limit}}{","}><BOUCLE_gis(GIS){id_mot}>
<BOUCLE_mots(MOTS){id_mot ?}{id_groupe ?}{id_article ?}{id_rubrique ?}{id_breve ?}{id_syndic ?}{id_forum ?}{recherche ?}{0, #ENV{limit}}{","}><BOUCLE_gis(GIS){id_mot}{","}>
{"type": "Feature",
"geometry": {"type": "Point", "coordinates": [#LON, #LAT]},
"id":"#ID_GIS",
"title":[(#TITRE|sinon{#_mots:TITRE}|supprimer_numero|json_encode)],
"description":[(#DESCRIPTIF|json_encode)][(#SET{logo_doc,''})]
"description":[(#DESCRIPTIF|sinon{#_mots:DESCRIPTIF}|json_encode)][(#SET{logo_doc,''})]
[(#LOGO_GIS|oui)
[(#SET{logo_doc,#LOGO_GIS|image_passe_partout{28,28}|image_recadre{28,28}|image_recadre{32,32,center}})]]
[(#SET{logo_doc,#LOGO_GIS|image_passe_partout{32,32}|image_recadre{32,32}})]]
[(#LOGO_GIS|non)
[(#CHEMIN{images/marker_defaut.png}|oui)
[(#SET{logo_doc,#CHEMIN{images/marker_defaut.png}|image_passe_partout{28,28}|image_recadre{28,28}})]
[(#SET{logo_doc,#CHEMIN{images/marker_defaut.png}|image_passe_partout{32,32}|image_recadre{32,32}})]
]]
[(#GET{logo_doc}|oui)
#SET{icon_w,#GET{logo_doc}|extraire_attribut{src}|largeur}
#SET{icon_h,#GET{logo_doc}|extraire_attribut{src}|hauteur}
#SET{icon_anchorPoint,''}
[,"icon": (#GET{logo_doc}|extraire_attribut{src}|url_absolue|json_encode)],
"icon_size": [(#VAL{91}|chr)]#GET{icon_w},#GET{icon_h}[(#VAL{93}|chr)]
"icon_size": [(#VAL{91}|chr)]#GET{icon_w},#GET{icon_h}[(#VAL{93}|chr)],
"icon_anchor": [(#VAL{91}|chr)][(#GET{icon_w}|div{2})],[(#GET{icon_h})][(#VAL{93}|chr)]
]}</BOUCLE_gis></BOUCLE_mots>

20
json/gis_rubriques.html

@ -0,0 +1,20 @@
<BOUCLE_rub(RUBRIQUES){id_rubrique ?}{id_secteur ?}{id_parent?=#ENV{id_parent}}{id_mot ?}{recherche ?}{0, #ENV{limit}}{","}><BOUCLE_gis(GIS){id_rubrique}{","}>
{"type": "Feature",
"geometry": {"type": "Point", "coordinates": [#LON, #LAT]},
"id":"#ID_GIS",
"title":[(#TITRE|sinon{#_rub:TITRE}|supprimer_numero|json_encode)],
"description":[(#DESCRIPTIF|sinon{#_rub:DESCRIPTIF}|json_encode)][(#SET{logo_doc,''})]
[(#LOGO_GIS|oui)
[(#SET{logo_doc,#LOGO_GIS|image_passe_partout{32,32}|image_recadre{32,32}})]]
[(#LOGO_GIS|non)
[(#CHEMIN{images/marker_defaut.png}|oui)
[(#SET{logo_doc,#CHEMIN{images/marker_defaut.png}|image_passe_partout{32,32}|image_recadre{32,32}})]
]]
[(#GET{logo_doc}|oui)
#SET{icon_w,#GET{logo_doc}|extraire_attribut{src}|largeur}
#SET{icon_h,#GET{logo_doc}|extraire_attribut{src}|hauteur}
#SET{icon_anchorPoint,''}
[,"icon": (#GET{logo_doc}|extraire_attribut{src}|url_absolue|json_encode)],
"icon_size": [(#VAL{91}|chr)]#GET{icon_w},#GET{icon_h}[(#VAL{93}|chr)],
"icon_anchor": [(#VAL{91}|chr)][(#GET{icon_w}|div{2})],[(#GET{icon_h})][(#VAL{93}|chr)]
]}</BOUCLE_gis></BOUCLE_rub>

2
lang/gis_en.php

@ -1,6 +1,6 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
// extrait automatiquement de http://www.spip.net/trad-lang/
// extrait automatiquement de https://www.spip.net/trad-lang/
// ** ne pas modifier le fichier **
if (!defined('_ECRIRE_INC_VERSION')) return;

11
lang/gis_fr.php

@ -15,7 +15,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'bouton_supprimer_lien' => 'Supprimer ce lien',
// C
'cfg_descr_gis' => 'Syst&egrave;me d\'Information G&eacute;ographique.<br /><a href="http://www.spip-contrib.net/3887">Accéder la documentation</a>.',
'cfg_descr_gis' => 'Syst&egrave;me d\'Information G&eacute;ographique.<br /><a href="https://contrib.spip.net/3887">Accéder la documentation</a>.',
'cfg_inf_adresse' => 'Affiche des champs suppl&eacute;mentaires d\'adresse (pays, ville, r&eacute;gion, adresse...)',
'cfg_inf_cloudmade' => 'Cette API n&eacute;cessite une cl&eacute; &agrave; cr&eacute;er sur <a href=\'@url@\'>le site de CloudMade</a>.',
'cfg_inf_geocoder' => 'Activer les fonctions du geocoder (recherche &agrave; partir d\'une adresse, r&eacute;cup&eacute;ration de l\'adresse &agrave; partir des coordonn&eacute;es).',
@ -34,10 +34,14 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'cfg_lbl_api_microsoft' => 'Microsoft Bing',
'cfg_lbl_api_openlayers' => 'OpenLayers',
'cfg_lbl_api_ovi' => 'Ovi Nokia',
'cfg_lbl_api_yahoo' => 'Yahoo',
'cfg_lbl_api_yandex' => 'Yandex',
'cfg_lbl_geocoder' => 'Geocoder',
'cfg_lbl_geolocaliser_user_html5' => 'Centrer la carte sur l\'emplacement de l\'utilisateur &agrave; la cr&eacute;ation',
'cfg_lbl_maptype' => 'Fond cartographique',
'cfg_lbl_maptype_carte' => 'Carte',
'cfg_lbl_maptype_hybride' => 'Hybride',
'cfg_lbl_maptype_relief' => 'Relief',
'cfg_lbl_maptype_satellite' => 'Satellite',
'cfg_titre_gis' => 'GIS',
// E
@ -47,6 +51,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'editer_gis_titre' => 'Les points g&eacute;olocalis&eacute;s',
'erreur_recherche_pas_resultats' => 'Aucun point ne correspond &agrave; la recherche.',
'explication_api_forcee' => 'L\'API est imposée par un autre plugin ou squelette.',
'explication_maptype_force' => 'Le fond cartographique est imposé par un autre plugin ou squelette.',
// F
'formulaire_creer_gis' => 'Cr&eacute;er un point g&eacute;olocalis&eacute; :',
@ -86,4 +91,4 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'zoom' => 'Zoom'
);
?>
?>

128
modeles/carte_gis.html

@ -4,35 +4,36 @@
Parametres :
- id_carte_gis = 1 id de la carte
- lat = 48.3 latitude du centre de la carte
- lon = -4.7 longitude du centre de la carte
- id_map|id_carte_gis = 1 id de la carte
- lat|latit|latitude = 48.3 latitude du centre de la carte
- lon|lonxit|longitude = -4.7 longitude du centre de la carte
- zoom = 5 zoom de la carte
- width = 100% largeur de la carte, 100% par defaut
- height = 400px hauteur de la carte, 400px par defaut
- width|largeur = 100% largeur de la carte, 100% par defaut
- height|hauteur = 400px hauteur de la carte, 400px par defaut
- style = non ne pas styler la carte
- zoom_molette = non désactiver le zoom avec la molette de la souris, actif par defaut
- zoom_molette|zoom_wheel = non désactiver le zoom avec la molette de la souris, actif par defaut
- type = carte type de la carte : carte, satellite, relief ou hybride
- control_zoom = large type de controles pour le zoom : large, small
- control_pan = non ne pas afficher les controles de déplacement dans la carte
- control_type = non ne pas afficher les controles de changement de type
- no_control = oui ne pas afficher les controles de la carte
- control_zoom|controle_zoom = large type de controles pour le zoom : large, small
- control_pan|controle_pan = non ne pas afficher les controles de déplacement dans la carte
- control_type|controle_type = non ne pas afficher les controles de changement de type
- no_control|aucun_controle = oui ne pas afficher les controles de la carte
- overview = oui afficher un mini carte de situation
- scale = oui afficher l'échelle de la carte
- limit = 500 nombre max de marqueurs à afficher, 500 par defaut
- limit|limite = 500 nombre max de marqueurs à afficher, 500 par defaut
- objets = gis type d'objets à afficher (fichier json/gis_xx qui génère la source de donnees)
- autocenterandzoom = oui centrer et zoomer la carte automatiquement pour afficher tous les marqueurs
- autocenterandzoom|centrer_auto = oui centrer et zoomer la carte automatiquement pour afficher tous les marqueurs
- kml = 12 kml à superposer à la carte (id_document ou url)
- localiser_visiteur = oui centrer la carte sur la position du visiteur (API geolocation HTML5)
- localize_visitor|localiser_visiteur = oui centrer la carte sur la position du visiteur (API geolocation HTML5)
- point = non si elle vaut "non" cette option n'affichera pas de points du tout (utile pour n'afficher qu'un kml par exemple)
]
[(#SET{width,#ENV{width,100%}})]
[(#SET{height,#ENV{height,400px}})]
[(#SET{id,#ENV{id_carte_gis,1}})]
[(#SET{width,#ENV{width,#ENV{largeur,100%}}})]
[(#SET{height,#ENV{height,#ENV{hauteur,400px}}})]
[(#SET{id,#ENV{id_carte_gis,#ENV{id_map,#ENV{id,1}}}})]
[(#REM) -- compat gis v1 -- ]
[(#SET{lat,#ENV{lat,#ENV{latit,#CONFIG{gis/lat,0}}}})]
[(#SET{lon,#ENV{lon,#ENV{lonxit,#CONFIG{gis/lon,0}}}})]
[(#SET{lat,#ENV{lat,#ENV{latit,#ENV{latitude,#CONFIG{gis/lat,0}}}}})]
[(#SET{lon,#ENV{lon,#ENV{lonxit,#ENV{longitude,#CONFIG{gis/lon,0}}}}})]
[(#REM)
// todo
@ -67,23 +68,30 @@ var map[(#GET{id})];
var init_map[(#GET{id})] = function() {
var map_container = 'map[(#GET{id})]';
$('#map[(#GET{id})]').empty();
map[(#GET{id})] = new mxn.Mapstraction(map_container,'[(#REM|gis_api_utilisee)]');
[(#ENV{zoom_molette}|!={non}|oui)
[(#ENV{zoom_molette,#ENV{zoom_wheel}}|!={non}|oui)
map[(#GET{id})].enableScrollWheelZoom();]
map[(#GET{id})].setCenterAndZoom(new mxn.LatLonPoint(#GET{lat},#GET{lon}),#ENV{zoom,#CONFIG{gis/zoom,0}});
[(#SET{maptype, #REM|gis_maptype_utilise})]
[(#ENV{type}|oui)
#SET{type,ROAD}
[(#ENV{type}|=={'carte'}|oui) #SET{type,ROAD} ]
[(#ENV{type}|=={'satellite'}|oui) #SET{type,SATELLITE} ]
[(#ENV{type}|=={'hybride'}|oui) #SET{type,HYBRID} ]
[(#ENV{type}|=={'relief'}|oui) #SET{type,PHYSICAL} ]
map[(#GET{id})].setMapType([mxn.Mapstraction.(#GET{type})]);
[(#ENV{type}|=={'carte'}|oui) #SET{maptype,ROAD} ]
[(#ENV{type}|=={'satellite'}|oui) #SET{maptype,SATELLITE} ]
[(#ENV{type}|=={'hybride'}|oui) #SET{maptype,HYBRID} ]
[(#ENV{type}|=={'relief'}|oui) #SET{maptype,PHYSICAL} ]
]
// Pour l'API Openlayers, la methode n'existe pas
try {
map[(#GET{id})].setMapType([mxn.Mapstraction.(#GET{maptype})]);
}
catch(err) {
;
}
[(#ENV{no_control}|!={oui}|oui)
[(#ENV{no_control,#ENV{aucun_controle}}|!={oui}|oui)
map[(#GET{id})].addControls({zoom: '[(#ENV{control_zoom,large})]'});]
[(#ENV{overview}|oui)
@ -92,34 +100,42 @@ var map[(#GET{id})];
[(#ENV{scale}|oui)
map[(#GET{id})].addControls({scale: true});]
[(#ENV{control_type}|!={non}|oui)
[(#ENV{control_type,#ENV{controle_type}}|!={non}|oui)
map[(#GET{id})].addControls({map_type: true});]
[(#ENV{control_pan}|!={non}|oui)
[(#ENV{control_pan,#ENV{contole_pan}}|!={non}|oui)
map[(#GET{id})].addControls({pan: true});]
jQuery.getJSON("[(#URL_PAGE{gis_json}|url_absolue)]",
{[
(#ENV{objet}|id_table_objet) : #ENV{id_objet},][
objets : "(#ENV{objets})",][
id_rubrique : (#ENV{id_rubrique}),][
id_secteur : (#ENV{id_secteur}),][
id_article : (#ENV{id_article}),][
id_breve : (#ENV{id_breve}),][
id_document : (#ENV{id_document}),][
id_mot : (#ENV{id_mot}),][
id_groupe : (#ENV{id_groupe}),][
id_auteur : (#ENV{id_auteur}),][
id_syndic : (#ENV{id_syndic}),][
id_forum : (#ENV{id_forum}),][
id_gis : (#ENV{id_gis}),][
recherche : "(#ENV{recherche})",][
limit : (#ENV{limit,500})]
},
[(#ENV{point}|!={non}|oui)
map[(#GET{id})].json_url = "[(#URL_PAGE{gis_json}|url_absolue)]";
map[(#GET{id})].json_args = {[
objets : "(#ENV{objets})",][
id_rubrique : (#ENV{id_rubrique}),][
id_secteur : (#ENV{id_secteur}),][
id_parent : (#ENV{id_parent}),][
id_article : (#ENV{id_article}),][
id_breve : (#ENV{id_breve}),][
id_document : (#ENV{id_document}),][
id_mot : (#ENV{id_mot}),][
id_groupe : (#ENV{id_groupe}),][
id_auteur : (#ENV{id_auteur}),][
id_syndic : (#ENV{id_syndic}),][
id_forum : (#ENV{id_forum}),][
id_gis : (#ENV{id_gis}),][
cluster : "(#ENV{cluster})",][
recherche : "(#ENV{recherche})",][
limit : (#ENV{limit,#ENV{limite,500}})]
};
[(#ENV{cluster}|non)
map[(#GET{id})].load.addHandler(function() { gis_load_json(map[(#GET{id})]); });
/*
jQuery.getJSON(map[(#GET{id})].json_url,
map[(#GET{id})].json_args,
function(data) {
if (data){
map[(#GET{id})].addJSON(data);
[(#ENV{autocenterandzoom}|oui)
[(#ENV{autocenterandzoom,#ENV{centrer_auto}}|oui)
var markers = map[(#GET{id})].markers;
if (markers.length == 1){
map[(#GET{id})].setCenterAndZoom(new mxn.LatLonPoint(markers[(#VAL{91}|chr)]0[(#VAL{93}|chr)].location.lat,markers[(#VAL{91}|chr)]0[(#VAL{93}|chr)].location.lon),#ENV{zoom,#CONFIG{gis/zoom,0}});
@ -128,8 +144,20 @@ var map[(#GET{id})];
}]
}
}
);
);*/]
[(#ENV{cluster}|oui)
map[(#GET{id})].cluster = true;[
map[(#GET{id})].cluster_icon = '(#CHEMIN{images/bg_cluster.png}|url_absolue)';]
]
// surveiller le changement de zoom et le déplacement dans la carte
map[(#GET{id})].changeZoom.addHandler(function() { gis_load_json(map[(#GET{id})]); });
map[(#GET{id})].endPan.addHandler(function() { gis_load_json(map[(#GET{id})]); });
]
[(#ENV{kml}|oui)
[(#ENV{kml}|intval|oui)
map[(#GET{id})].addOverlay(['(#ENV{kml}|generer_url_entite{document}|url_absolue)']);]
@ -137,7 +165,7 @@ var map[(#GET{id})];
map[(#GET{id})].addOverlay(['(#ENV{kml})']);]
]
[(#ENV{localiser_visiteur}|oui)
[(#ENV{localize_visitor,#ENV{localiser_visiteur}}|oui)
gis_get_navigator_location(map[(#GET{id})],#ENV{zoom,#CONFIG{gis/zoom,0}});]
}

7
modeles/carte_gis_preview.html

@ -12,6 +12,13 @@ var cloudmade_key = '#CONFIG{gis/api_key_cloudmade}';]
var map_preview_container = 'map_preview';
var marker;
map_preview = new mxn.Mapstraction(map_preview_container,'[(#REM|gis_api_utilisee)]');
// Pour l'API Openlayers, la methode n'existe pas
try {
map_preview.setMapType([mxn.Mapstraction.(#REM|gis_maptype_utilise)]);
}
catch(err) {
;
}
map_preview.addControls({
pan: true,

25
plugin.xml

@ -1,19 +1,20 @@
<plugin>
<nom>GIS</nom>
<auteur>b_b, kent1</auteur>
<version>2.0.7</version>
<version_base>2.0.2</version_base>
<version>2.1.1</version>
<version_base>2.0.3</version_base>
<licence>GNU/GPL</licence>
<etat>dev</etat>
<slogan>G&#233;olocaliser les objets SPIP</slogan>
<description>
<multi>
[fr]GIS2 mapstraction
[fr]GIS2 Mapstraction. Ce plugin permet d'attacher des points g&#233;olocalis&#233;s aux objets de SPIP afin de les afficher sur des cartes dans les pages de votre site.
_ Icone de [mattrich->http://mattrich.deviantart.com/art/Picnic-101256405] sous licence CC BY-NC-SA
[en]GIS2 mapstraction
[en]GIS2 Mapstraction
_ Icon from [mattrich->http://mattrich.deviantart.com/art/Picnic-101256405] under CC BY-NC-SA license
</multi>
</description>
<lien>http://www.spip-contrib.net/GIS2</lien>
<lien>https://contrib.spip.net/GIS-2-GIS-3</lien>
<prefix>gis</prefix>
<icon>images/gis.png</icon>
<options>gis_options.php</options>
@ -78,13 +79,13 @@ _ Icon from [mattrich->http://mattrich.deviantart.com/art/Picnic-101256405] unde
<nom>declarer_type_surnoms</nom>
<inclure>gis_pipelines.php</inclure>
</pipeline>
<utilise id="cfg" version="[1.12;]" />
<utilise id="selecteur_generique" version="[1.12;]" />
<necessite id="SPIP" version="[2.1.10;3.0.0-dev)" />
<necessite id="saisies" version="[1.7.1;]" />
<necessite id="spip_bonux" version="[1.8;]" />
<utilise id="cfg" version="[1.12.0;]" />
<utilise id="selecteurgenerique" version="[1.12.0;]" />
<necessite id="SPIP" version="[2.1.10;2.1.99]" />
<necessite id="saisies" version="[1.42.11;]" />
<necessite id="spip_bonux" version="[1.8.0;]" />
<necessite id="afficher_objets" version="[1.2.0;]" />
<necessite id="lib:h8e7f8b9b-mxn-2.0.17" src="https://github.com/downloads/mapstraction/mxn/mxn-2.0.17.zip" />
<necessite id="lib:mxn-gis-cluster-2.0.10" src="https://github.com/downloads/brunob/mxn/mxn-gis-cluster-2.0.10.zip" />
<categorie>divers</categorie>
<traduire gestionnaire="salvatore" module="gis" reference="fr" />
</plugin>
</plugin>

2
prive/exec/gis_editer_fonctions.php

@ -1,5 +1,7 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/presentation');
function gis_form_logo($id_gis){

2
prive/exec/gis_fonctions.php

@ -1,5 +1,7 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/presentation');
?>
Loading…
Cancel
Save