Creando mapas con el plugin de OSM y la información del plugin mygeoposition


 

Una de las cosas que llevo tiempo intentando crear en este blog son mapas que contengan toda la información georeferenciada de las entradas.  En concreto quería poder encontrar fácilmente las rutas de senderismo que he ido recopilando. Por fin lo he conseguido y estrenamos el Mapa de rutas de senderismo hace unos días.

He tenido que recurrir a varios plugins de WordPress (Open Street Map y Mygeoposition) ya que no conseguía encontrar ninguno que hiciese todo lo que yo quería.

  • Plugin OSM: Realmente espectacular en cuanto a la capacidad de crear mapas. En cuanto se supera el pánico a los Shortcodes de WordPress da grandes capacidades de visualización de información georeferenciada. En particular me interesaba el poder representar ficheros GPX sin tener que recurrir a Wikilok. Lo que me echó para atrás la primera vez fue que la forma de geolocalizar los post es muy pedestre, hay que buscarla en un micromapa a mano.
  • Mygeoposition: Fué el primero que adopté, Lo primero no usaba shortcodes, me costó cogerles el tranquillo, después el mecanismo de geolocalizar el post es muy fácil tiene un buscador muy cómodo y después soluciona todo el tema de microdatos y geometadatos que debería mejorar el posicionamiento en buscadores. El problema es que es muy limitado en cuanto a la representación de datos en mapas.

 

Muy a mi pesar he tenido que modificar el plugin de OSM, incluyendo una sección que cree mapas de post georeferenciados a partir de los metadatos de Mygeoposition. 

Lo primero fue entender como almacenaban los datos cada plugin.

  • OSM es muy fácil ya que en la tabla de metadatos de WordPress crea un registro (OSM_geo_data) con las coordenadas separadas por ',' si el post estuviese geoposicionado.
  • Mygeo  es mas complicado ya que almacena, para todos los post, los metadatos en un único campo (con etiqueta mygpGeotagsGeoMetatags) al mas puro estilo de una matriz, las coordenadas se almacenan en la etiqueta  'position' y el separador de la longitud y latitus es un ';'.

 

Ahora rebuscamos dentro del código del plugin de OSM la función que importa los geopost y los representa en un mapa. Se importa información prevenientes de distintos plugins, pero todos estan sin mantenimiento, así que lo mas fácil es buscar la forma en que se importan los datos que genera el propio plugin de OSM (con la etiqueta osm_l) y copiar – adaptar – pegar el código. La ventaja de hacerlo así es que mantiene todas las caracteristicas de la importación con el código osm_l. A grandes rasgos lo que he hecho es:

  • En la function createMarkerList incluir una nueva sección que importe el nuevo código (mygeo), lo hacemos importando otro fichero osm-import.php que será donde incluyamos esta información. Lo hacemos así por mantener la coherencia con como está escrito el código.
  • En la function getImportLayer incluir una nueva sección que indique las condiciones en las que aparecen los marcadores en el mapa.
  • En osm-import.php incluir el código que carga la información de mygeoposition y la representa en el mapa. Básicamente era la copia de la importación que se hace de osm_l,  hacer que cargue los datos de la etiqueta mygpGeotagsGeoMetatags (seleccionando los datos de 'position' y usando como separador ';' en vez de ',') e incluir algún ajustillo estético como que no aparezca el nombre de la categoría delante del título del post.

 

El código se puede descargar en Cambios OSM php o lo podéis ver en la tabla adjunta

 

Cambios en plugin OSM

En Osm.php cambiar la función createMarkerList incluyendo
     else if ($a_import == 'mygeo'){
       $this->traceText(DEBUG_INFO, "Requesting data from MYGEO – Plugin");
       include('osm-import.php');
     }
En Osm.php cambiar la función getImportLayer incluyendo
 // import data from mygeo
    else if ($a_type  == 'mygeo'){
      $LayerName = 'TaggedPosts';
      $PopUp = 'true';
    }
En osm_import.php incluir en el if inmenso
else if ($a_import == 'mygeo'){
       // let's see which posts are using our geo data …
       $this->traceText(DEBUG_INFO, "check all posts for mygeo custom fields");
       $CustomFieldName = 'mygpGeotagsGeoMetatags';
       $recentPosts = new WP_Query();
       $recentPosts->query('meta_key='.$CustomFieldName.'&post_status=publish'.'&showposts=-1'.'&post_type='.$a_post_type.'');
       while ($recentPosts->have_posts()) : $recentPosts->the_post();
         $Data = get_post_meta($post->ID, $CustomFieldName, true);
         // remove space before and after comma
         $Data[ ‘position’ ] = preg_replace(‘/\s*,\s*/’, ‘,’,$Data[ ‘position’ ]);
        
        // get pairs of coordination
         $GeoData_Array = explode( ' ', $Data[ ‘position’ ] );
        list($temp_lat, $temp_lon) = explode(';', $GeoData_Array[0]); 
         //echo $post->ID.'Lat: '.$temp_lat.'Long '.$temp_lon.'<br>';
         // check if a filter is set and geodata are set
         // if filter is set and set then pretend there are no geodata
       if (($a_import_osm_cat_incl_name  != 'Osm_All' || $a_import_osm_cat_excl_name  != 'Osm_None' || $a_import_osm_custom_tax_incl_name != 'Osm_All')&&($temp_lat != '' && $temp_lon != '')){
         $categories = wp_get_post_categories($post->ID);
         foreach( $categories as $catid ) {
           $cat = get_category($catid);
           if (($a_import_osm_cat_incl_name  != 'Osm_All') && (strtolower($cat->name) != (strtolower($a_import_osm_cat_incl_name)))){
             $temp_lat = '';
             $temp_lon = '';
            }
            if (strtolower($cat->name) == (strtolower($a_import_osm_cat_excl_name))){
              $temp_lat = '';
              $temp_lon = '';
            }
         }    
         if ($a_import_osm_custom_tax_incl_name != 'Osm_All'){ // get rid of  Invalid argument supplied for foreach()
           $mycustomcategories = get_the_terms( $post->ID, $a_import_osm_custom_tax_incl_name);
           foreach( $mycustomcategories as $term ) {
             $taxonomies[0] = $term->term_taxonomy_id;
             // Get rid of the other data stored in the object
             unset($term);
           }
           foreach( $taxonomies as $taxid ) {
             $termsObjects = wp_get_object_terms($post->ID, $a_custom_taxonomy);
             foreach ($termsObjects as $termsObject) {
               $currentCustomCat[] = $termsObject->name;
             }
             if (($a_import_osm_custom_tax_incl_name  != 'Osm_All') &&  ! in_array($a_import_osm_custom_tax_incl_name, $currentCustomCat)) {
               $temp_lat = '';
               $temp_lon = '';
             }
             if (strtolower($currentCustomCat) == (strtolower($a_import_osm_cat_excl_name))){
               $temp_lat = '';
               $temp_lon = '';
             }
           }
         }
       }
       if ($temp_lat != '' && $temp_lon != '') {
           list($tag_lat, $tag_lon) = explode(';', $GeoData_Array[0]); 
           list($tag_lat, $tag_lon) = $this->checkLatLongRange('$marker_all_posts',$tag_lat, $tag_lon);
           $categories = wp_get_post_categories($post->ID);
            // take the last one but ignore those without a specific category
           foreach( $categories as $catid ) {
         $cat = get_category($catid);
             if ((strtolower($cat->name) == 'uncategorized') || (strtolower($cat->name) == 'allgemein')|| (strtolower($cat->name) == 'sin categoría')){
               $Category_Txt = '';
             }
             else{
               $Category_Txt = $cat->name.': ';
             }
           }
           $Marker_Txt = '<a href="'.get_permalink($post->ID).'">'.get_the_title($post->ID).'  </a><br>';
           // $Marker_Txt = '<a href="'.get_permalink($post->ID).'">'.$Category_Txt.get_the_title($post->ID).'  </a><br>';
           $Marker_Txt .= get_the_excerpt($post->ID);
           $MarkerArray[] = array(‘lat’=> $tag_lat,’lon’=>$tag_lon,’popup_height’=>’100’, ‘popup_width’=>’150’, ‘marker’=>$Icon[name], 'text'=>$Marker_Txt, 'Marker'=>$PostMarker);
        }
       $this->traceText(DEBUG_INFO, "Found Marker ".count($MarkerArray));  
       endwhile;
     }

 

Actualización – Versión 3.5.5

Con los cambios de las últimas versiones lo que indicaba ha dejado de funcionar. Ahora he pasado la función que se incluía en osm_import.php la he metido en osm.php y hay que sustituir $this->checkLatLongRange$this->traceText por dos nuevas funciones que son  Osm::checkLatLongRange y Osm::traceText

 

Compartir
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *