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.

El dump de la base de datos:
paises_mundo_mas_prefijos_posibles.sql
La imagen del mapa sin banderitas:
Posted by lander in php, fpdf, mapas, google maps



