OpenStreetMap Forum

The Free Wiki World Map

You are not logged in.

#51 2013-11-25 08:31:27

freeExec
Moderator
From: Ульяновск,Модератор всех слоёв
Registered: 2012-07-31
Posts: 7,424

Re: Alacarte, рендеринг своих карт средствами OSM

Alexandr Zeinalov wrote:

В городах пустых тайлов явно меньше чем в среднем по больнице.

Городов на всю Россию кот наплакал. В основном или пусто или лес.

Offline

#52 2013-11-25 10:17:43

chnav
Member
From: Moscow, Russia
Registered: 2010-03-18
Posts: 2,785

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: 7,424

Re: Alacarte, рендеринг своих карт средствами OSM

freeExec wrote:

Alacarte Server (обновлён)
Необходимая особенность .. , т.к. рендер шрифтов работает только с одним потоком.
server.num-threads = 1

Больше не актуально, спасибо Chun-wei за патч.

Offline

#54 2013-12-25 08:46:56

chnav
Member
From: Moscow, Russia
Registered: 2010-03-18
Posts: 2,785

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: 7,424

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

freeExec wrote:

У меня нет. Но зачем тебе, только если ты собираешься рассматривать карту на 18 зуме. На больших масштабах довольно сильно грузит процессор для рендеринга, поэтому вряд ли получится что-то адекватное с RaspberryPi.

Хочется экспериментов с картами, в закрытой сети без доступа к интернету(Отображение разнородной телеком-информации с привязкой к узлам доступа на карте)

Поднимать ради мелких задач мапник, postgis и прочее считаю неразумным.
Ручками "лялюкарту" собрать мне не удалось sad

P.S. Mapnik же на малинке запускали...

Offline

#58 2016-04-25 07:46:33

chnav
Member
From: Moscow, Russia
Registered: 2010-03-18
Posts: 2,785

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: Moscow, Russia
Registered: 2010-03-18
Posts: 2,785

Re: Alacarte, рендеринг своих карт средствами OSM

chnav wrote:

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

Board footer

Powered by FluxBB