Własny serwer kafelków

Albo ze źródeł:

https://github.com/mapbox/carto

albo przez npm, o ile się orientuję:

https://www.npmjs.com/package/carto

Uruchomienie carto powoduje następujący błąd. Taki sam dla wersji stabilnej jak i git. Może brakuje jakiejś zależności np. tilemill?

carto
module.js:472
    throw err;
    ^

Error: Cannot find module 'lodash'
    at Function.Module._resolveFilename (module.js:470:15)
    at Function.Module._load (module.js:418:25)
    at Module.require (module.js:498:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/opt/osm/carto/lib/carto/parser.js:3:9)
    at Module._compile (module.js:571:32)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:488:32)
    at tryModuleLoad (module.js:447:12)
    at Function.Module._load (module.js:439:3)

Tym czasem jak by ktoś potrzebował skrypty instalacyjne dla obecnych wersji pakietów do Gentoo proponuję przetestować przygotowaną przeze mnie kolekcję http://bigvo.hopto.org/osm-extra/overlay/geo-2017-01-21.tar.bz2 która dla wygody zawiera również meta pakiet app-admin/osm-geo/osm-geo-1.0.ebuild który pozwala na instalację wymaganych programów do postawienia serwera kafli.

Pakiety instalują się poprawnie poza python-mapnik który to działa jedynie dla pythona2, a powinien dla pythona 3.4 i 3.5 również. Mile widziane propozycje jego poprawienia :wink: No i oczywiście jest również problem z działaniem carto o którym wspominałem wcześniej.

Może to pomoże:

https://lodash.com/

Od jednego extremum do drugiego :confused: Jak panowie od python-mapnika nie przygotowali ani jednego wydania, które można by byłowskazać jako zależność tak w wypadku lodash mamy ich na dzień dzisiejszy 380… https://github.com/lodash/lodash/releases Może jakaś podpowiedź które było by potrzebne oraz na której wersji nodejs by miało bazować?

EDIT:
okazało się, że lodash to nie wszystko i że npm może je instalować zarówno globalnie jak i lokalnie czyli w tym przypadku w katalogu gdzie zainstalowane jest carto. Instalacja lokalna pokazała, że potrzebne jest cały szereg modułów do działania carto, które doinstalowują jeszcze większą liczbę zależności

npm install lodash
@mapbox/carto@0.16.3 /opt/osm/carto
└── lodash@4.17.4

npm install chroma-js
@mapbox/carto@0.16.3 /opt/osm/carto
└── chroma-js@1.2.1

npm install js-yaml
@mapbox/carto@0.16.3 /opt/osm/carto
└─┬ js-yaml@3.7.0
  ├─┬ argparse@1.0.9
  │ └── sprintf-js@1.0.3
  └── esprima@2.7.3

npm install hsluv
@mapbox/carto@0.16.3 /opt/osm/carto
└── hsluv@0.0.1 

npm install semver
@mapbox/carto@0.16.3 /opt/osm/carto
└── semver@5.3.0

npm install mapnik-reference

> mapnik-reference@8.6.1 postinstall /opt/osm/carto/node_modules/mapnik-reference
> node generate.js

@mapbox/carto@0.16.3 /opt/osm/carto
└── mapnik-reference@8.6.1

npm install yargs
@mapbox/carto@0.16.3 /opt/osm/carto
└─┬ yargs@6.6.0
  ├── camelcase@3.0.0
  ├─┬ cliui@3.2.0
  │ ├─┬ strip-ansi@3.0.1
  │ │ └── ansi-regex@2.1.1
  │ └── wrap-ansi@2.1.0
  ├── decamelize@1.2.0
  ├── get-caller-file@1.0.2
  ├─┬ os-locale@1.4.0
  │ └─┬ lcid@1.0.0
  │   └── invert-kv@1.0.0
  ├─┬ read-pkg-up@1.0.1
  │ ├─┬ find-up@1.1.2
  │ │ ├── path-exists@2.1.0
  │ │ └─┬ pinkie-promise@2.0.1
  │ │   └── pinkie@2.0.4
  │ └─┬ read-pkg@1.1.0
  │   ├─┬ load-json-file@1.1.0
  │   │ ├── graceful-fs@4.1.11
  │   │ ├─┬ parse-json@2.2.0
  │   │ │ └─┬ error-ex@1.3.0
  │   │ │   └── is-arrayish@0.2.1
  │   │ ├── pify@2.3.0
  │   │ └─┬ strip-bom@2.0.0
  │   │   └── is-utf8@0.2.1
  │   ├─┬ normalize-package-data@2.3.5
  │   │ ├── hosted-git-info@2.1.5
  │   │ ├─┬ is-builtin-module@1.0.0
  │   │ │ └── builtin-modules@1.1.1
  │   │ └─┬ validate-npm-package-license@3.0.1
  │   │   ├─┬ spdx-correct@1.0.2
  │   │   │ └── spdx-license-ids@1.2.2
  │   │   └── spdx-expression-parse@1.0.4
  │   └── path-type@1.1.0
  ├── require-directory@2.1.1
  ├── require-main-filename@1.0.1
  ├── set-blocking@2.0.0
  ├─┬ string-width@1.0.2
  │ ├── code-point-at@1.1.0
  │ └─┬ is-fullwidth-code-point@1.0.0
  │   └── number-is-nan@1.0.1
  ├── which-module@1.0.0
  ├── y18n@3.2.1
  └── yargs-parser@4.2.1

Ja nie stawiałem sobie serwera kafelków, ale do testowania stylu zainstalowałem Kosmtika, który te wszystkie zależności (w tym Mapnika i CartoCSS) ma już zdefiniowane. To też przydatne narzędzie, więc w razie czego można skorzystać z jego konfiguracji.

Generalnie zajmuje mnie postawienie serwera sporo czasu gdyż walczę by przy tej okazji wszystkie istotne zależności wyłapać i napisać do tego skrypty instalacyjne pod Gentoo (zamieszczone przeze mnie wcześniej w linku ebuildy) by w razie jak ktoś będzie chciał serwer kiedyś postawić miał ułatwione zadanie.

Po dodaniu tych pakietów carto zaczęło śmigać i utworzyło plik osm.xml na podstawie stylu openstreetmap-carto w tym ustawienia fontów

...
  <FontSet name="fontset-0">
  <Font face-name="Noto Sans UI Regular"/>
  <Font face-name="Noto Sans CJK JP Regular"/>
  <Font face-name="Noto Sans Armenian Regular"/>
  <Font face-name="Noto Sans Balinese Regular"/>
  <Font face-name="Noto Sans Bamum Regular"/>
  <Font face-name="Noto Sans Batak Regular"/>
  <Font face-name="Noto Sans Bengali UI Regular"/>
  <Font face-name="Noto Sans Buginese Regular"/>
...

tyle że renderd dziwnie na to zareagował gdyż mimo, że fonty prawidłowo załadował

renderd -f
renderd[11262]: Rendering daemon started
renderd[11262]: Initiating reqyest_queue
renderd[11262]: Parsing section renderd
renderd[11262]: Parsing render section 0
renderd[11262]: Parsing section mapnik
renderd[11262]: Parsing section default
renderd[11262]: config renderd: unix socketname=/var/run/renderd.sock
renderd[11262]: config renderd: num_threads=4
renderd[11262]: config renderd: num_slaves=0
renderd[11262]: config renderd: tile_dir=/var/lib/mod_tile
renderd[11262]: config renderd: stats_file=/var/run/renderd.stats
renderd[11262]: config mapnik:  plugins_dir=/usr/lib/mapnik/input
renderd[11262]: config mapnik:  font_dir=/usr/share/fonts/noto
renderd[11262]: config mapnik:  font_dir_recurse=1
renderd[11262]: config renderd(0): Active
renderd[11262]: config renderd(0): unix socketname=/var/run/renderd.sock
renderd[11262]: config renderd(0): num_threads=4
renderd[11262]: config renderd(0): tile_dir=/var/lib/mod_tile
renderd[11262]: config renderd(0): stats_file=/var/run/renderd.stats
renderd[11262]: config map 0:   name(default) file(/opt/osm/osm.xml) uri(/osm/) htcp() host(tile.openstreetmap.org)
renderd[11262]: Initialising unix server socket on /var/run/renderd.sock
renderd[11262]: Created server socket 4
renderd[11262]: Renderd is using mapnik version 3.0.12
renderd[11262]: DEBUG: Loading font: /usr/share/fonts/noto/NotoSerifArmenian-Regular.ttf
renderd[11262]: DEBUG: Loading font: /usr/share/fonts/noto/NotoSansGujarati-Regular.ttf
renderd[11262]: DEBUG: Loading font: /usr/share/fonts/noto/NotoSerifGujarati-Bold.ttf
renderd[11262]: DEBUG: Loading font: /usr/share/fonts/noto/NotoSansAvestan-Regular.ttf
renderd[11262]: DEBUG: Loading font: /usr/share/fonts/noto/NotoSansOsmanya-Regular.ttf
renderd[11262]: DEBUG: Loading font: /usr/share/fonts/noto/NotoSansGujarati-Bold.ttf
renderd[11262]: DEBUG: Loading font: /usr/share/fonts/noto/NotoSansBalinese-Regular.ttf
...

to jednak później poinformował, że stosownych fontów odnaleźć nie może

...
renderd[11262]: DEBUG: Loading font: /usr/share/fonts/noto/NotoSansTelugu-Regular.ttf
renderd[11262]: DEBUG: Loading font: /usr/share/fonts/noto/NotoSansTelugu-Bold.ttf
Running in foreground mode...
renderd[11262]: Starting stats thread
debug: init_storage_backend: initialising file storage backend at: /var/lib/mod_tile
renderd[11262]: Loading parameterization function for
debug: init_storage_backend: initialising file storage backend at: /var/lib/mod_tile
renderd[11262]: Loading parameterization function for
debug: init_storage_backend: initialising file storage backend at: /var/lib/mod_tile
renderd[11262]: Loading parameterization function for
debug: init_storage_backend: initialising file storage backend at: /var/lib/mod_tile
renderd[11262]: Loading parameterization function for
Mapnik LOG> 2017-01-21 18:40:12: warning: unable to find face-name 'Noto Sans UI Regular' in FontSet 'fontset-0'
Mapnik LOG> 2017-01-21 18:40:12: warning: unable to find face-name 'Noto Sans CJK JP Regular' in FontSet 'fontset-0'
Mapnik LOG> 2017-01-21 18:40:12: warning: unable to find face-name 'Noto Sans UI Regular' in FontSet 'fontset-0'
Mapnik LOG> 2017-01-21 18:40:12: warning: unable to find face-name 'Noto Sans CJK JP Regular' in FontSet 'fontset-0'
Mapnik LOG> 2017-01-21 18:40:12: warning: unable to find face-name 'Noto Sans UI Regular' in FontSet 'fontset-0'
Mapnik LOG> 2017-01-21 18:40:12: warning: unable to find face-name 'Noto Sans CJK JP Regular' in FontSet 'fontset-0'
Mapnik LOG> 2017-01-21 18:40:12: warning: unable to find face-name 'Noto Sans UI Regular' in FontSet 'fontset-0'
Mapnik LOG> 2017-01-21 18:40:12: warning: unable to find face-name 'Noto Sans CJK JP Regular' in FontSet 'fontset-0'
Mapnik LOG> 2017-01-21 18:40:12: warning: unable to find face-name 'Noto Sans Bengali UI Regular' in FontSet 'fontset-0'
Mapnik LOG> 2017-01-21 18:40:12: warning: unable to find face-name 'Noto Sans Devanagari UI Regular' in FontSet 'fontset-0'
...

Jak ten problem naprawić?

EDIT:
Problem z fontami okazał się banalny gdyż po prostu Gentoo nie instaluje wszystkich fontów ttf jakie zawierają się obecnie w pakiecie https://noto-website-2.storage.googleapis.com/pkgs/Noto-hinted.zip

Problem poważniejszy, gdyż baza jest uruchomiona

#/etc/init.d/postgresql-9.6 status
 * status: started
# ps -A |grep postgr
20408 ?        00:00:00 postgres
20411 ?        00:00:00 postgres
20412 ?        00:00:00 postgres
20413 ?        00:00:00 postgres
20414 ?        00:00:00 postgres
20415 ?        00:00:00 postgres

a tym czasem wieści na które wcześniej nawet nie zwróciłem uwagi, a chyba jednak złe

renderd[30418]: An error occurred while loading the map layer 'default': Postgis Plugin: KATASTROFALNY:  rola "root" nie istnieje
Connection string: ' dbname=gis connect_timeout=4'
  encountered during parsing of layer 'landcover-low-zoom' in Layer at line 502 of '/mnt/4tb/nagrania/osm/wmyrda-style/wmyrda.xml'
renderd[30418]: An error occurred while loading the map layer 'default': Postgis Plugin: KATASTROFALNY:  rola "root" nie istnieje
Connection string: ' dbname=gis connect_timeout=4'
  encountered during parsing of layer 'landcover-low-zoom' in Layer at line 502 of '/mnt/4tb/nagrania/osm/wmyrda-style/wmyrda.xml'
renderd[30418]: An error occurred while loading the map layer 'default': Postgis Plugin: KATASTROFALNY:  rola "root" nie istnieje
Connection string: ' dbname=gis connect_timeout=4'
  encountered during parsing of layer 'landcover-low-zoom' in Layer at line 502 of '/mnt/4tb/nagrania/osm/wmyrda-style/wmyrda.xml'
renderd[30418]: An error occurred while loading the map layer 'default': Postgis Plugin: KATASTROFALNY:  rola "root" nie istnieje
Connection string: ' dbname=gis connect_timeout=4'
  encountered during parsing of layer 'landcover-low-zoom' in Layer at line 502 of '/mnt/4tb/nagrania/osm/wmyrda-style/wmyrda.xml'

Ktoś ma pomysł jak się tego pozbyć?

Strzelam, że trzeba będzie w psql zrobić CREATE ROLE root WITH login superuser;

https://ycnrg.org/osm-tile-server-ubuntu-16-04/

Strzał celny!
W zasadzie wydaje się, że wszystko działa gdyż doszło do tego etapu

renderd[15838]: Using web mercator projection settings
renderd[15838]: Using web mercator projection settings
renderd[15838]: Using web mercator projection settings
renderd[15838]: Using web mercator projection settings

Tylko kiedy będą się generować kafelki? Przy odwiedzeniu strony czy da się to jakoś przyspieszyć by czekały gotowe przynajmniej dla tych najpopularniejszych zoomów?

EDIT:
W stylu jeszcze nic nie zmieniłem a tu można powiedzieć cierpię na pewien nadmiar urodzaju w nazwach :slight_smile: Skąd te różnice?
https://justpaste.it/12ogg

Czy ktoś może wie jak spowodować by nazwa obiektu wpierw wyświetlała się w języku polskim[name:pl], następnie przykładowo angielskim [name:en] jeśli polski jest niedostępny i dopiero przy braku tych obu ukazywało standardowe pole [name]?

czy np. taka zmiana była by odpowiednia?

text-name: "[name]";

na

text-name: "'nazwa'";[id=~'.*0$'] {text-name: "[name:pl]";}[id=~'.*1$'] {text-name: "[name:en]";}[id=~'.*2$'] {text-name: "[name]";}

Nie wiem, ale na pewno najpierw trzeba te nazwy wyciągnąć SQL-em z bazy w project.mml.

Jako przykład możesz wykorzystać francuski styl, który jest forkiem osm-carto, i który wyświetla “name:fr”:

https://github.com/cquest/osmfr-cartocss

Ten problem z etykietami jest naprawdę intrygujący. Ciekaw jestem, co go spowodowało (wersja dla niewidzących - bardzo małe landuse i amenity wyświetlają się już na z12). Czyżby problem z PostGIS i way_area albo czymś?

A w ogóle którą wersję osm-carto używasz? Obecnie na serwerach jest wdrożona wersja v3.0.1. Ale faktycznie dziwne z tymi nazwami obiektów wyświetlanymi tak wcześnie.

Pełna lista zainstalowanego softu

dev-db/postgresql-9.6.1-r1
dev-db/postgis-2.3.1
sci-geosciences/mapnik-3.0.9999 [najnowszy git z gałęzi 3.0.x]
sci-geosciences/python-mapnik-0.1.9999 [ostatnia werja współpracująca z mapnik 3.0 czyli git commit ea5fd11]
sci-geosciences/openstreetmap-carto-9999 [najnowszy git dla stylu osm, w sumie z master a nie gałęzi 3.0]
sci-geosciences/carto-9999 [najnowszy git dla softu przygotowującego xml pod www]
sci-geosciences/osm2pgsql-0.92.0
net-libs/nodejs-7.3.0 z modułami współpracującymi z tą wersją do uruchomienia carto

Patrząc po wersjach to może faktycznie problem w tym, że do carto użyłem git z master a nie z gałęzi 3.0. Może również być kwestia translacji projektu na xmla, choć by nie wiem jaka wersja była to tak samo od siebie raczej zrobić nie powinno by te małe obszary tak szybko wyświetlać :wink:

Faktycznie bardziej to skomplikowane niż sobie wyobrażałem. Miałem nadzieję, że za pomocą sed podmienię hurtem wszystkie wartości [name] w plikach mms na coś co przyniesie pożądany efekt, ale jak oglądam https://github.com/cquest/osmfr-cartocss/blob/master/project.mml to takie zapytania sql to już wyższa szkoła jazdy i dość diametralnie różnią się pomiędzy stylami dla takiego samego przypadku czyli “name”: “placenames-medium”

francuski

"table": " /* placenames-medium */ (select way,place,coalesce(tags->'name:fr',tags->'int_name',name) as name, replace(replace(replace(coalesce(tags->'short_name:fr',tags->'short_name', tags->'name:fr',tags->'int_name', name),'Saint-','Sᵗ-'),'Sainte-','Sᵗᵉ-'),'-sous-','-ss-') as nom, to_int(population) as pop, tags->'is_capital' as is_capital, 0 as nbtags from planet_osm_point      where place is not null and place in ('city','town') order by coalesce(admin_level, capital,'9'), place, pop desc ) as placenames",

carto

table: |-
        (SELECT
            way,
            name,
            score,
            CASE
              WHEN (place = 'city') THEN 1
              ELSE 2
            END as category,
            round(ascii(md5(osm_id::text)) / 55) AS dir -- base direction factor on geometry to be consistent across metatiles
          FROM 
            (SELECT
                osm_id,
                way,
                place,
                name,
                (
                  (CASE
                    WHEN (population ~ '^[0-9]{1,8}$') THEN population::INTEGER
                    WHEN (place = 'city') THEN 100000
                    WHEN (place = 'town') THEN 1000
                    ELSE 1
                  END)
                  *
                  (CASE
                    WHEN (capital = '4') THEN 2
                    ELSE 1
                  END)
                ) AS score
              FROM planet_osm_point
              WHERE place IN ('city', 'town')
                AND name IS NOT NULL
                AND (capital IS NULL OR capital != 'yes')
            ) as p
          ORDER BY score DESC, length(name) DESC, name
) AS placenames_medium

EDIT

Niektóre to mnie się nawet spodobały, ale “Pole kwolka” https://justpaste.it/12ppt pod Jarosławiem na z10 to dopiero robi furorę :smiley:

A tak swoją drogą nie chcą mnie się generować kafle na z9 i wcześniejszych

PS Chętnych do przyglądnięcia się stylowi zapraszam na bigvo.hopto.org/osm. Generalnie mam na celu testowanie tu rozwiązań które miały by wcześniej czy później trafić do carto no może po za nazewnictwem gdzie jasna sprawa pole “name” nie ulegnie zmianie.

Francuski fork nastąpił dawno temu i dlatego nie ma najnowszych zmian w wyświetlaniu miejscowości/stolic, które bardzo poprawiły wygląd na niskich i średnich poziomach.

Niemiecki fork jest dla mnie zagadką - podobno jest używany w niemieckim stylu:

https://www.openstreetmap.de/karte.html

ale w kodzie nie zauważyłem myku z nazwami:

https://github.com/giggls/openstreetmap-carto-de

Hm, być może oni łączą kolumny danych zanim trafią do renderowania, co ma tę zaletę, że łatwiej utrzymać zgodność z oryginalnym stylem.

List z innymi stylami na których można bazować znalazłem parę
http://wiki.openstreetmap.org/wiki/List_of_CartoCSS_projects
https://github.com/trending/cartocss

nawet bardzo obszerne instrukcje
https://tilemill-project.github.io/tilemill/docs/manual/carto/
https://www.mapbox.com/blog/create-a-custom-map-of-your-city-in-30-minutes-with-tilemill-and-openstreetmap/
ale mam wrażenie, że tu raczej należy się edukować z postgresa i zadać mu tak pytanie sql by to on wydobył odpowiednią wartość z bazy a po tym jedynie wstawił kolejny dostępny język w pole name.

EDIT
PS Przyszło mnie na myśl pobawić się kosmitikiem. Przyznam, że sposób licencjonowania programu spowodował, że jest to pierwsza licecja jaką przeczytałem od deski do deski :wink:
https://github.com/kosmtik/kosmtik/commit/035bbf4c17a02bbafbedbff87e7c9145f7252882

TileMill zadziała dopiero w wersji z Gita. Stara binarka potrzebowala pliku project.mml w innym formacie i dlatego YAML trzeba było za każdym razem konwertować skryptem.

A jak ci wyszło z Kosmtikiem? Chodzi mi głównie o te nazwy obiektów, które się wyświetlają zbyt wcześnie. Też mi się wydaje, że to musi być sprawa z nieprawidłowym odczytem way area (way_pixels) z bazy.

Kosmitika jeszcze nie uruchomiłem (standardowa instalacja za pomocą npm coś nie do końca mnie zadziałała, albo co bardziej prawdopodobne coś nie umiałem zrobić). Sporo zależności z nodejs do okiełznania jak chce się by pakiety instalowały się globalnie za pomocą systemowego instalatora.

PS. Przygotowałem za to nowszą wersję skryptów do Gentoo http://bigvo.hopto.org/osm-extra/overlay/geo-2017-01-24.tar.xz

Problem z nazwami rozwiązał się można powiedzieć sam. Otóż powtórzyłem operację wgrywania pliku pbf do bazy identyczną komendą tylko, że kilka dni nowszego po czym wygenerowany plik xml bym o 1/3 mniejszy a różnice wykazane poprzez diff faktycznie dotyczyły way_pixels. Nie wiem czy plik pbf sprzed kilku dni okazał się felerny czy też wystąpił jakiś błąd przy jej imporcie niemniej żadnej aplikacji nie wymieniałem.
Zastanawiało mnie również czemu plik xml generuje się aż ponad 7 minut skoro mamy tylko ze zwykłą zmianą formatu to teraz jest to dużo szybsze i trwa ok 12s.

Jak by ktoś był zainteresowany to może rzucić okiem na patche ze zmianami do stylu pod adres http://bigvo.hopto.org/osm-extra/carto-patches/ gdzie będę wrzucał swoje poprawki. Mimo, że to bardziej zabawa niż cokolwiek to jednak kilka prostych zmian wydaje się bardzo sensownych

  • wydłużenie kresek dla okresowych potoków z 4/3 na 5/3 tak by było wiadomo w którym kierunku idą w ich gęstwinie
  • zwężenie potoków by nie miały szerokości rzeki na wcześniejszych zoomach
  • dodałem również wyświetlanie landuse=religious, które jak patrzę w kolorze z place_of_worship również wygląda dobrze
  • rozdzielenie koloru obszarów wodnych od tych oznaczonych liniami.
  • rozjaśnienie koloru trawy by zbliżyć ją bardziej do koloru ziemi niż czegokolwiek więcej co by się tak nie rzucała w oczy
  • man_made=cross - podniesienie o poziom jest zasadne, gdyż jak dla mnie są to obiekty co najmniej wielkości “Krzyży Milenijnych” stąd będące dobrymi punktami orientacyjnymi i warto by im przygotować powiększoną ikonkę krzyża, choć pewnie zdania mogą się tu różnić

Nad kolorystyką pozostałych elementów mówiąc oględnie to można by jeszcze popracować :slight_smile: Mile widziane propozycje najlepiej z patchami gdyż dodam nie znam się na tym na tyle by coś rewolucyjnego przygotować :stuck_out_tongue:

EDIT:
Być może kosmitik czy tilemill robią to lepiej niemniej drobne udogodnienie w postaci kolorowania składni dla edytora nano https://justpaste.it/12te5 dla tych co chcą się przyglądnąć kodowi dla edytowanego stylu. Do pobrania pod http://bigvo.hopto.org/osm-extra/nanosyntax/