Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Новости ИТ Программы Книги Games   Обои   Экспорт RSS E-Books
 
Поиск по сайту

TOP-10 программ
Symantec Norton Ghost 9.0
Partition Magic 8.0.2 Pro
Xilisoft 3GP Video Converter v3.1.7.0616b
Norton AntiVirus 2005
Xilisoft 3GP Video Converter v2.1.52.831b
Антивирус Касперского Personal 5.0.303 beta 2
RAR Password Cracker 4.12
ABBYY PDF Transformer v1.00.820
MP3 To Ringtone Gold v3.02
Mobtime Cell Phone Manager v5.3.1
 
Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
 
 

   Интернет технологии -> PHP -> Векторная карта России на PHP


Векторная карта России на PHP

Для заливки сложной замкнутой области удобно использовать функцию imagefilledpolygon:

int imagefilledpolygon ( resource image, array points, int num_points, int color )

где,

  • image - идентификатор изображения;
  • points - массив точек;
  • num_points - количество точек в полигоне;
  • color - цвет заливки.

Массив точек содержит X и Y координату каждой точки. Таким образом, для трех точек, массив содержит шесть элементов: Array( X1, Y1, X2, Y2, X3, Y3)

Пример 29. Вывод самого простого полигона (треугольник):

<?php
header ("Content-type: image/png");
$im = imagecreatetruecolor(320, 240);
$ink = imagecolorallocate($im, 255, 255, 255);

imagefilledpolygon($im, Array(
	100,100,
	120,180,
	210,160,
	), 3, $ink);

imagepng($im);
imagedestroy($im);
?>

Результат работы этой программы выглядит следующим образом:

Эта функция удобна тем, что линии полигона могут пересекаться, и заливка при этом работает корректно:

Карта России

Рассмотрим следующую задачу: необходимо нарисовать карту России и выделить определенные регионы цветами, в зависимости от какого-то параметра (плотности населения, числа жителей, количества продаж и т.п.)

Задача на первый взгляд сложная, так как контуры некоторых регионов России имеют неправильную форму и использовать функцию imagefill нельзя. По этому, я использовал функцию imagepolygon для прорисовки контуров, и функцию imagefilledpolygon для закрашивания регионов.

Метод, которым я нарисовал карту рассматривался в уроке 6.

Пример 30. Рисование карты России:

<?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;

		// Отмасштабируем координаты
		$poly[$i]*=($W-10);
		$poly[$i+1]*=($H-10);

		// Перевернем изображение по вертикали
		$poly[$i+1]=$H-$poly[$i+1];
		}

	// Вывод полигона
	imagefilledpolygon($im, $poly, count($poly)/2, $color);
	imagepolygon($im, $poly, count($poly)/2, $color["black"]);
	}

// Чтения файла
$d=file("russia.ai");

// Если массив $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];
		}

// В отличи от урока 6, в одном файле может быть несколько
// полигонов. Для хранения координат их вершин, будем использовать
// двухмерный массив

// С помощью регулярного выражение выберем координаты
// всех полигонов. Формат 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++) {

	// Перерассчитанные координаты полигона
	// будем хранить в массиве $poly
	$poly=Array();

	for ($i=0;$i<count($points[$j]);$i+=2) {
		$x=$points[$j][$i];
		$y=$points[$j][$i+1];

		// Нормализуем координаты
		$x=$x/$maxw;
		$y=$y/$maxh;

		// Отмасштабируем координаты
		$x=$x*($W-10);
		$y=$y*($H-10);

		// Перевернем изображение по вертикали
		$y=$H-$y;

		// Заносим координаты в массив, по которому 
		// будет построен полигон
		$poly[]=$x;
		$poly[]=$y;
		}

	// Вывод полигона
	imagepolygon($im, $poly, count($poly)/2, $ink);
	}

// Выделим цвета для заливки регионов
$color=Array();
for ($i=196;$i<256;$i+=6) $color[]=imagecolorallocate($im,$i,$i,$i);
$color["black"]=$ink;

// Прорисовка и закрашивание регионов
DrawIllustratorFile($im,"arhangelsk.ai",$maxw,$maxh,$color[7]);
DrawIllustratorFile($im,"murmansk.ai",$maxw,$maxh,$color[5]);
DrawIllustratorFile($im,"novgorod.ai",$maxw,$maxh,$color[0]);
DrawIllustratorFile($im,"pertrozavodsk.ai",$maxw,$maxh,$color[3]);
DrawIllustratorFile($im,"pskov.ai",$maxw,$maxh,$color[8]);
DrawIllustratorFile($im,"s-petersburg.ai",$maxw,$maxh,$color[9]);
DrawIllustratorFile($im,"syktyvkar.ai",$maxw,$maxh,$color[3]);
DrawIllustratorFile($im,"vologda.ai",$maxw,$maxh,$color[4]);

imagepng($im);
imagedestroy($im);
?>

Так выглядит карта России до закрашивания регионов:

А окончательный результат работы этой программы выглядит следующим образом: (Терпения мне хватило только на обводку областей северо-западного федерального округа)

Скачать PHP скрипт рисующий карту России можно здесь.

На самом деле, обводить контур страны не обязательно, так как его построят сложенные вместе регионы. Я сделал это лишь из-за того что не нашел времени обвести все регионы.

Этот метод, в сочетании со сглаживанием изображения, я использовал для рисования карты мира на сайте http://r.codenet.ru/?http://top.novgorod.ru/. Вот как она выглядит:

Автор: mike
Источник: www.codenet.ru

Ссылки по теме
Разработка собственных листов рассылки
Безопасность PHP+MYSQL+Apache
Чтение почты через Web-интерфейс
Полезные скрипты на PHP
PHP и формы
Почтовые функции в РНР
Отправка электронной почты с помощью PHP
 

Компьютерная документация от А до Я - Главная

 
Популярные книги

Photoshop CS2. Настоящий самоучитель

Подробнее

Общая информатика. Универсальный курс

Подробнее

Технология программирования на C++. Начальный курс

Подробнее

 

 
Новости ИТ
21.11.2008  Thunderbird 2.0.0.18
21.11.2008  Miranda IM 0.7.13
21.11.2008  Dr. Web 5 Beta
21.11.2008  KAV/KIS 2009 8.0.0.506
21.11.2008  avast! 4.8 (1290)
21.11.2008  Radmin 3.3
21.11.2008  DVR-X162J - новый внешний DVD-привод от Pioneer
21.11.2008  Дизайнерские системные блоки от Smooth Creations
21.11.2008  SPARKLE представляет Calibre P980X+, видеокарту с необычным дизайном
21.11.2008  Titan представляет куллер для Intel i7
21.11.2008  Компактный ПК для дома Acer Aspire X3200 - в России
21.11.2008  Hitachi Data Systems объявляет о новом плане инвестиций в России и странах СНГ
21.11.2008  Назначен новый президент Microsoft в России
21.11.2008  Mustek: новые цифровые видеокамеры начального уровня
21.11.2008  Серверные Core i7 - быстры ли они? Да, и очень, судя по тестам в SPECfp
21.11.2008  NETGEAR: акция для партнеров
21.11.2008  Персональные фотокарты на Яндексе
21.11.2008  Программа для стартапов Microsoft BizSpark анонсирована в России
21.11.2008  Средства защиты от утечек конфиденциальных данных Symantec DLP 8.1 теперь и в России
21.11.2008  Axis: первый 6-канальный IP-видеосервер с поддержкой H.264/M-JPEG
 
Полезно

 
Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.
 
Rambler's Top100