A while back I posted on how to create dynamic Google maps markers which allow for any colour and any text in the classic Google map style.
Recently, I have had a need to do the same with circular markers. It uses the ‘Image Smooth Arc‘ function provided by Ulrich Mierendorff.
Similarly, I provide a little demo of some PHP code that does this that I quickly whipped up. Here are some example markers:
(Have a look at the image name)
Now that gets a little boring, how about some color:
(Again, have a look at the image name)
Again, you will need to download the modified arial font and host it in the same directory.
Have a look at the PHP source code below:
<?php include ("imageSmoothArc_optimized.php"); $color = $_GET['color']; if (!$color) {$color = "ff776b";} //default google map color $color = str_replace("#", "", $color); $string = $_GET['text']; $font = realpath('arial.ttf'); //unfortunately we still must do some offsetting switch (ord(substr($string,0,1))) { case 49: //1 $offset = -2; break; case 55: //7 $offset = -1; break; case 65: //A $offset = 1; break; case 74: //J $offset = -1; break; case 84: //T $offset = 1; break; case 99: //c $offset = -1; break; case 106: //j $offset = 1; break; } if (strlen($string) == 1) { $fontsize = 10.5; } else if (strlen($string) == 2) { $fontsize = 9; } else { $fontsize = 10.5; $offset = 0; //reset offset $string = chr(149); } $bbox = imagettfbbox($fontsize, 0, $font, $string); $width = $bbox[2] - $bbox[0] + 1; $height = $bbox[1] - $bbox[7] + 1; $im = imagecreatetruecolor(20, 20); //add the alpha $trans_colour = imagecolorallocatealpha($im, 0, 0, 0, 127); imagefill($im, 0, 0, $trans_colour); imageAlphaBlending($im, true); imageSaveAlpha($im, true); $bord_ellipse = array (0, 0, 0, 0); imageSmoothArc($im, 9, 10, 17, 17, $bord_ellipse, 0, 2*M_PI); //x, y, width, hegiht $fill_ellipse = array (hexdec(substr($color,0,2)), hexdec(substr($color,2,2)), hexdec(substr($color,4,2)), 0); imageSmoothArc($im, 9, 10, 16, 16, $fill_ellipse, 0, 2*M_PI); //x, y, width, hegiht $black = imagecolorallocate($im, 0, 0, 0); imagettftext($im, $fontsize, 0, 11 - $width/2 + $offset, 9 + $height/2, $black, $font, $string); header("Content-type: image/png"); imagepng($im); imagedestroy($im); ?>
EDIT: 8 September 2014
Fixed a “Call-time pass-by-reference has been removed” error with ‘imageSmoothArc_optimized.php’. If you are experiencing the same with imageSmoothArc simple replace all instances of ‘&$’ with ‘$’.
Leave a Reply