вівторок, 30 травня 2017 р.

NanoPI первинний запуск

Послав мені Бог до рук МініПК за 10$ (в Україні, нажаль, трохи дорожче) NanoPi Neo 512M. Це повноцінний ПК з RAM=512M, що працює під керуванням ОС Linux і має розміри плати лише якихось 40х40 мм. Але він без відеовиходу і Flash-пам'яті. Тож до нього довелося докупити microSD (16Gb). Для роботи необхідно записати зображення ОС на microSD. Для цього в Linux виконуємо такі нехитрі команди:
$ unzip nanopi-neo_debian-nas-jessie_4.11.2_20170525.img.zip | dd bs=1M of=/dev/mmcblk0 status=progress
$ sync

Вставляємо отриману microSD у відповідний слот NanoPI, подаємо живлення і насолоджуємося блиманням світлодіода, що відповідає за індикацію роботи. Підключивши прилад до мережі я виявив, що він не прописаний на DHCP сервері (а прив'язка у ньому зроблена до MAC-адрес), тому постала задача визначити, яка ж ця MAC-адреса в цього екземпляра NanoPI. З боку DHCP сервера я вирішив переглянути, кому в мережі не вдалося отримати IP-адресу. Команда перегляду логів:
$ cat /var/log/syslog | grep DHCPDISCOVER
Видала вона щось схоже на:
May 30 08:57:08 nvcamc dhcpd: DHCPDISCOVER from 00:11:2f:82:e2:a2 via eth0 May 30 10:06:03 nvcamc dhcpd: DHCPDISCOVER from 02:81:ca:d4:e6:44 via eth0: network 192.168.0.0/24: no free leases May 30 10:13:58 nvcamc dhcpd: DHCPDISCOVER from 02:81:ca:d4:e6:44 via eth0: network 192.168.0.0/24: no free leases May 30 10:14:02 nvcamc dhcpd: DHCPDISCOVER from 02:81:ca:d4:e6:44 via eth0: network 192.168.0.0/24: no free leases May 30 10:14:12 nvcamc dhcpd: DHCPDISCOVER from 02:81:ca:d4:e6:44 via eth0: network 192.168.0.0/24: no free leases May 30 10:14:21 nvcamc dhcpd: DHCPDISCOVER from 02:81:ca:d4:e6:44 via eth0: network 192.168.0.0/24: no free leases

Тепер зрозуміло, хто "незаконно" підключився до мережі і хоче мати IP. Після внесення необхідних зміна на DHCP сервері мініПК успішно отримав IP-адресу і став доступний для роботи по мережі. Перевіряємо, його роботу через веб-інтерфейс за адресою http://xxx.xxx.xxx.xxx:8888:
Так! Воно працює. Доступ до мальоти є також по ssh, та через openmediavault (який працює на 80-му порті веб-сервера NanoPI).

четвер, 11 травня 2017 р.

OSM tile server

GoogleMaps візуалізація - гарна річ для вашого веб проекту. Але що робити тим, хто хоче скористатися мапами в локальній мережі без доступу до інтернет? openstreetmap.org - відкрита мапа світу - проект, де кожен може внести свій вклад у її розвиток, а також скористатися результатами роботи спільноти. Та на сайті застерігають від грубої закачки великих об'ємів даних через непомірне навантаження на сервери. Натомість рекомендують створити власний tile-сервер. Це може бути будь-який веб-сервер, з розміщеними на ньому картинками - шматочками мапи з різними рівнями деталізації або повноцінна рендер-система. Розгортання одного з таких tile-серверів попри не складний процес змарнувало мені купу часу. Розмістивши його в локальній мережі я отримав можливість використання мап без доступу до інтернет. Ось послідовність кроків для Xubuntu 16.04 LTS.

Я обійшовся звичайним ноутбуком з ОЗП=2Гб, HDD>120Гб та 2-ядерним процесором.

1. Скачуємо останню версію необхідної нам вибірки з цілої планети із сайту http://download.geofabrik.de/europe/ukraine.html

wget http://download.geofabrik.de/europe/ukraine-latest.osm.pbf

2. Встановлюємо необхідне ПЗ, створюємо БД та імпортуємо дані. Саме так - вся інформація для побудови мапи будь-якої деталізації міститиметься в нашій базі даних PostgreSQL.

sudo apt install postgresql postgresql-contrib postgis postgresql-9.5-postgis-2.2 openstreetmap-carto osm2psql
sudo -u postgres -i
createuser osm
createdb -E UTF8 -O osm gis
psql -c "CREATE EXTENSION hstore;" -d gis psql -c "CREATE EXTENSION postgis;" -d gis 
su - osm
/usr/share/openstreetmap-carto-common/get-shapefiles.sh 
osm2pgsql --slim --flat-nodes tempnodes.bin -C 1000 ukraine-latest.osm.pbf
 
3. Фіксаємо помилки недостаючих шрифтів:
sudo sed -i 's|<Font face-name="Arundina Sans Bold"/>||g' /usr/share/openstreetmap-carto-common/style.xml
sudo sed -i 's|<Font face-name="Arundina Sans Italic"/>||g' /usr/share/openstreetmap-carto-common/style.xml
sudo sed -i 's|<Font face-name="Arundina Sans Regular"/>||g' /usr/share/openstreetmap-carto-common/style.xml
sudo sed -i 's|<Font face-name="Droid Sans Fallback Regular"/>||g' /usr/share/openstreetmap-carto-common/style.xml
sudo sed -i 's|<Font face-name="gargi Medium"/>||g' /usr/share/openstreetmap-carto-common/style.xml sudo sed -i 's|<Font face-name="Mallige Bold"/>||g' /usr/share/openstreetmap-carto-common/style.xml
sudo sed -i 's|<Font face-name="Mallige Normal"/>||g' /usr/share/openstreetmap-carto-common/style.xml
sudo sed -i 's|<Font face-name="Mallige NormalItalic"/>||g' /usr/share/openstreetmap-carto-common/style.xml
sudo sed -i 's|<Font face-name="Mukti Narrow Bold"/>||g' /usr/share/openstreetmap-carto-common/style.xml
sudo sed -i 's|<Font face-name="Mukti Narrow Regular"/>||g' /usr/share/openstreetmap-carto-common/style.xml
sudo sed -i 's|<Font face-name="Tibetan Machine Uni Regular"/>||g' /usr/share/openstreetmap-carto-common/style.xml
sudo sed -i 's|<Font face-name="TSCu_Paranar Bold"/>||g' /usr/share/openstreetmap-carto-common/style.xml
sudo sed -i 's|<Font face-name="TSCu_Paranar Italic"/>||g' /usr/share/openstreetmap-carto-common/style.xml
sudo sed -i 's|<Font face-name="TSCu_Paranar Regular"/>||g' /usr/share/openstreetmap-carto-common/style.xml
sudo sed -i 's|<Font face-name="Unifont Medium"/>||g' /usr/share/openstreetmap-carto-common/style.xml
sudo sed -i 's|<Font face-name="unifont Medium"/>||g' /usr/share/openstreetmap-carto-common/style.xml
sudo sed -i 's|minzoom|minimum-scale-denominator|g' /usr/share/openstreetmap-carto-common/style.xml
sudo sed -i 's|maxzoom|maximum-scale-denominator|g' /usr/share/openstreetmap-carto-common/style.xml
 
4. Корегуємо параметри генерації у файлі generate_tiles.py:
bbox = (22.1288, 44.3904, 40.2181, 52.3754)
style = /usr/share/openstreetmap-carto-common/style.xml

 
5. Створюємо tile_dir:
mkdir ~/osm/tiles -p
 
6. Запускаємо генерацію тайлів:
python ./generate-tiles.py


 
Процес, як виявилося, не такий вже й швидкий. На створення zoomlevel від 0 до 12 у мене пішло 4 доби. Згенеровано близько 150Мб даних. Запускав генерацію частинами для різних рівнів деталізації, але майже без зупинок.

Хто не хоче проходити весь процес, може скористатися вже згенерованими даними, скачавши торент. Максимальної деталізація zoomlevel=12 і є приклад використання OpenLayers.

OpenLayers - JavaScript фреймворк, що дозволяє використовувати дані OpenStreetMap, GoogleMaps та інші у веб-проектах. Власне саме на цій бібліотеці зроблений приклад, що міститься в роздачі.

Побіжно скажу кілька слів про проект OpenStreetMap. На основі даних цього проекту засновано кілька цікавих проектів. Варто звернути увагу на opencyclemap.org - топографічна карта (з ізолініями висот) для туристів. OsmAnd~ - автомобільний навігатор для пристроїв з Andoid, що використовує offline векторні мапи імпортовані з проекту OpenStreetMap.

Джерела:
http://hcmc.uvic.ca/blogs/index.php?blog=11&p=13959&more=1&c=1&tb=1&pb=1
https://github.com/openstreetmap/mapnik-stylesheets
http://bboxfinder.com 
https://f-droid.org/repository/browse/?fdfilter=osmand&fdid=net.osmand.plus