You are not logged in.
- Topics: Active | Unanswered
#51 2013-11-25 08:31:27
- freeExec
- Moderator
- From: Ульяновск,Модератор всех слоёв
- Registered: 2012-07-31
- Posts: 8,449
Re: Alacarte, рендеринг своих карт средствами OSM
В городах пустых тайлов явно меньше чем в среднем по больнице.
Городов на всю Россию кот наплакал. В основном или пусто или лес.
Offline
#52 2013-11-25 10:17:43
- chnav
- Member
- From: Russia, mapping Kazakhstan
- Registered: 2010-03-18
- Posts: 3,262
Re: Alacarte, рендеринг своих карт средствами OSM
Поизучал вчера возможности разных программ... Конечно большинство заточено на ubuntu, что для меня чревато "чёрным ящиком", т.е. одноразово всё это запустить в виртуалке смог, но шаг влево-вправо - проблемы решить не смогу.
В то же время обнаружилось что TileMill имеет встроенный рендер на основе кода мапника, но он сознательно сделан без кеширования т.к. в основном используется для отладки стилей. Сидит по адресу и порту
http://localhost:20008/tile/road-trip/{z}/{x}/{y}.png (италиком выделено название проекта-картостиля в TileMill)
Его тайл-сервер можно также запускать фоном без GUI. Соответственно нужно прикрутить tilecache или что-то подобное, а также настроить подгрузку дифов в PostGIS и проверку необходимости обновления тайлов.
PS: ещё бы кэш хранить в одном файле...
Last edited by chnav (2013-11-25 10:33:00)
Offline
#53 2013-12-24 20:42:31
- freeExec
- Moderator
- From: Ульяновск,Модератор всех слоёв
- Registered: 2012-07-31
- Posts: 8,449
Re: Alacarte, рендеринг своих карт средствами OSM
Alacarte Server (обновлён)
Необходимая особенность .. , т.к. рендер шрифтов работает только с одним потоком.
server.num-threads = 1
Больше не актуально, спасибо Chun-wei за патч.
Offline
#54 2013-12-25 08:46:56
- chnav
- Member
- From: Russia, mapping Kazakhstan
- Registered: 2010-03-18
- Posts: 3,262
Re: Alacarte, рендеринг своих карт средствами OSM
freeExec
Спасибо, действительно загружает оба ядра на ноутбуке. :up:
Offline
#55 2014-03-19 20:44:14
- Muz1kand
- Member
- From: Псков
- Registered: 2014-02-05
- Posts: 36
- Website
Re: Alacarte, рендеринг своих карт средствами OSM
А случаем под ARM собрать alacarte кто то не сможет? Интересует под RaspberryPi...
Был бы весьма признателен
Offline
#56 2014-03-20 04:44:01
- freeExec
- Moderator
- From: Ульяновск,Модератор всех слоёв
- Registered: 2012-07-31
- Posts: 8,449
Re: Alacarte, рендеринг своих карт средствами OSM
У меня нет. Но зачем тебе, только если ты собираешься рассматривать карту на 18 зуме. На больших масштабах довольно сильно грузит процессор для рендеринга, поэтому вряд ли получится что-то адекватное с RaspberryPi.
Offline
#57 2014-03-20 10:07:44
- Muz1kand
- Member
- From: Псков
- Registered: 2014-02-05
- Posts: 36
- Website
Re: Alacarte, рендеринг своих карт средствами OSM
У меня нет. Но зачем тебе, только если ты собираешься рассматривать карту на 18 зуме. На больших масштабах довольно сильно грузит процессор для рендеринга, поэтому вряд ли получится что-то адекватное с RaspberryPi.
Хочется экспериментов с картами, в закрытой сети без доступа к интернету(Отображение разнородной телеком-информации с привязкой к узлам доступа на карте)
Поднимать ради мелких задач мапник, postgis и прочее считаю неразумным.
Ручками "лялюкарту" собрать мне не удалось
P.S. Mapnik же на малинке запускали...
Offline
#58 2016-04-25 07:46:33
- chnav
- Member
- From: Russia, mapping Kazakhstan
- Registered: 2010-03-18
- Posts: 3,262
Re: Alacarte, рендеринг своих карт средствами OSM
Замечательный рендер, не требующий танцев с базами, настройками и т.д. Работает быстро, для Windows просто находка.
http://shtosm.ru/all/alacarte/
http://forum.openstreetmap.org/viewtopic.php?pid=329105
К сожалению развитие прекратилось в 2013 году, issues висят годами. Есть несколько досадных недороаботок или багов, которые не позволяют использовать его на полную мощь, хотя и сейчас это достойный инструмент.
AMDmi3, freeExec, akks, Zverik - не могли бы вы довести alaCarte до ума ? Меня при одном взгляде на boost берет оторопь ))
Issues, bugs:
1. Не подписываются замкнутые мультиполигоны - заливка есть, надписи нет.
2. Не рисуются иконки в центре area
2. Заполнение line паттернами image выровнено по экрану, а не по линии: невозможно рисовать стрелки одностороннего движения, обозначать ЛЭП, а также делать линии асимметричными, например обрывы.
3. Функция eval не работает для свойства text, и вообще у eval очень ограниченный список поддерживаемых функций от стандарта.
4. Не поддерживаются class и set. Без них mapcss сильно разрастается т.к. одни и те же условия приходится проверять по нескольку раз (например при анализе surface, smoothness, tracktype и их комбинаций). По поводу set ответил TheMarex, но похоже мы просто не поняли друг друга: я понимаю set как временную переменную для упрощения синтаксиса, а не исправление базы объектов на лету.
Это самые наболевшие проблемы. Еще не хватает макроподстановок типа размера шрифтов, толщины линий - для ретины приходится переделывать размеры и зум. Впрочем этой функции в стандарте MapCSS нет.
Offline
#59 2016-05-16 13:10:41
- chnav
- Member
- From: Russia, mapping Kazakhstan
- Registered: 2010-03-18
- Posts: 3,262
Re: Alacarte, рендеринг своих карт средствами OSM
3. Функция eval не работает для свойства text, и вообще у eval очень ограниченный список поддерживаемых функций от стандарта.
Собрал отладочную версию под винду, выяснилось следующее: программа при парсинге mapcss все значения справа от двоеточия трактует как eval вне зависимости пишится eval явно или нет. Когда все правила обработаны, происходит финальное присвоение значений, и вот тут поля text и shield-text трактуются не как остальные - считается что там находится название тега. Вместо того чтобы использовать в стандарте хотя бы макропеременные чтобы отличить название поля от значения, решили сделать так. Итого конструкции
text: name
text: "na . me"
text: eval (concat("n", "ame")
выдают одинаковый результат т.е. это название _тега_.
Сделал заплатку, чтобы тест трактовался как значение ставлю перед ним underscore.
text: "_name" будет отрендерен как "name". Костыль, конечно ((
diff --git a/src/server/style.cpp b/src/server/style.cpp
index 4bcf30a..b426f92 100644
--- a/src/server/style.cpp
+++ b/src/server/style.cpp
@@ -159,25 +159,39 @@ void Style::finish(GeoObject* associatedObject, shared_ptr<const Stylesheet> sty
if (this->text.str().size())
{
- // text is not null, so do a tag lookup and display the tag value
- auto entry = associatedObject->getTags().find(this->text, boost::hash<MaybeCachedString>(), CachedComparator());
- if (entry != associatedObject->getTags().end()) {
- this->text = entry->second.str();
+ // text is not null, check raw text or tag
+ if (this->text.str().substr(0, 1) == "_") {
+ // raw text after underscore, not a tag
+ this->text = this->text.str().substr(1);
} else {
- // no tag of that name found. display empty text
- this->text = "";
+ // text is not null, so do a tag lookup and display the tag value
+ auto entry = associatedObject->getTags().find(this->text, boost::hash<MaybeCachedString>(), CachedComparator());
+ if (entry != associatedObject->getTags().end()) {
+ this->text = entry->second.str();
+ }
+ else {
+ // no tag of that name found. display empty text
+ this->text = "";
+ }
}
}
if (this->shield_text.str().size())
{
- // shield_text is not null, so do a tag lookup and display the tag value
- auto entry = associatedObject->getTags().find(this->shield_text, boost::hash<MaybeCachedString>(), CachedComparator());
- if (entry != associatedObject->getTags().end()) {
- this->shield_text = entry->second.str();
- } else {
- // no tag of that name found. display empty text
- this->shield_text = "";
+ // shield_text is not null, check raw text or tag
+ if (this->shield_text.str().substr(0, 1) == "_") {
+ // raw text after underscore, not a tag
+ this->shield_text = this->shield_text.str().substr(1);
+ }
+ else {
+ // shield_text is not null, so do a tag lookup and display the tag value
+ auto entry = associatedObject->getTags().find(this->shield_text, boost::hash<MaybeCachedString>(), CachedComparator());
+ if (entry != associatedObject->getTags().end()) {
+ this->shield_text = entry->second.str();
+ } else {
+ // no tag of that name found. display empty text
+ this->shield_text = "";
+ }
}
}
Last edited by chnav (2016-05-16 13:14:47)
Offline