Друк OSM

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.