Dynamic Google Maps circle markers/icons with PHP

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:
DefaultAZ110PQ69%BEΩ$
(Have a look at the image name)

Now that gets a little boring, how about some color:
DefaultAZ110PQ69%BEΩ$
(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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?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 ‘$’.


Posted

in

by

Tags: