Друк OSM

Спасибі. А можна дізнатися каким именно путем вы шли? Я на цьому сервісі BigMap клацав клацав, але в мене нічого не виходило. Чи це мені англійську треба вчити, чи мабуть руки не з того місця ростуть? ))) У всякому разі спасибі за файл. Буду пробувати друкувати.

там есть ссылка на Perl файл. Скачиваешь его, устанавливаешь Perl, в командной строке переходишь в директории в которой лежит Perl файл и пишешь команду на вывод:

perl mkmap.pl > mymap.png

А яку програму краще встановлювати ActivePerl чи Strawberry Perl, чи немає значення?
Вже встановив першу. А далі ступор. В командній строці щоб перейти в директорії, потрібно вводити dir? Я с командной строкой на вы :frowning:

Краще всетаки Sas.Planet там простіше.
Скину файлик ввечері на мапнік, інші стилі там легко редагуються.

  1. ActivePerl
  2. cmd
cd / # перейти в корень
cd /folder # зайти в папку
d: # сменить диск

  1. Качаєм саму сас.планету, краще качати ночну збірку, там всілякі фічі швидше виходять. лінк - http://sasgis.ru/programs/sasplanet/nightly.php
  2. [о, так тут в стандарті вже мапнік є, нічого качать додатково не треба]
  3. Запускаємо програму і вибираємо саму карту мапніка.

  1. Просто покрутивши зум бачимо який нам масштаб потрібно, в прикладі то 16й

  1. Нажимаємо на виділення області прямоктником(кнопка зверхузліва)
  2. Виділяємо потрібну область.

  1. Справа вибираємо потрібний масштаб для скачки (в даномму випадку 16й), перевіряємо на всяк випадок яку карту тягнемо і натискаємо почати.
  2. Чекаємо поки завантажаться обрані тайли.
    8.1. Інколи через погане з’єднання чи ще якісь помилки тайл може не завантажитись, і треба буде ще раз повторити завантаження. Тому треба натиснути Ctrl+B (виділяється попередньо виділена область і знов 16й зум і завантажити.

  1. Тепер як є що склеювати - склеюємо. Натискаємо Ctrl+B(попередньо виділена область) , вкладка склеїти. Обираємо результуючий формат, куди зберігати, яку карту і якого масштабу. Якщо треба ще й прив’язки до растру склеїного - ставим галки і буде ще надодачу створений файл прив’язки.
  2. Тиснем - Почати, і забираємо файл в місці зберігання.

Якщо потрібні інші стилі, яких немає в стандарті - готовий росказати як створити до них файли в Sas.Planet`і

А можна й мені? :slight_smile: Давно вже використовую SAS.Planet, і хотів би дізнатись як додати сюди стиль Humanitarian.

KKS - дуже дякую. Не чекав такого детального огляду функцій програми. Спасибі велике. Все вдалося, все вийшло, все просто (з вашою допомогою). додаткові стилі теж не помішали б. А от щодо кінцевого результату, ви роздруковували вихідний файл JPEG з цієї програми? Нормальна там якість? Бо на екрані виглядає дещо тускліше ніж сама карта в браузері, а може це мені так здалося.

Спасибо YarNik, но с cmd у меня не сложилось.

Во время операции “склеивания” тайлы карты просто объединяются в одну картинку. Следовательно, качество картинки-результата ровно такое же, как качество тайлов, которые можно увидеть на Стандартном слое, например, на сайте http://openstreetmap.org

Во время склейки можно выбрать формат - доступен не только JPEG, но и PNG, и другие.
Тайлы Стандартного слоя имеют формат PNG, поэтому склеивать их в JPEG - самостоятельно ухудшать качество.

P. S. Если я в чём-то неправ, пожалуйста, поправьте меня.

Для друку необхідно 300dpi. Тайли ж мають лише 72dpi.
Така роздільна здатність годиться лише для широкоформатного друку на білбордах, але аж ніяк не для перегляду з рук.

Та й при друці стиль бажано модифікувати (шрифт зробити меншим, відфільтрувати непотрібні обєкти). Тому як на мене, краще затратити трохи часу і розібратись як підняти локальну базу OSM, ніж чаклувати з SASPlanet

Можна не піднімати локальну базу (які страшні слова), а просто скачати Maperitive та знайти стиль, який найкраще підійде для друку. Там є можливість і скачати потрібний шматок (або вирізати з дампу), і отримати картинку з потрібним dpi, і зберегти у потрібний формат.

Альтернатива Сас.Планети була запропонована тільки тому що був варіант з тим же алогритмом тільки на Perl який сильно заплутаний.
Зрозуміло що якщо можна згенерити вектор, або з вектора в потрібний dpi то це 1000 раз краще.

Забув зовсім за додавання карти до Сас.Планети.

Візьмемо для прикладу з стандартного OSM зробимо MapQuest карту.

  1. Зробимо копію папки оригінального мапнніку \SAS.Planet.Nightly.150804.8929\Maps\sas.maps\Osm\osm_mapnik.zmp\ і назвемо абияк, назва папки невпливає. \SAS.Planet.Nightly.150804.8929\Maps\sas.maps\Osm\mapquest.zmp\
  2. Тепер треба “відрізнити” файли мапніка і нової карти заходимо до файлу \SAS.Planet.Nightly.150804.8929\Maps\sas.maps\Osm\mapquest.zmp\params.txt і правимо:
    2.1 GUID, його можна згенерити онлайн https://www.guidgenerator.com/
    2.2 Змінюємо назви карт для різних мов name, name_en, name_uk - просто текст, пишем що хочем
    2.3 Змінюємо назву папки кешу NameInCache=osm_MapQuest , якщо назву папки не змінити тайли карти донора(мапнік) будуть затиратись новою картою і навпаки, а якщо не затруться то буде калейдоскоп з тайлів різних стилів.
    2.4 Базовий урл. Можна зайти на чудову колекцію http://edward17.github.io/LayersCollection/ вибрати стиль карти і браузері отримати урл конкретного тайлу, в фаєрфоксі то ПКМ - інформація про зображення, або в табличці інформації про сторінку на вкладці мультимедіа. Отримали урл типу: http://otile4.mqcdn.com/tiles/1.0.0/osm/10/598/345.png базовий урл буде DefURLBase=http://otile4.mqcdn.com/tiles/1.0.0/osm/
    2.5 вказуємо який тип даних має повертати запит в нашому випадку залишається тим же ContentType=image/png і розширення файлів Ext=.png
    2.6 якщо потрібно щоб карта була не в підкаталозі ОСМ змінюємо PARENTSUBMENU=OSM на те що потрібно.

Проекції і інше залишаємо таке як є, всі карти ОСМ які я бачив в стандартній Meractor проекції. Ну й кому потрібно підправити копірайти, правиться то в License=

Зберігаєм і закриваєм. В мене вийшло отаке:


[PARAMS]
pnum=116
GUID={e53f7cc8-b0cd-41af-80f1-6b447814ebc0}
asLayer=0
name=MapQuest
name_en=MapQuest
name_uk=МапКвест
NameInCache=osm_MapQuest
DefURLBase=http://otile4.mqcdn.com/tiles/1.0.0/osm/
ContentType=image/png
Ext=.png
projection=1
sradiusa=6378137
sradiusb=6356752
separator=0
UseDwn=1
Sleep=0
DefHotKey=16463
PARENTSUBMENU=OSM
IteratorSubRectSize=8,8
License=(c) OpenStreetMap contributors, CC-BY-SA

Далі відкриваємо файл яким буде генеруватись посилання під конкретний тайл
\SAS.Planet.Nightly.150804.8929\Maps\sas.maps\Osm\mapquest.zmp\GetUrlScript.txt
по стандарту він виглядає так:

begin 
  GetURLBase[8]:=chr(ord('a')+random(3));
  ResultURL:=GetURLBase+'/'+inttostr(GetZ-1)+'/'+inttostr(GetX)+'/'+inttostr(GetY)+'.png';
  
  RequestHead := 
    'User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0' + #13#10 +
    'Referer: http://www.openstreetmap.org/' + #13#10 +
    'Cache-Control: max-age=0' + #13#10 +
    'DNT: 1' + #13#10 +
    'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3' + #13#10 +
    'Accept-Encoding: gzip, deflate';
end.

але частину з підстановкою параметрів реквесту можна викинути. Вона потрібна лише щоб приховати автоматичну скачку купи тайлів і якщо є бан - обійти його.
Тут на паскалі здається описується як генерувати запит.(Сам я не програміст але там все ясно наче)

Дивимось на відоме посилання на тайл і на скрипт, наче й без доопрацюваннь все збігається
http://otile4.mqcdn.com/tiles/1.0.0/osm/10/598/345.png
ResultURL:=GetURLBase+‘/’+inttostr(GetZ-1)+‘/’+inttostr(GetX)+‘/’+inttostr(GetY)+‘.png’;
База/зум-1/Х/У.png таке й в нас

Викідаємо параметри “обману” і “GetURLBase[8]:=chr(ord(‘a’)+random(3));” - яка потрібна лише коли є декілька синхронізованих серверів з однаковими тайлами, щоб не робити навантаження на один. Конкертно ця строка змінює 8й символ базового урл по варіантам (a;b;c) так як в нас тут сервер один - все це викидаєм залишається тільки:

begin 
  ResultURL:=GetURLBase+'/'+inttostr(GetZ-1)+'/'+inttostr(GetX)+'/'+inttostr(GetY)+'.png';
end.

Все запускаємо.

Але перший блін виявився комом:

Так як ми прописали в параметрах що очікуємо формат png, а запит повернув jpeg - нічого не відобразилось. Так буває файл називається .png а насправді він .jpeg . Це навіть файєрфокс показував, але я не звернув на то уваги

Тому в файлі параметрів правимо тип даних на ContentType=image/jpeg залишаючи Ext=.png

Перезапускаємо Сас.Планету і маємо

Якщо щось пішло не так і результату немає, можна знайти на інших картах той тайл який взято за основу, перейти на новостворену мапу і по ПКМ→копіювати в буфер обміну→посилання на тайл основної карти і вже звірити згенерований урл з тим який мав би бути

На форуме SAS Planet есть раздел “Карты, не вошедшие в основной список”

Там есть много чего интересного :wink:

Есть еще проект http://www.mapsurfernet.com/.
Вроде как, на рабочем столе можно из векторных данных нагенерить тайлы (https://www.youtube.com/watch?v=vRS6agTD1j4)

Конкретно в этом случае - у MapQuest как раз есть несколько синхронизированных серверов:

http://otile{s}.mqcdn.com/tiles/1.0.0/osm/{z}/{x}/{y}.png

, где вместо {s} подставляется 1 или 2 или 3 или 4.
Работает в Leaflet, для JOSM -

http://otile{switch:1,2,3,4}.mqcdn.com/tiles/1.0.0/osm/{zoom}/{x}/{y}.png

Тогда для SAS.Planet файл GetUrlScript.txt будет, наверное, таким:


begin 
  GetURLBase[12]:=chr(ord('1')+random(4));
  ResultURL:=GetURLBase+'/'+inttostr(GetZ-1)+'/'+inttostr(GetX)+'/'+inttostr(GetY)+'.png';
end.

Я с синтаксисом не знаком SAS.Planet, поэтому мог написать что-то неправильно. Если это так, то, пожалуйста, поправьте.

Есть, кстати, более… эффективный способ получить адрес тайлов: не кликать правой кнопкой на тайл и не “Копировать URL картинки”, а:

  1. Найти подходящий слой на http://edward17.github.io/LayersCollection/
  2. Скопировать его название
  3. Открыть https://github.com/Edward17/LayersCollection/blob/gh-pages/constants.js
  4. С помощью поиска по странице находим информацию о необходимом слое и копируем его адрес.
    Подсказка: название слоя хранится в свойстве ‘name’, адрес - в ‘address’, поддомены (если они есть) - в ‘subdomains’. Если в адресе присутствует “{s}”, а ‘subdomains’ отсутствует, значит ‘subdomains’ = [‘a’, ‘b’, ‘c’].

*edward17 рад, что вынес всю информацию о слоях в отдельный файл и привёл её в читабельный вид.

Логіка вірна, але змінний символ базового урл - 13й тому вірно буде так:


begin 
  GetURLBase[13]:=chr(ord('1')+random(4));
  ResultURL:=GetURLBase+'/'+inttostr(GetZ-1)+'/'+inttostr(GetX)+'/'+inttostr(GetY)+'.png';
end.

Спасибо за замечание.
Но, разве отсчёт начинается с 1, а не с 0?
Странно.

в тексті наче по нормальному з 1, а в массивах з 0.
з [12] не працює, з [13] - працює.

С чего нормально начинать отсчёт - с 1 или с 0 - очень спорный вопрос :slight_smile:
Например, в Java и JavaScript функция String.charAt(1) вернёт второй символ, а не первый:
http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#charAt(int)
http://javascript.ru/String/charAt
http://www.w3schools.com/jsref/jsref_charat.asp

Аргумент в пользу того, что в этом конкретном случае нужно начинать отсчёт с 1.