Skip to main content.

Mayo 10, 2007

Alternativa sencilla de localización de países

Necesitaba crear un mapa con puntos en diferentes países dependiendo de unas variables y para ello empecé a utilizar el geocoder de google mediante la api de google. Pero ahí cuando llegó el problema, necesitaba almacenar esa imagen de forma automática después de que fuera generada para insertarla en un documento en pdf que creaba con fpdf. Después de la pelea con google maps y su api, las keys y demás dí con una pequeña solución.
Tirando de la geocoder de google me creé una base de datos donde me guardaba la latitud y longitud en grados de cada país del mundo y de esta manera llamaría al país cuando quisiera y obtendría sus coordenadas. Hasta aquí bien, pero llego otro problema.
Los mapamundis del mundo más comunes o a los que más estamos acostumbrados no son de proporciones cartesianas, y al dibujar sobre la imagen de base en php, puntitos o banderitas, no coincidían en el eje vertical debido a la traducción proporcional de las coordenadas latitud y longitud a coordenadas x,y del mapa. Aunque después de buscar en google imágenes de mapas encontré uno que cuadraba a la perfección ya que los polos estaban deformados acia los lados para que coincidieran las coordenadas cartesianas.
Aquí dejo parte del código en php, la base de datos de los países y una pequeña imagen de muestra:


<?php
//conexion mysql
$link = mysql_connect("localhost","geocoder","1234") or die ("Unable to connect to SQL server");
mysql_select_db("geocoder",$link) or die ("Unable to select database");
Header("Content-type:image/jpeg");
//dibujo mapa mundi
$original="./mapa-mundi.png";
$tamano=getimagesize($original);
$orig_Ancho = $tamano[0];
$orig_Alto =$tamano[1];
$Ancho=$orig_Ancho;
$Alto=$orig_Alto;
$borde=0;
$importada=imagecreatefrompng($original);
$mapa=imagecreatetruecolor($Ancho,$Alto);
$fondo=imagecolorAllocate($mapa,255,255,200);
imagefill($mapa,0,0,$fondo);
$transparencia=imagecreatetruecolor($orig_Ancho, $orig_Alto);
$fondo1=imagecolorAllocate($transparencia,255,0,200);
imagefill($transparencia,0,0,$fondo1);
imagecolortransparent ($transparencia,$fondo1);
imagecopy($transparencia, $importada, 0, 0, 0, 0, $orig_Ancho, $orig_Alto);
imagecopymerge( $mapa , $transparencia, $borde , $borde , 0 , 0 ,$orig_Ancho, $orig_Alto ,60 );
$bandera=imagecreatefrompng("./redflag.png"); //imagen de la banderita roja.
/*___________Funciones___________________*/
//Dibuja una bandera con texto al lado pasandole la latitud y la longitud y texto
function coorflag($texto,$lat,$long,$Ancho,$Alto,&$mapa){
$rojo = ImageColorAllocate($mapa,0,0,0); //color texto
$fuente = "./Verdana.ttf"; //fuente texto
$x=($long+180)*$Ancho/360; //x en proporcion de longitud
$y=(($lat-85)*(-1)*($Alto))/170; //y en proporcion de latitud
$bandera=imagecreatefrompng("./redflag.png"); //imagen de la bandera roja
imagecopyresized($mapa,$bandera,$x-9,$y-30,0,0,30,30,258,274);//dibuja la bandera
//imagettftext($mapa,8,0,$x-9,$y+1,$rojo,$fuente,$texto);//dibuja el texto
//imageSmoothLine($mapa,$res['x'][$i]-5,$posY, $res['x'][$i]-5, $posY-$altura, $cColor);
//imageSmoothLine($mapa,0,0,0,0,$rojo);
if ($x <= $Ancho/2 && $y <= $Alto/2) $i=0;
else $i=1;
}
//Dibujando banderitas, con este ejemplo la pintamos todas.
$sql = 'SELECT pais, latitude , longitude from paises';
$query = mysql_query($sql);
while ($linea = mysql_fetch_array($query, MYSQL_ASSOC)) {
coorflag($linea[pais],$linea[latitude],$linea[longitude],$Ancho,$Alto,$mapa);
}
imagepng($mapa);
ImageDestroy();
?>

Esta es la imágen resultante.

mapa

El dump de la base de datos:

paises_mundo_mas_prefijos_posibles.sql

La imagen del mapa sin banderitas:

mapa-mundi.png

Posted by lander in php, fpdf, mapas, google maps

Deje un comentario

XHTML: Puede emplear estos tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

2005 © Irontec S.L. :: Powered by Irontec & Wordpress
[ IRONTEC S.L. - C.I.F. B-95274890 ]
[ Ribera de Axpe 11, A - 116 ]
[ 48950 - Erandio - Bilbao - Bizkaia ]