Рисование карты России:
<?php
// Ширина и высота изображения
$W=500;
$H=375;
// Функция выводит контуры региона и закрашивает его внутреннюю часть
// $im - идентификатор изображения
// $filename - имя файла содержащего контур региона
(в формате
// Adobe Illustrator
// $maxw - максимальное значение координаты X в файле с контурами
// России (необходимо для того, чтобы все регионы
// рисовались с одним масштабом)
// $maxh - максимальное значение координаты
Y в файле с контурами
// России
// $color - цвет, в который будет закрашиваться регион
function DrawIllustratorFile($im,$filename,$maxw,$maxh,$color) {
GLOBAL $W,$H;
// Чтения файла
$d=file($filename);
// Если массив
$d содержит только один элемент,
// то в качестве переноса строк используется символ
// возврата каретки, и нам необходимо разбить текст
// на строку вручную
if (count($d)==1) $d=explode("\r",$d[0]);
// С помощью регулярного выражение выберем координаты
// всех точек.
$poly=Array();
for ($i=0;$i<count($d);$i++)
if (eregi("([0-9.]+) ([0-9.]+) [lm]",$d[$i],$r)) {
$poly[]=$r[1];
$poly[]=$r[2];
}
for ($i=0;$i<count($poly);$i+=2) {
// Нормализуем координаты
$poly[$i]/=$maxw;
$poly[$i+1]/=$maxh;
// Если массив $d содержит только один элемент,
// то в качестве переноса строк
используется символ
// возврата каретки, и нам необходимо разбить текст
// на строку вручную
if (count($d)==1) $d=explode("\r",$d[0]);
// С помощью регулярного выражение выберем координаты
// всех точек и найдем точки с самыми большими координатами.
// Эти
значения нам понадобятся для нормализации.
$maxw=$maxh=0;
for ($i=0;$i<count($d);$i++)
if (eregi("([0-9.]+) ([0-9.]+) [lm]",$d[$i],$r)) {
if ($maxw<$r[1]) $maxw=$r[1];
if ($maxh<$r[2]) $maxh=$r[2];
}
// С помощью регулярного выражение
выберем координаты
// всех полигонов. Формат Adobe Illustrator, прост,
// при условии использования прямых линий
$points=Array();
$num=-1;
for ($i=0;$i<count($d);$i++) {
// Первая точка в полигоне
if (eregi("([0-9.]+) ([0-9.]+) [m]",$d[$i],$r))
{
$num++;
$points[$num][]=$r[1];
$points[$num][]=$r[2];
}
// Не первая точка в полигоне
if (eregi("([0-9.]+) ([0-9.]+) [l]",$d[$i],$r)) {
$points[$num][]=$r[1];
$points[$num][]=$r[2];
}
}
// Создадим
изображение и выделим цвета
header ("Content-type: image/png");
$im = imagecreatetruecolor($W, $H);
$bg = imagecolorallocate($im, 255, 255, 255);
imagefilledrectangle($im,0,0,imagesx($im),imagesy($im),$bg);
$ink=imagecolorallocate($im,0,0,0);
//
Вывод полигонов
for ($j=0;$j<count($points);$j++) {