•  » Plugins
  •  » [MOD] Auto-sitemap Géographique

#1 2010-06-22 14:46:36

h2o
Membre
2005-01-30
110

[MOD] Auto-sitemap Géographique

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

Code:

<?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

Code:

<?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.


?>

Saint-Amans des Cots: http://viadene.free.fr  (Piwigo)
Datacombes - Album photo: http://www.datacombes.com/photos (Piwigo)
Famille Palier - http://www.palier.org

Hors ligne

#2 2010-06-22 15:14:39

VDigital
Former Piwigo Team
Paris (FR)
2005-05-04
15124

Re: [MOD] Auto-sitemap Géographique

Très intéressante idée... (à tester au besoin sur plusieurs sites).
Merci.


Vincent -« Plus vidéaste averti que photographe amateur... »
La galerie - Le blog   

Piwigo est une application libre de gestion de photos en ligne.

Hors ligne

#3 2010-06-23 20:49:13

Gotcha
Equipe Piwigo
Pierrelatte (26)
2007-03-14
13331

Re: [MOD] Auto-sitemap Géographique

Intéressant :-)

Merci h2o


Ayez comme premier réflexe de consulter le wiki.
Ensuite, veuillez effectuer une recherche sur le forum avant de poser votre question.

LE FAIRE EST LE REVELATEUR DE L'ETRE

Hors ligne

  •  » Plugins
  •  » [MOD] Auto-sitemap Géographique

Pied de page des forums

Propulsé par FluxBB

github twitter facebook newsletter Faire un don Piwigo.org © 2002-2019 · Contact