<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog &#187; python</title>
	<atom:link href="http://karta39.ru/blog/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://karta39.ru/blog</link>
	<description>Разные мысли и идеи :)</description>
	<lastBuildDate>Tue, 21 Feb 2012 08:02:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>LiveStreet и Arduino/CraftDuino</title>
		<link>http://karta39.ru/blog/2010/01/23/livestreet-arduino-craftduino/</link>
		<comments>http://karta39.ru/blog/2010/01/23/livestreet-arduino-craftduino/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 08:47:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[идеи]]></category>
		<category><![CDATA[разработка]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[CraftDuino]]></category>
		<category><![CDATA[livestreet]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[блог]]></category>
		<category><![CDATA[идея]]></category>
		<category><![CDATA[модуль]]></category>
		<category><![CDATA[плата]]></category>
		<category><![CDATA[управлять]]></category>

		<guid isPermaLink="false">http://karta39.ru/blog/?p=465</guid>
		<description><![CDATA[
Здесь я уже писал, как ардуина может читать RSS-ленту. Используя тот же принцип можно сделать следующий шаг и научить ардуину вести свой блог 

Научить Arduino/CraftDuino вести свои заметки не составило большого труда, но я уже не смог остановиться и написал небольшой модуль для LiveStreet, который не только сохраняет данные от Arduino/CraftDuino, но и позволяет через [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://idea2.ru/files/lsarduino/DSC01297-.jpg"/><br />
<a href="http://robocraft.ru/blog/arduino/104.html">Здесь</a> я уже писал, как ардуина может читать RSS-ленту. Используя тот же принцип можно сделать следующий шаг и научить ардуину вести свой блог <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
<span id="more-465"></span><br />
Научить Arduino/CraftDuino вести свои заметки не составило большого труда, но я уже не смог остановиться и написал <a href="http://idea2.ru/files/lsarduino/lsarduino.zip">небольшой модуль</a> для LiveStreet, который не только сохраняет данные от Arduino/CraftDuino, но и позволяет через сайт управлять своей платой <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<cut></p>
<p>Вот как это работает:<br />
<img src="http://idea2.ru/files/lsarduino/1-.png"/><br />
плата Arduino/CraftDuino подключается к ПК через USB-шнурок.<br />
На ПК работает скрипт на питоне (lsarduino.py), который через определённые промежутки времени опрашивает плату и высылает данные в БД сайта.<br />
POST-запрос на -=сайт=-/include/ajax/lsarduino_add_note.php</p>
<p>Плата может возвращать всё что угодно &#8211; <a href="http://www.robocraft.ru/blog/projects/26.html">влажность</a> земли в горшке с цветком, освещённость вашей комнаты, температуру воды в аквариуме&#8230; нафантазировать можно всё что угодно <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>На стороне сайта так же можно добавить задания для платы, которые потом выгружаются в виде xml-ки.<br />
xml-ка генерируется по адресу -=сайт=-/lsarduino/actions<br />
вида<br />
<code><?xml version="1.0" encoding="utf-8"?><br />
<actions><br />
	<action><br />
		<id>14</id><br />
		<userid>1</userid><br />
		<todo>1</todo><br />
		<todotext>test</todotext><br />
		<tododate>2009-11-10 11:37:42</tododate><br />
		<todostatus>1</todostatus><br />
	</action><br />
</actions></code></p>
<p>xml загружается питоновским скриптом на ПК, парсится и через USB-шнурок задания передаются на плату, которая их выполняет.</p>
<p>В примере модуля &#8211; плата просто зажигает и гасит светодиод, но через соответствующую развязку может управлять <a href="http://ukrduino.blogspot.com">кофейником</a>, светом, моторчиком робота&#8230; опять же &#8211; фантазиям предела нет <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<p>В данной версии задание &#8211; это число от 1 до 9<br />
в примере:<br />
	1 &#8211; зажечь светодиод<br />
	2 &#8211; погасить светодиод</p>
<p>для работы из-под питона с последовательным портом потребуется библиотека<br />
<a href="http://pyserial.sourceforge.net">pySerial</a></p>
<p>для работы pySerial под ОС Windows понадобится ещё библиотека<br />
<a href="http://starship.python.net/crew/mhammond/win32/Downloads.html">pyWin32</a> </p>
<p>у меня всё прекрасно работало на Python 2.5.1 <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>в скрипте нужно настроить номер COM-порта Вашей платы:<br />
SERIAL_PORT = &#8216;COM18&#8242;</p>
<p>адрес сайта для работы, логин и пароль учётной записи<br />
USER_LS_SITE_NOTE = &#8216;http://ВАШСАЙТ.ru/include/ajax/lsarduino_add_note.php&#8217;<br />
USER_LS_SITE_ACTION = &#8216;http://ВАШСАЙТ.ru/include/ajax/lsarduino_set_status.php&#8217;<br />
XML_TODO = &#8216;http://ВАШСАЙТ.ru/lsarduino/actions&#8217;<br />
USER_LOGIN = &#8216;ВАШ_ЛОГИН&#8217;<br />
USER_PASS = &#8216;ВАШ_ПАРОЛЬ&#8217;</p>
<p>что делает lsarduino.py:<br />
смотрим main() и видим там только бесконечный цикл, в котором</p>
<p>сначала получаются данные от платы<br />
- для этого ей посылается байт &laquo;0&#8243; на что плата может вернуть данные или просто сказать &laquo;Hello <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> &raquo;</p>
<p>, а затем считывается xml-ка с заданиями для платы<br />
Получив задание, скрипт изменяет его статус на сайте с &laquo;Новый&raquo; на &laquo;Загружен&raquo; и записывает это число в COM-порт.<br />
Ардуина считывает число с порта и в операторе<br />
<code>switch( r )<br />
    {<br />
      case 0:<br />
        Serial.println("Hello <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ");<br />
        break;<br />
      case 1:<br />
        digitalWrite(ledPin, HIGH);   // sets the LED on<br />
        Serial.println("3");<br />
      break;<br />
      case 2:<br />
         digitalWrite(ledPin, LOW);    // sets the LED off<br />
        Serial.println("3");<br />
      break;<br />
      default:<br />
        Serial.println("4");<br />
      break;<br />
    }</code><br />
производит необходимые действия.<br />
Как видите, ардуина так же отвечает в COM-порт о выполнении задания &laquo;3&#8243; &#8211; &laquo;Выполнен&raquo;<br />
Питоновский скрипт считывает ответ от платы и записывает его в статус задания на сайте</p>
<p>варианты статуса задания:<br />
	(&#8216;1&#8242;, &#8216;Новый&#8217;),<br />
	(&#8216;2&#8242;, &#8216;Загружен&#8217;),<br />
	(&#8216;3&#8242;, &#8216;Выполнен&#8217;),<br />
	(&#8216;4&#8242;, &#8216;Отклонён&#8217;),<br />
	(&#8216;5&#8242;, &#8216;Не выполнен&#8217;),<br />
	(&#8216;6&#8242;, &#8216;Отменён&#8217;);</p>
<p>Вот и всё <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://idea2.ru/files/lsarduino/lsarduino.zip">Скачать модуль</a>. (распространяется бесплатно при условии сохранения копирайтов <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><u>Примечания:</u></p>
<p>! Обратите внимание: при работе на плате должен быть снят джампер автосброса (AutoReset), чтобы плата не перегружалась каждый раз при открытии COM-порта !</p>
<p>Для большей надёжности – лучше не использовать в питоновском  скрипте бесконечный цикл – лучше просто прописать вызов соответствующих функций и периодически вызывать скрипт через cron или планировщик задач (или nncron).<br />
Для этого в архиве есть файл lsarduino-nocycle.py</p>
<p>сообщения и задания прошлых недель удаляются из базы, но если Вы хотите их оставить &#8211; просто закомментируйте строчки:</p>
<p><code>$this->DeleteOldNotes();<br />
$this->DeleteOldTodo();</code><br />
в конце функции CreateTables()<br />
файла classes\modules\lsarduino\mapper\LsArduino.mapper.class.php</p>
<p>Как теперь можно развить эту идею?  Да как угодно – взять за основу этот модуль или сделать свой модуль для того же wordpress-а и дать возможность вашему дому, цветку, коту, etc. Вести свой блог вместе с Вами!</p>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://karta39.ru/blog/2010/01/23/livestreet-arduino-craftduino/","LiveStreet и Arduino/CraftDuino")</script>]]></content:encoded>
			<wfw:commentRss>http://karta39.ru/blog/2010/01/23/livestreet-arduino-craftduino/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>QR-код: использование</title>
		<link>http://karta39.ru/blog/2009/01/29/qr-code-ispolzovanie/</link>
		<comments>http://karta39.ru/blog/2009/01/29/qr-code-ispolzovanie/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 08:59:06 +0000</pubDate>
		<dc:creator>noonv</dc:creator>
				<category><![CDATA[идеи]]></category>
		<category><![CDATA[инструменты]]></category>
		<category><![CDATA[исследования]]></category>
		<category><![CDATA[разработка]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[QR-code]]></category>
		<category><![CDATA[RFID]]></category>
		<category><![CDATA[психогеография]]></category>
		<category><![CDATA[ссылки]]></category>

		<guid isPermaLink="false">http://karta39.ru/blog/?p=137</guid>
		<description><![CDATA[



Я уже писал о такой интересной штуковине, как QR-код (QR-code)
В самом начале &#8211; применительно к психогеографии.
Затем кратко описал что это собственно за зверь такой &#8211; QR-код
Затем увидел онлайн-сервис генерации QR-кода с текстом.
А теперь пора вспомнить, что изначально QR-код создавался
для промышленных нужд  




Уже упоминалось, что QR-код (Quick Response &#8211; быстрое распознавание, он же быстрый отклик, [...]]]></description>
			<content:encoded><![CDATA[<table border="0">
<tbody>
<tr>
<td><img src="http://chart.apis.google.com/chart?cht=qr&amp;choe=UTF-8&amp;chs=156x156&amp;chl=http://www.karta39.ru/blog/&amp;chld=H|0" alt="" /></td>
<td>Я уже писал о такой интересной штуковине, как QR-код (<em>QR-code</em>)<br />
В самом начале &#8211; применительно к <a href="http://www.karta39.ru/articles/165.html">психогеографии</a>.<br />
Затем кратко описал что это собственно за зверь такой &#8211; <a href="http://www.karta39.ru/articles/167.html">QR-код</a><br />
Затем увидел <a href="http://karta39.ru/blog/2009/01/13/qr-code-with-text/">онлайн-сервис генерации QR-кода с текстом</a>.<br />
А теперь пора вспомнить, что изначально QR-код создавался<br />
для промышленных нужд <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </td>
</tr>
</tbody>
</table>
<p><span id="more-137"></span><br />
Уже упоминалось, что <strong>QR-код</strong> (<em><strong>Quick Response</strong></em> &#8211; быстрое распознавание, он же <em>быстрый отклик</em>, он же <em>быстрый ответ</em> <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</p>
<blockquote><p>был разработан японской корпорацией Denso-Wave в 1994-м году как средство кодирования различной служебной информации. Изначально QR-код использовался в японской транспортной промышленности для маркировки деталей и запасных частей при транспортировке. В-принципе, представление информации в виде QR-кода аналогично сканированию и распознаванию обычного текста. Однако, процедура OCR (распознавания текста) требует сложного и недешёвого ПО (например, Fine Reader), а кроме того не подходит одинакового для любого шрифта. QR-код достаточно легко читается и сканируется вычислительными устройствами, что позволяет очень быстро переносить информацию в электронный вид, не требуя ручного набора.</p>
<p>Максимальное количество символов, которые помещаются в один QR-код:<br />
Цифры &#8211; <strong>7089</strong><br />
Цифры и буквы (включая кириллицу) &#8211; <strong>4296</strong><br />
Двоичный код &#8211; <strong>2953 байт</strong><br />
Иероглифы &#8211; <strong>1817</strong></p>
<p>Теоритически можно кодировать изображения, звуки и прочее.</p>
<p>В настоящее время QR-код широко распространен в странах Азии (особенно в Японии), постепенно развивается в Европе и Северной Америке. Наибольшее признание он получил среди пользователей мобильной связи &#8211; установив программу-распознаватель, абонент может моментально заносить в свой телефон текстовую информацию, добавлять контакты в адресную книгу, переходить по web-ссылкам, отправлять SMS-сообщения и т.д.</p>
<p>В Японии подобные коды наносятся практически на все товары, продающиеся в магазинах, их размещают в рекламных буклетах и справочниках. С помощью QR-кода даже организовывают различные конкурсы и ролевые игры.</p>
<p>Ведущие японские операторы мобильной связи совместно выпускают под своим брендом мобильные телефоны со встроенной поддержкой распознавания QR-кода.</p></blockquote>
<p>а теперь попробуем найти что-нибудь интересное <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
просто <a href="http://karta39.ru/go.php?url=yandex.ru/yandsearch?text=qr+code+%D1%81%D0%BA%D0%B0%D0%BD%D0%B5%D1%80&amp;clid=14585&amp;stpar2=%2Fh1%2Ftm8%2Fs4&amp;stpar4=%2Fs4&amp;stpar1=%2Fu0">поищем в яндексе: qr code сканер</a></p>
<p>например, нашлось <a href="http://karta39.ru/go.php?url=www.datascan.ru/scaners/sc3/vision/vision.htm">http://www.datascan.ru/scaners/sc3/vision/vision.htm</a> или <a href="http://karta39.ru/go.php?url=www.sick-automation.ru/catalog/avto_identification/two_dimensional_code.html">http://www.sick-automation.ru/catalog/avto_identification/two_dimensional_code.html</a><br />
а кроме сканеров нашлись ещё <a href="http://karta39.ru/go.php?url=www.shtrih-yug.ru/rfprint.html">принтеры RFID</a>(!), впрочем это совсем другая тема&#8230;</p>
<p><strong><span style="text-decoration: underline;">Ссылки:</span></strong><br />
<a href="http://karta39.ru/go.php?url=www.swetake.com/qr/index-e.html">библиотека для генерации QR-кода на PHP</a> (<a href="http://karta39.ru/go.php?url=www.swetake.com/qr/qr1_en.html">How to create QRcode</a>)<br />
<a href="http://karta39.ru/go.php?url=pyqrcode.sourceforge.net">библиотека для QR-code на питоне</a><br />
<a href="http://karta39.ru/go.php?url=www.pedemonte.eu/pyqr/">и ещё на питоне</a><br />
<a href="http://karta39.ru/go.php?url=twit88.com/home/opensource/qrcode">на С#</a> (<a href="http://karta39.ru/go.php?url=www.codeproject.com/KB/cs/qrcode.aspx">она же на codeproject</a>)<br />
<a href="http://karta39.ru/go.php?url=anton.shevchuk.name/wordpress/qr-code/">QR-code плагины для wordpress</a><br />
<a href="http://karta39.ru/go.php?url=gnuwin32.sourceforge.net/packages/barcode.htm">GNU BarCode</a></p>
<p><strong>UPD:</strong><br />
<a href="http://karta39.ru/go.php?url=ru.wikipedia.org/wiki/Штрихкод">ru.wikipedia.org/wiki/Штрихкод</a><br />
<a href="http://karta39.ru/go.php?url=ru.wikipedia.org/wiki/UPC">ru.wikipedia.org/wiki/UPC</a><br />
<a href="http://karta39.ru/go.php?url=ru.wikipedia.org/wiki/Data_Matrix">ru.wikipedia.org/wiki/Data_Matrix</a><br />
<a href="http://karta39.ru/go.php?url=grandzebu.net/index.php?page=/informatique/codbar-en/codbar.htm">алгоритмы кодов</a></p>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://karta39.ru/blog/2009/01/29/qr-code-ispolzovanie/","QR-код: использование")</script>]]></content:encoded>
			<wfw:commentRss>http://karta39.ru/blog/2009/01/29/qr-code-ispolzovanie/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Краткое руководство по добавлению собственных карт на Google Maps.</title>
		<link>http://karta39.ru/blog/2009/01/26/kratkoe-rukovodstvo-po-dobavleniu-sobstvennix-kart-na-google-maps/</link>
		<comments>http://karta39.ru/blog/2009/01/26/kratkoe-rukovodstvo-po-dobavleniu-sobstvennix-kart-na-google-maps/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 10:10:49 +0000</pubDate>
		<dc:creator>noonv</dc:creator>
				<category><![CDATA[инструменты]]></category>
		<category><![CDATA[исследования]]></category>
		<category><![CDATA[картинки]]></category>
		<category><![CDATA[разработка]]></category>
		<category><![CDATA[gimp]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[karta39.ru]]></category>
		<category><![CDATA[Map]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://karta39.ru/blog/?p=119</guid>
		<description><![CDATA[Добавить собственную карту не так сложно, как может показаться 
Итак приступим…
Земля в Google Maps разворачивается в проекцию Меркатора – т.е. представляет собой развёрнутый на плоскость цилиндр, что даёт нам прямоугольник, который разбивается на маленькие квадратики (tiles) с размерами 256&#215;256пикселей.
Пример кусочка карты от Google:
http://mt1.google.com/mt?v=ap.88&#38;hl=ru&#38;x=285&#38;y=162&#38;z=9&#38;s=G


здесь можно видеть следующие значения
x=285 y=162 zoom=9
т.е. нам нужно хранить свою картинку по [...]]]></description>
			<content:encoded><![CDATA[<p>Добавить собственную карту не так сложно, как может показаться <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Итак приступим…</p>
<p>Земля в Google Maps разворачивается в <a href="http://ru.wikipedia.org/wiki/Проекция_Меркатора">проекцию Меркатора</a> – т.е. представляет собой развёрнутый на плоскость цилиндр, что даёт нам прямоугольник, который разбивается на маленькие квадратики (<em>tiles</em>) с размерами <strong>256&#215;256</strong>пикселей.</p>
<p>Пример кусочка карты от Google:<br />
<a href="http://mt1.google.com/mt?v=ap.88&amp;hl=ru&amp;x=285&amp;y=162&amp;z=9&amp;s=G">http://mt1.google.com/mt?v=ap.88&amp;hl=ru&amp;x=285&amp;y=162&amp;z=9&amp;s=G</a><br />
<a href="http://karta39.ru/blog/wp-content/uploads/2009/01/mt.png"><img class="alignnone size-full wp-image-120" src="http://karta39.ru/blog/wp-content/uploads/2009/01/mt.png" alt="mt" width="256" height="256" /></a></p>
<p><span id="more-119"></span></p>
<p>здесь можно видеть следующие значения<br />
x=<strong>285</strong> y=<strong>162</strong> zoom=<strong>9</strong></p>
<p>т.е. нам нужно хранить свою картинку по кусочкам вида:<br />
<em>tile_285_162_9.jpg</em><br />
(<em>или, разумеется, аналогичным образом хранить изображения в БД</em>)<br />
<a href="http://karta39.ru/blog/wp-content/uploads/2009/01/tile_285_162_9.jpg"><img class="alignnone size-full wp-image-123" src="http://karta39.ru/blog/wp-content/uploads/2009/01/tile_285_162_9.jpg" alt="tile_285_162_9" width="256" height="256" /></a></p>
<p>Чтобы описать кусочек карты нужно знать три числа:<br />
1 – его номер по вертикали (числа растут сверху вниз (т.е. с севера на юг)) ( в примере &#8211; <strong>285</strong>)<br />
2 – его номер по горизонтали (числа растут слева направо (с запада на восток)) (<strong>162</strong>)<br />
3 – его уровень увеличения ( zoom) (<strong>9</strong>)</p>
<p>Таким образом, карту можно представить в виде стопки слоёв, каждый из которых состоит из маленьких квадратиков. (Очевидно, что число квадратиков становится больше при увеличении уровня приближения.)</p>
<p>Итак, у нас есть изображение, которое мы хотим наложить на карту или показать вместо карты.<br />
Во-первых, нужно узнать те самые три числа, которые дают нам местоположение нужного кусочка карты.<br />
В самом простом случае можно загрузить нужный нам участок карты и посмотреть информацию о полученных изображениях (в FireFox: <em>Инструменты-&gt;Информация о странице &#8211; &gt; Мультимедиа</em>)  или же можно воспользоваться <a href="http://open.atlas.free.fr/GMapsTransparenciesImgOver.php">online-сервисом</a> [6].<br />
Там нужно ввести координаты и уровень увеличения интересующего нас места на карте и он покажет нужные нам числа, но самое интересное &#8211; через данный сервис можно загрузить свою картинку и он её нам разрежет на необходимое количество кусочков и даст им нужные имена в формате:</p>
<p><strong>Tile_18250_10410_15.jpg</strong></p>
<p>К сожалению, данный сервис вываливается с ошибкой при попытке разрезать большие картинки. В таком случае &#8211; придётся резать картинку самостоятельно.</p>
<p><strong>! Следует учесть, что картинку придётся подгонять под те самые квадратики карты !</strong></p>
<p>Можно воспользоваться Photoshop-ом, я же использую для этих целей <a href="http://gimp.org">Gimp</a>.<br />
Чтобы в нём разрезать картинку нужно по вертикали и горизонтали картинки (уже подогнанной под карту, т.е. уже обрезанной или смещённой нужным образом) через каждые 256 пикселей вывести направляющие (<em>Изображение-&gt;Направляющие-&gt;Новая направляющая</em>)<br />
Далее выполняем преобразование гильотина (<em>Изображение-&gt;Преобразование-&gt;Гильотина</em>)<br />
<strong>!процедура крайне требовательная к оперативной памяти!</strong><br />
После этого у нас появится много кусочков изображения, которые сохраняются с именами вида:<br />
<code>p4.jpg</code> – исходное изображение<br />
<code>p4-00-00.jpg<br />
p4-01-00.jpg<br />
…<br />
p4-01-07.jpg<br />
..<br />
p4-09-00.jpg</code><br />
и т.д.<br />
Нумерация идёт так же как и на карте – первый номер – столбец, второй – строка.</p>
<p>Чтобы переименовать (или лучше сказать – перенумеровать) получившиеся картинки я написал небольшой <a href="http://karta39.ru/blog/wp-content/uploads/2009/01/copy_p4_2tiles.py">скрипт на питоне</a>:</p>
<blockquote><p><code><span style="font-family: &quot;Courier New&quot;; color: #000000; font-size: x-small;"></p>
<ol>
<li></li>
<li>#</li>
<li># For copy files <span style="color: #0000ff;">from</span> def-00-00.jpg to tile\tile_18243_10406_15</li>
<li>#</li>
<li></li>
<li>import os</li>
<li></li>
<li># <span style="color: #0000ff;">for</span> copy</li>
<li>import shutil</li>
<li></li>
<li></li>
<li>srcfile=<span style="color: #a31515;">"p4-01-01.JPG"</span></li>
<li>dstfile=<span style="color: #a31515;">""</span></li>
<li></li>
<li>#-----------------------------------------</li>
<li>#</li>
<li># begin here <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>#</li>
<li>print <span style="color: #a31515;">"Start..."</span></li>
<li></li>
<li>path = srcfile</li>
<li></li>
<li>tilex=281</li>
<li>tiley_beg=160</li>
<li>tiley=tiley_beg</li>
<li>zoom=<span style="color: #a31515;">'9'</span></li>
<li></li>
<li><span style="color: #0000ff;">for</span> i <span style="color: #0000ff;">in</span> range(1,10):</li>
<li> <span style="color: #0000ff;">for</span> j <span style="color: #0000ff;">in</span> range(1,8):</li>
<li> <span style="color: #0000ff;">if</span> i&lt;= 9:</li>
<li> x=<span style="color: #a31515;">'0'</span>+str(i)</li>
<li> <span style="color: #0000ff;">else</span>:</li>
<li> x=str(i)</li>
<li> <span style="color: #0000ff;">if</span> j&lt;= 9:</li>
<li> y=<span style="color: #a31515;">'0'</span>+str(j)</li>
<li> <span style="color: #0000ff;">else</span>:</li>
<li> y=str(j)</li>
<li> srcpath=<span style="color: #a31515;">'p4-'</span>+x+<span style="color: #a31515;">'-'</span>+y+<span style="color: #a31515;">'.jpg'</span></li>
<li> <span style="color: #0000ff;">if</span> os.path.exists(srcpath):</li>
<li> print srcpath, <span style="color: #a31515;">' exists'</span></li>
<li> shutil.copy(srcpath,<span style="color: #a31515;">'tile\\tile_'</span>+str(tilex)+<span style="color: #a31515;">'_'</span>+str(tiley)+<span style="color: #a31515;">'_'</span>+zoom+<span style="color: #a31515;">'.jpg'</span>)</li>
<li> <span style="color: #0000ff;">else</span>:</li>
<li> print <span style="color: #a31515;">'Cant find'</span>, srcpath</li>
<li> tiley+=1</li>
<li> tilex+=1</li>
<li> tiley=tiley_beg</li>
<li></li>
<li>print <span style="color: #a31515;">"Done."</span></li>
</ol>
<p></span><span style="color: #808080; font-size: xx-small;">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><span style="color: #808080; font-size: xx-small;">Source Code Highlighter</span></a>.</span></p>
<p></code></p></blockquote>
<p>В скрипте нужно установить следующие параметры:<br />
<code><strong>tilex</strong></code> – номер крайнего изображения по вертикали на карте Google<br />
<code><strong>tiley_beg</strong></code> – номер крайнего изображения по горизонтали на карте Google<br />
<code><strong>zoom</strong></code> – уровень увеличения на карте Google<br />
Далее изменить граничные условия циклов по количеству ваших полученных картинок.<br />
Не забыть внести изменения в <code>srcpath</code>, внеся туда своё название картинки.<br />
После выполнения скрипта в директории <code>tile</code> будут ваши файлы с именами:<br />
<code>tile_281_160_9.jpg<br />
tile_281_161_9.jpg<br />
…<br />
tile_289_166_9.jpg</code></p>
<p>Осталось только настроить вывод вашей карты, средствами Google Maps.</p>
<p>Для приведённого примера:</p>
<blockquote><p><code><span style="font-family: &quot;Courier New&quot;; color: #000000; font-size: x-small;"></p>
<ol>
<li><span style="color: #0000ff;">function</span> add_custom_map(map)</li>
<li> {</li>
<li> <span style="color: #0000ff;">var</span> copyright = <span style="color: #0000ff;">new</span> GCopyright(1, <span style="color: #0000ff;">new</span> GLatLngBounds(<span style="color: #0000ff;">new</span> GLatLng(57.72883324000875,16.471134185791016),<span style="color: #0000ff;">new</span> GLatLng(49.693182016907464,25.556020736694336) ),8, <span style="color: #a31515;">"Karta39"</span>);</li>
<li> <span style="color: #0000ff;">var</span> copyrightCollection = <span style="color: #0000ff;">new</span> GCopyrightCollection(<span style="color: #a31515;">'Map Data:'</span>);</li>
<li> copyrightCollection.addCopyright(copyright);</li>
<li></li>
<li> <span style="color: #0000ff;">var</span> tilelayers = [<span style="color: #0000ff;">new</span> GTileLayer(copyrightCollection , 9, 9)];</li>
<li> tilelayers[0].getTileUrl = CustomGetTileUrl;</li>
<li></li>
<li> tilelayers[0].getCopyright = <span style="color: #0000ff;">function</span>(a,b)</li>
<li> {</li>
<li> <span style="color: #0000ff;">var</span> c= copyrightCollection.getCopyrightNotice(a,b);</li>
<li> <span style="color: #0000ff;">if</span> (!c)</li>
<li> {</li>
<li> c = G_NORMAL_MAP.getTileLayers()[0].getCopyright(a,b);</li>
<li> }</li>
<li> <span style="color: #0000ff;">return</span> c;</li>
<li> }</li>
<li></li>
<li> <span style="color: #0000ff;">var</span> custommap = <span style="color: #0000ff;">new</span> GMapType(tilelayers, <span style="color: #0000ff;">new</span> GMercatorProjection(10), <span style="color: #a31515;">"Custom Map"</span>, {shortName:<span style="color: #a31515;">"1645"</span>});</li>
<li></li>
<li> map.addMapType(custommap);</li>
<li> }</li>
<li></li>
<li> <span style="color: #0000ff;">function</span> CustomGetTileUrl(a,b)</li>
<li> {</li>
<li> <span style="color: #0000ff;">if</span> (b==9 &amp;&amp; a.x&gt;280 &amp;&amp; a.x&lt;290 &amp;&amp; a.y&gt;159 &amp;&amp; a.y&lt;167)</li>
<li> <span style="color: #0000ff;">return</span> <span style="color: #a31515;">"tile_"</span>+a.x+<span style="color: #a31515;">"_"</span>+a.y+<span style="color: #a31515;">"_"</span>+b+<span style="color: #a31515;">".jpg"</span>;</li>
<li> <span style="color: #0000ff;">else</span></li>
<li> <span style="color: #0000ff;">return</span> G_NORMAL_MAP.getTileLayers()[0].getTileUrl(a,b);</li>
<li> }</li>
</ol>
<p></span><span style="color: #808080; font-size: xx-small;">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><span style="color: #808080; font-size: xx-small;">Source Code Highlighter</span></a>.</span></p>
<p></code></p></blockquote>
<p>Как видно – сначала создаётся <code>copyright</code> для слоя, а затем сам слой с вашей картой.<br />
В параметр <code>getTileUrl</code> передаётся функция возвращающая ваши кусочки карты &#8211; <code>CustomGetTileUrl(a,b)</code><br />
, где <code>a </code>– точка с параметрами <code>a.x</code> и <code>a.y</code>, которые указывают местоположение картинки по вертикали и горизонтали<br />
<code>b</code> – уровень приближения слоя.<br />
Строчка <code>return G_NORMAL_MAP.getTileLayers()[0].getTileUrl(a,b);</code><br />
Возвращает родную картинку Google Maps – если эту строчку убрать, то на карте будет отображаться только ваша картинка.</p>
<p>Полный вариант:</p>
<blockquote><p><code><span style="font-family: &quot;Courier New&quot;; color: #000000; font-size: x-small;"></p>
<ol>
<li><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span></li>
<li> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span></li>
<li> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">meta</span> <span style="color: #ff0000;">http-equiv</span><span style="color: #0000ff;">="content-type"</span> <span style="color: #ff0000;">content</span><span style="color: #0000ff;">="text/html; charset=utf-8"</span><span style="color: #0000ff;">/&gt;</span></li>
<li> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span>Google Custom Maps<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span></li>
<li><span>&lt;!-- key for karta39.ru <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  --&gt;</span></li>
<li><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">script</span> <span style="color: #ff0000;">src</span><span style="color: #0000ff;">="http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;key=ABQIAAAAsL2VORzTwmVBxxfMiMNG7hSQWpIDMILbmlKIxypjOkZkxcl47xRnQ74rU6B3rYRRuou-6ZHLri9jUA"</span></li>
<li> <span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">script</span><span style="color: #0000ff;">&gt;</span></li>
<li></li>
<li> &lt;script type=<span style="color: #a31515;">"text/javascript"</span>&gt;</li>
<li> <span style="color: #008000;">//&lt;![CDATA[</span></li>
<li></li>
<li> <span style="color: #0000ff;">function</span> initialize()</li>
<li> {</li>
<li> <span style="color: #0000ff;">if</span> (GBrowserIsCompatible())</li>
<li> {</li>
<li> <span style="color: #0000ff;">var</span> map = <span style="color: #0000ff;">new</span> GMap2(<span style="color: #0000ff;">document</span>.getElementById(<span style="color: #a31515;">"map"</span>));</li>
<li> <span style="color: #0000ff;">var</span> mmmap = map;</li>
<li> <span style="color: #008000;">//map.addControl(new GScaleControl());</span></li>
<li> map.addControl(<span style="color: #0000ff;">new</span> GLargeMapControl()); <span style="color: #008000;">// контрол перемещения и приближения</span></li>
<li> map.addControl(<span style="color: #0000ff;">new</span> GMapTypeControl()); <span style="color: #008000;">// контрол режима карты</span></li>
<li> map.setCenter(<span style="color: #0000ff;">new</span> GLatLng(54.707168569101256,20.510530471801758),9);    <span style="color: #008000;">// Kaliningrad</span></li>
<li> add_custom_map(map);</li>
<li> }</li>
<li> <span style="color: #008000;">// display a warning if the browser was not compatible</span></li>
<li> <span style="color: #0000ff;">else</span></li>
<li> {</li>
<li> alert(<span style="color: #a31515;">"Sorry, the Google Maps API is not compatible with this browser"</span>);</li>
<li> }</li>
<li> }</li>
<li></li>
<li> <span style="color: #0000ff;">function</span> add_custom_map(map)</li>
<li> {</li>
<li> <span style="color: #0000ff;">var</span> copyright = <span style="color: #0000ff;">new</span> GCopyright(1, <span style="color: #0000ff;">new</span> GLatLngBounds(<span style="color: #0000ff;">new</span> GLatLng(57.72883324000875,16.471134185791016),<span style="color: #0000ff;">new</span> GLatLng(49.693182016907464,25.556020736694336) ),8, <span style="color: #a31515;">"Karta39"</span>);</li>
<li> <span style="color: #0000ff;">var</span> copyrightCollection = <span style="color: #0000ff;">new</span> GCopyrightCollection(<span style="color: #a31515;">'Map Data:'</span>);</li>
<li> copyrightCollection.addCopyright(copyright);</li>
<li></li>
<li> <span style="color: #0000ff;">var</span> tilelayers = [<span style="color: #0000ff;">new</span> GTileLayer(copyrightCollection , 9, 9)];</li>
<li> tilelayers[0].getTileUrl = CustomGetTileUrl;</li>
<li></li>
<li> tilelayers[0].getCopyright = <span style="color: #0000ff;">function</span>(a,b)</li>
<li> {</li>
<li> <span style="color: #0000ff;">var</span> c= copyrightCollection.getCopyrightNotice(a,b);</li>
<li> <span style="color: #0000ff;">if</span> (!c)</li>
<li> {</li>
<li> c = G_NORMAL_MAP.getTileLayers()[0].getCopyright(a,b);</li>
<li> }</li>
<li> <span style="color: #0000ff;">return</span> c;</li>
<li> }</li>
<li></li>
<li> <span style="color: #0000ff;">var</span> custommap = <span style="color: #0000ff;">new</span> GMapType(tilelayers, <span style="color: #0000ff;">new</span> GMercatorProjection(10), <span style="color: #a31515;">"Custom Map"</span>, {shortName:<span style="color: #a31515;">"1645"</span>});</li>
<li></li>
<li> map.addMapType(custommap);</li>
<li> }</li>
<li></li>
<li> <span style="color: #0000ff;">function</span> CustomGetTileUrl(a,b)</li>
<li> {</li>
<li> <span style="color: #0000ff;">if</span> (b==9 &amp;&amp; a.x&gt;280 &amp;&amp; a.x&lt;290 &amp;&amp; a.y&gt;159 &amp;&amp; a.y&lt;167)</li>
<li> <span style="color: #0000ff;">return</span> <span style="color: #a31515;">"tile_"</span>+a.x+<span style="color: #a31515;">"_"</span>+a.y+<span style="color: #a31515;">"_"</span>+b+<span style="color: #a31515;">".jpg"</span>;</li>
<li> <span style="color: #0000ff;">else</span></li>
<li> <span style="color: #0000ff;">return</span> G_NORMAL_MAP.getTileLayers()[0].getTileUrl(a,b);</li>
<li> }</li>
<li> <span style="color: #008000;">//]]&gt;</span></li>
<li> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">script</span><span style="color: #0000ff;">&gt;</span></li>
<li> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span></li>
<li> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">body</span> <span style="color: #ff0000;">onload</span><span style="color: #0000ff;">="initialize()"</span> <span style="color: #ff0000;">onunload</span><span style="color: #0000ff;">="GUnload()"</span><span style="color: #0000ff;">&gt;</span></li>
<li> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">div</span> <span style="color: #ff0000;">id</span><span style="color: #0000ff;">="map"</span> <span style="color: #ff0000;">style</span><span style="color: #0000ff;">="width: 500px; height: 300px"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">div</span><span style="color: #0000ff;">&gt;</span></li>
<li> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span></li>
<li><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span></li>
</ol>
<p></span><span style="color: #808080; font-size: xx-small;">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><span style="color: #808080; font-size: xx-small;">Source Code Highlighter</span></a>.</span></p>
<p></code></p></blockquote>
<p>Посмотреть пример можно здесь: <a href="http://karta39.ru/map/2/cm.html">http://karta39.ru/map/2/cm.html</a><br />
Стандартная карта:<br />
<a href="http://karta39.ru/blog/wp-content/uploads/2009/01/1.jpg"><img class="alignnone size-medium wp-image-121" src="http://karta39.ru/blog/wp-content/uploads/2009/01/1-300x242.jpg" alt="1" width="300" height="242" /></a><br />
Включён режим нашей карты:<br />
<a href="http://karta39.ru/blog/wp-content/uploads/2009/01/2.jpg"><img class="alignnone size-medium wp-image-122" src="http://karta39.ru/blog/wp-content/uploads/2009/01/2-300x243.jpg" alt="2" width="300" height="243" /></a></p>
<p>Т. к.  добавлен всего один слой, то и отображается наша карта только при одном уровне приближения (это видно по ползунку увеличения слева)</p>
<p>Для ознакомления с другими возможностями вывода своих карт можно почитать [3]. Там показано, как сделать так, чтобы ваш слой был полупрозрачным:</p>
<p>Для этого нужно добавить в <code>add_custom_map</code> следующий код:</p>
<blockquote><p><code><span style="font-family: &quot;Courier New&quot;; color: #000000; font-size: x-small;"></p>
<ol>
<li><span style="color: #0000ff;">var</span> paleLayer = <span style="color: #0000ff;">new</span> GTileLayer(copyrightCollection,12,12);</li>
<li>paleLayer.getTileUrl = CustomGetTileUrl;</li>
<li>paleLayer.getOpacity = <span style="color: #0000ff;">function</span>() {<span style="color: #0000ff;">return</span> 0.5}</li>
<li><span style="color: #0000ff;">var</span> tilelayers3 = [G_NORMAL_MAP.getTileLayers()[0], paleLayer];</li>
<li><span style="color: #0000ff;">var</span> custommap3 = <span style="color: #0000ff;">new</span> GMapType(tilelayers3, <span style="color: #0000ff;">new</span> GMercatorProjection(10), <span style="color: #a31515;">"1645 Mixture"</span>, {shortName:<span style="color: #a31515;">"1645Mx"</span>});</li>
<li>map.addMapType(custommap3);</li>
</ol>
<p></span><span style="color: #808080; font-size: xx-small;">* This source code was highlighted with <a href="http://virtser.net/blog/post/source-code-highlighter.aspx"><span style="color: #808080; font-size: xx-small;">Source Code Highlighter</span></a>.</span></p>
<p></code></p></blockquote>
<p>Вот, в принципе, и всё <img src='http://karta39.ru/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Успехов!</p>
<p><strong>Ссылки:</strong><br />
[1] <a href="http://code.google.com/intl/ru_ALL/apis/maps/documentation/reference.html">http://code.google.com/intl/ru_ALL/apis/maps/documentation/reference.html</a><br />
[2] <a href="http://econym.googlepages.com/index.htm">http://econym.googlepages.com/index.htm</a> &#8211; Google Maps API Tutorial<br />
[3] <a href="http://econym.googlepages.com/custommap.htm">http://econym.googlepages.com/custommap.htm</a><br />
[4] <a href="http://int2e.com/blog/how-to-make-a-site-like-mapwowcom/">http://int2e.com/blog/how-to-make-a-site-like-mapwowcom/</a><br />
[5] <a href="http://mapki.com/wiki/Automatic_Tile_Cutter">http://mapki.com/wiki/Automatic_Tile_Cutter</a><br />
[6] <a href="http://open.atlas.free.fr/GMapsTransparenciesImgOver.php">http://open.atlas.free.fr/GMapsTransparenciesImgOver.php</a></p>
<script type="text/javascript" src="http://odnaknopka.ru/wp/ok2.utf8.js"></script><script type="text/javascript">okbm("http://karta39.ru/blog/2009/01/26/kratkoe-rukovodstvo-po-dobavleniu-sobstvennix-kart-na-google-maps/","Краткое руководство по добавлению собственных карт на Google Maps.")</script>]]></content:encoded>
			<wfw:commentRss>http://karta39.ru/blog/2009/01/26/kratkoe-rukovodstvo-po-dobavleniu-sobstvennix-kart-na-google-maps/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.443 seconds -->

