Salut tous,
un autre petit projet personnel mais qui peux vous interesser:
Un script placé à la racine de votre site Piwigo va creer un "Sitemap Géographique".
google a écrit:
Les sitemaps géographiques sont une extension du protocole Sitemap. Ils vous permettent de publier du contenu géospatial et de l'envoyer à Google pour l'inclure dans Google Earth et dans Google Maps.
Il faut bien sur que vous utilisiez le très bon plugin RV MAP & EARTH de rvlices pour donner des coordonnées géographiques à vos photos.
Pour ça j'ai codé deux scripts fait maison:
- un générateur de flux RSS au format 'georss' qui va fournir un flux de donné sur les images et leurs coordonnés PAR CATEGORIE (c'est mon choix).
- un générateur de sitemap au format XML qui va fournir la liste des flux GEORSS du site.
Il suffit après de fournir à google l'emplacement (URL) de ce générateur de sitemap.
J'ai fait des essais avec google, je n'ai pas d'erreur de syntaxe, maintenant le temps me dira si ça marche.
Exemple de rendu du flux RSS d'une page d'un de mes sites dans googlemap:
http://maps.google.fr/maps?hl=fr&ta … php?cat=19
Exemple de fichier XML géographique:
http://viadene.free.fr/autositemapgeo.php
Voila les deux codes, à améliorer très certainement.
La config se fait directement dans les fichiers pour l'instant tant que je met au point et que je test, en attendant que je place ça dans un fichier externe (et modifiable via un plugin ?)
georss.php
<?php /*********************************************** * * Titre: Générateur de flux RSS Géographique * fichier: georss.php * Version: Beta 0.5 * * dev: h2o pour Piwigo * * Commentaire: fabrique un flux RSS de coordonées géographiques * par catégorie de votre site Piwigo * * Utilisation: georss.php/cat=[id_de_votre_galerie] * ***********************************************/ /********************************************************************************************** * * <rss version="2.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:dc="http://purl.org/dc/elements/1.1/"> * <channel> * <title>USGS M5+ Earthquakes</title> * <description>Real-time, worldwide earthquake list for the past 7 days</description> * <link>http://earthquake.usgs.gov/earthquakes/</link> * <dc:publisher>U.S. Geological Survey</dc:publisher> * <pubDate>Sun, 20 Jun 2010 10:32:57 GMT</pubDate> * <item> * <pubDate>Sat, 19 Jun 2010 10:00:50 GMT</pubDate> * <title>M 5.0, Hokkaido, Japan region</title> * <description>June 19, 2010 10:00:50 GMT</description> * <link>http://earthquake.usgs.gov/earthquakes/recenteqsww/Quakes/us2010xsaq.php</link> * <geo:lat>41.4052</geo:lat> * <geo:long>142.4668</geo:long> * <dc:subject>5</dc:subject> * <dc:subject>pastweek</dc:subject> * <dc:subject>35.20 km</dc:subject> * <guid isPermaLink="false">us2010xsaq</guid> * </item> * <item> * ... répétition ... * </item> * </channel> * </rss> * * doc: http://fr.wikipedia.org/wiki/GeoRSS * ************************************************************************************************/ //--------------------------------------------------------------------- include define('PHPWG_ROOT_PATH','./'); include_once( PHPWG_ROOT_PATH.'include/common.inc.php' ); $geo = new georss(); // adresse du site Piwigo $geo->site_url = "http://" . $_SERVER['HTTP_HOST']; if(dirname($_SERVER['SCRIPT_NAME']) != "/") {$geo->site_url .= dirname($_SERVER['SCRIPT_NAME']); } $geo->categorie['dc_publisher'] = "Franck 'h2o'"; // le redacteur de la publication /* Format des URLs (a adapater en fonction de votre config) -------------------------------------*/ $geo->str_loc['link'] = $geo->site_url . '/index/category/%d-%s'; // lien vers la catégorie $geo->str_loc['item_link'] = $geo->site_url . '/picture/%d-%s/category/%d-%s'; // lien vers la page de l'image' /* Variable ------------------------------------------------*/ /* Balises (avec formatage pour code source) ------------------------------------------------*/ $geo->str_balise['rss'] = "<rss version=\"2.0\" xmlns:geo=\"http://www.w3.org/2003/01/geo/wgs84_pos#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\r%s</rss>"; $geo->str_balise['channel'] = "<channel>\r%s</channel>"; $geo->str_balise['title'] = "\t<title>%s</title>\r"; $geo->str_balise['description'] = "\t<description>%s</description>\r"; $geo->str_balise['link'] = "\t<link>%s</link>\r"; $geo->str_balise['dc_publisher'] = "\t<dc:publisher>%s</dc:publisher>\r"; $geo->str_balise['pubDate'] = "\t<pubDate>%s</pubDate>\r"; $geo->str_balise['item'] = "\t<item>\r%s\t</item>\r"; $geo->str_balise['item_pubDate'] = "\t\t<pubDate>%s</pubDate>\r"; $geo->str_balise['item_title'] = "\t\t<title>%s</title>\r"; $geo->str_balise['item_description'] = "\t\t<description><![CDATA[%s]]></description>\r"; $geo->str_balise['item_link'] = "\t\t<link>%s</link>\r"; $geo->str_balise['item_geo_lat'] = "\t\t<geo:lat>%s</geo:lat>\r"; $geo->str_balise['item_geo_long'] = "\t\t<geo:long>%s</geo:long>\r"; $geo->str_balise['item_dc_subject'] = "\t\t<dc:subject>%s</dc:subject>\r"; $geo->str_balise['item_guid'] = "\t\t<guid isPermaLink=\"false\">%s</guid>\r"; /* GET & POST -------------------------------------------------*/ if($_GET['cat']) { $geo->categorie['id'] = $_GET['cat']; } else { $geo->categorie['id'] = 19; } /* lecture de la ddb pour la catégorie */ $query = 'SELECT * FROM '.CATEGORIES_TABLE; $result = pwg_query($query); while ($row = pwg_db_fetch_assoc($result)) { $data[$row['id']] = $row; } foreach($data AS $key => $value) { if($key == $geo->categorie['id'] ) { $d = explode(',', $value['uppercats']); foreach($d AS $v) { if(empty($geo->categorie['title'])){ $geo->categorie['title'] = $data[$v]['name']; } else { $geo->categorie['title'] .= " - " . $data[$v]['name']; } } // end foreach $geo->categorie['description'] = $value['comment']; } } // end foreach // print_r($data); /* lecture de la base de donnée pour les images ------------------------------------*/ $query = 'SELECT i.id, i.lon AS longitude, i.lat AS latitude, i.id AS image_id, i.name AS title, i.path, i.comment AS description, i.date_available AS pubdate FROM '.IMAGES_TABLE.' i LEFT JOIN '.HISTORY_TABLE.' h ON h.image_id = i.id, '.IMAGE_CATEGORY_TABLE.' ic LEFT JOIN '.CATEGORIES_TABLE.' c ON c.id = ic.category_id WHERE c.id = '. $geo->categorie['id'] .' AND i.id = ic.image_id AND i.lon IS NOT NULL AND i.lat IS NOT NULL AND c.status = "public" GROUP BY i.id'; $result = pwg_query($query); while ($row = pwg_db_fetch_assoc($result)) { $geo->image[$row['id']] = $row; $geo->categorie['pubdate'] = $geo->maxidate($row['pubdate']); } // print_r($geo->image); /* Mots clef classé dans un tableau id, image_id, motclef; ---------------------------------*/ $query = 'SELECT it.image_id, t.name FROM '.IMAGE_TAG_TABLE.' it LEFT JOIN '.TAGS_TABLE.' t ON t.id = it.tag_id'; $result = pwg_query($query); while ($row = pwg_db_fetch_assoc($result)) { $geo->tag[] = $row; } // print_r($geo->tag); /* affichage balise ---------------------------------*/ $geo->make_rss(); // formatage du rss $geo->echo_rss(); // envois à l'affichage /* class -------------------------------------*/ class georss { var $str_balise = array(); // string des balises var $image = array(); // info sur les images var $categorie = array(); // info sur la catégorie var $str_header; var $str_rss; var $tag = array(); /* fabrique une balise formaté */ function make_balise($type, $value) { return sprintf($this->str_balise[$type], $value); } /* fabrique une URL formatée pour <loc>...</loc> */ function make_loc($type,$image_id = '') { if($type == 'link') { return sprintf($this->str_loc[$type], $this->categorie['id'], str2url($this->categorie['title'])); } if($type == 'item_link') { return sprintf($this->str_loc[$type], $image_id, str2url($this->image[$image_id]['title']), $this->categorie['id'], str2url($this->categorie['title'])); } } /* Fabrication du rss */ function make_rss() { $str = ''; $str .= $this->make_balise('title', $this->categorie['title']); $str .= $this->make_balise('description',$this->categorie['description']); $str .= $this->make_balise('link', $this->make_loc('link')); $str .= $this->make_balise('dc_publisher', $this->categorie['dc_publisher']); $str .= $this->make_balise('pubDate', $this->categorie['pubdate'] ); // les blocs <item> foreach($this->image AS $value) { $item = $this->make_balise('item_pubDate', $value['pubdate']); $item .= $this->make_balise('item_title', $value['title']); $item .= $this->make_balise('item_description', $this->make_description($value['description'], $this->make_image_loc($value['path'], true), $this->make_loc('item_link', $value['id']))); $item .= $this->make_balise('item_link', $this->make_loc('item_link', $value['id'])); $item .= $this->make_balise('item_geo_lat', $value['latitude']); $item .= $this->make_balise('item_geo_long', $value['longitude']); foreach($this->tag AS $tag){ if($tag['image_id'] == $value['id']) { $item .= $this->make_balise('item_dc_subject', $tag['name']); } } $str .= $this->make_balise('item',$item); } $str = $this->make_balise('channel',$str); $this->str_rss = $this->make_balise('rss',$str); } // fin make_rss() /* envois à l'affichage */ function echo_rss() { echo $this->str_rss; } /* calcul la date maxi */ function maxidate($date) { if($date > $geo->categorie['pubdate'] ) { return $date; } return $geo->categorie['pubdate']; } function make_description($description, $url_image, $url_picture) { $str = "<p><a href=\"".$url_picture."\"><img src=\"".$url_image."\" /></a></p>"; $str .= "<p>".$description."</p>"; return $str; } /* fabrique une URL formatée pour lien direct vers une image ou une imagete */ function make_image_loc($path, $tn = false) { if($tn) { // lien vers la vignette // recuperation du nom du fichier $file = basename($path); $dir = dirname(substr($path, 1)); return $this->site_url.$dir."/thumbnail/TN-".$file; } return $this->site_url . substr($str, 1); } } // fin de la class ?>
autositemapgeo.php
<?php /******************************************************************* * * Titre: générateur de sitemap Géolocalisation pour Piwigo * fichier: autositemapgeo.php * Version: beta 0.2 * * dev: h2o pour Piwigo * * Commentaire: Cette page va generer automatiquement * un sitemap au format XML utilisé par google pour renseigner * les programes Google Earth et Google Maps * Cela sous-entant que vous devez utiliser * le Plugin RV Maps & Earth de rvelices * http://fr.piwigo.org/ext/extension_view.php?eid=122 * * Le programe utilise le fichier georss.php. * * doc: http://www.sitemaps.org/fr * * http://code.google.com/intl/fr-FR/apis/kml/documentation/mapsSupport.html * http://code.google.com/intl/fr-FR/apis/kml/documentation/kmlSearch.html * ********************************************************************/ /******************************************************************** * Exemple de format xmlpour fichier de geolicalisation (Doc Google) * * <?xml version="1.0" encoding="UTF-8"?> * <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" * xmlns:geo="http://www.google.com/geo/schemas/sitemap/1.0"> * <url> * <loc>http://www.example.com/feeds/example3.xml</loc> * <geo:geo> * <geo:format>georss</geo:format> * </geo:geo> * </url> * <url> * ... répétition ... * </url> * </urlset> * </xml> * *********************************************************************/ //--------------------------------------------------------------------- include define('PHPWG_ROOT_PATH','./'); include_once( PHPWG_ROOT_PATH.'include/common.inc.php' ); $xml = new googlegeoxml; /* Variables ------------------------------------*/ // adresse du site Piwigo $xml->site_url = "http://" . $_SERVER['HTTP_HOST']; if(dirname($_SERVER['SCRIPT_NAME']) != "/") {$xml->site_url .= dirname($_SERVER['SCRIPT_NAME']); } /* Format des URLs (a adapater en fonction de votre config) -------------------------------------*/ $xml->str_loc['category'] = $xml->site_url . '/index/category/%d-%s'; $xml->str_loc['georss'] = $xml->site_url . '/georss.php?cat=%d'; // emplacement du fichier georss.php /* format des balises XML --------------------------------------*/ $xml->str_balise['xml'] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r%s"; $xml->str_balise['urlset'] = "<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns:geo=\"http://www.google.com/geo/schemas/sitemap/1.0\">\r%s</urlset>"; $xml->str_balise['url'] = "\t<url>\r%s\t</url>\r"; $xml->str_balise['loc'] = "\t\t<loc>%s</loc>\r"; $xml->str_balise['geo_geo'] = "\t\t<geo:geo>\r%s\t\t</geo:geo>\r"; $xml->str_balise['geo_format'] = "\t\t\t<geo:format>%s</geo:format>\r"; /* recherche dans la ddb des catégories avec coordonées ---------------------------------------*/ $query = 'SELECT ic.category_id FROM '.IMAGES_TABLE.' i LEFT JOIN '.IMAGE_CATEGORY_TABLE.' ic ON ic.image_id = i.id WHERE i.lon IS NOT NULL AND i.lat IS NOT NULL'; $result = pwg_query($query); while ($row = pwg_db_fetch_assoc($result)) { $xml->cat_id[$row['category_id']] = $row['category_id']; } /* affichage balise ---------------------------------*/ $xml->make_xml(); // formatage du xml $xml->echo_xml(); // envois à l'affichage /* class -------------------------------------*/ class googlegeoxml { var $str_balise = array(); // string des balises var $str_xml; var $cat_id = array(); /* formatage du XML */ function make_xml() { $str = ""; foreach($this->cat_id AS $cat_id) { $localisation = sprintf($this->str_balise['loc'], sprintf($this->str_loc['georss'], $cat_id)); $geoformat = sprintf($this->str_balise['geo_format'], 'georss'); $geo_geo = sprintf($this->str_balise['geo_geo'], $geoformat); $str .= sprintf($this->str_balise['url'], $localisation.$geo_geo); } $urlset = sprintf($this->str_balise['urlset'], $str); $this->str_xml = sprintf($this->str_balise['xml'], $urlset); } // fin make_xml /* envois à l'affichage */ function echo_xml() { header("Content-Type: text/xml; charset=UTF-8"); echo $this->str_xml; } } // fin de la class, c'est l'heure de la récrée. ?>
Hors ligne
Très intéressante idée... (à tester au besoin sur plusieurs sites).
Merci.
Hors ligne
Intéressant :-)
Merci h2o
Hors ligne