Renderowanie - prośba o pomoc

Witam wszystkich serdecznie,
Od pewnego czasu pracuję nad mapą szlaków turystycznych. Używam w tym celu Tilemilla z bazą postgis. Wszystko działa w miarę poprawnie jednak nie mogę poradzić sobie z jedną rzeczą i czuję, że jest to nie do przeskoczenia w Tilemillu. Chodzi mianowicie o renderowanie szlaków, które są odsunięte od drogi. W przypadku jednego czy dwóch szlaków na jednej ścieżce jest jeszcze w miarę ok natomiast przy trzech i więcej zaczyna to beznadziejnie wyglądać…
Oto przykład:

http://pomorskieszlaki.pl/#16/53.7066/16.6927/osm-rowerowe-piesze-ddr

Chodzi konkretnie o to miejsce gdzie 5 szlaków skręca z południa na zachód.
Tworzą się artefakty, kropki nachodzą na siebie i bardzo kiepsko to wygląda.

Cenię sobie Tilemilla jednak nie posiada on takiej opcji, którą znalazłem. Chodzi mi o funkcję "parallel curve’. Polega ona na tym, że linie odsunięte od drogi nie tworzą takich jakby pętli na zagięciach się linii.

Widać to np. na poniższym rysunku.

http://projects.haskell.org/diagrams/doc/images/ec3e386dda6c7ecc.png

Linie odsunięte (niebieska) zachodzą na siebie a mi chodzi o to aby w miejscu ich przecięcia połączyły się i nie tworzyły przedłużeń.
Nie bardzo wiem, gdzie tego szukać, może ktoś z was, z większą wiedzą jest w stanie mi coś doradzić?
Tu jeszcze inny przykłąd offsetu

http://cs.smith.edu/~orourke/MathOverflow/IllustratorOffset.jpg

Jak widać w tej pętelce po lewej, wypełnienie jest wygenerowane poprawnie i nie próbuje się na siłę połączyć z oryginalną linią i nie tworzy przecięć i przedłużeń.

Z góry serdecznie dziękuję za wypowiedzi i jakąkolwiek pomoc.
Pozdrawiam! :slight_smile:

Nie korzystalem z tilemilla, ale jesli mozesz w nim zmienic postac zapytania sqlowego, to w tym zapytaniu mozesz polaczyc te segmenty drog za pomoca ST_Union i GROUP BY. Wyraznie z jakiegos powodu postgis albo tilemill podzielil linie na jak najmniejsze segmenty i od kazdej tworzy oddzielny rownolegly segment.

balrog-kun dziękuję za odpowiedź. Dzieli je na mniejsze fragmenty ze względu na konwersję relacji na drogi. Robię to za pomocą skryptu. Dzięki temu jeśli na danej drodze występuje np. 5 szlaków to do każdego osobno dodawana jest kolejna cyferka - dodatkowy tag. Dzięki temu w tilemillu mogę później ustawić inną odległość offsetu dla każdej cyferki.

Właśnie się zastanawiam, czy mogę w tilemillu zastosować tą funkcję:

http://postgis.net/docs/ST_OffsetCurve.html

Obecnie mam zwykłe zapytanie

( SELECT *
FROM planet_osm_line
WHERE route IN (‘bicycle’)
) AS data

Sproboj pozniej je polaczyc, czy to w skrypcie czy w zapytaniu. Przy okazji to samo robi skrypt osmapy, https://github.com/balrog-kun/OSMapa-Topo/blob/master/copy_tracks_simple.py, moze sie przyda.

ST_OffsetCurve prawdopodbnie da taki sam wynik dla pojedynczych prostych segmentow.

Jestem zielony z postgisa, nie mam pojęcia jak napisać takie zapytanie. Zastanawiam się czy to co proponujesz czyli użycie ST_Union połączy tylko te linie, które się stykają? Są miejsca gdzie szlaki mają dziurę i nie chciałbym w tych miejscach połączeń w linii prostej. Czy ktoś z was jest w stanie pomóc mi skonstruować takie zapytanie? :slight_smile:

Nie zmieni geometrii tylko rodzaj objektu np. na LINESTRING jesli uda sie wszystko polaczyc w jedna linie, albo MULTILINESTRING. ST_Collect moze byc w tym przypadku lepsze, sproboj czegos w stylu:

(SELECT ST_LineMerge(ST_Collect(way)) AS way, route, colour, itd
FROM planet_osm_line
WHERE route IN (‘bicycle’)
GROUP BY route, colour, itd
) AS data

Gdzie “itd” to pozostale tagi ktorych uzywasz.

Dzięki balrog-kun to mi sporo wyjaśniło. Udało mi się stworzyć takie zapytanie i faktycznie działa. Szlaki wyglądają dużo lepiej, bo odcinki o tych samych tagach zostały połączone i zachowują ciągłość. Jedyny problem jaki jeszcze mam to jeśli na jednej drodze występuję więcej niż jeden szlak. Korzystam ze skrypu Popeja (awk), który przypisuje kolejną cyferkę do danego szlaku w przypadku gdy na jedej drodze jest więcej szlaków. Działa to w ten sposób: pierwszy szlak nie dostaje cyferki, drugi dostaje cyfrę 2 i kolejno dalej. Dzięki temu można skonfigurować offset dla każdego kolejnego szlaku. Problem w tym, że pierwszy szlak nie dostaje cyfry więc te odcinki ulegają złączeniu nawet jeśli są odcinki gdzie występuję więcej niż jeden szlak. Wtedy występuje taka sytuacja :

http://pomorskieszlaki.pl/#16/54.2288/18.3226/osm-rowerowe

Ten fioletowy odcinek powinien być przerzucony na drogą stronę (północną).

Zastanawiam się czy w postgisie jest opcja wychwycenia odcinków o takiej samej geometri i na tej podstawie przyporządkowanie jakiegoś atrybutu?

Mozna oczywiscie zrobic GROUP BY way, ale nadal nie widze sensu dzielenia drog na odcinki, lepiej grupowac po ID drogi tak jak to robi skrypt ktory linkowalem. Wtedy w stylu nie musisz juz nic robic, skrypt zalatwia wszystko w czasie importu.

Ok, zrobiłem coś podobnego w postgisie :slight_smile: udało mi się ładnie pogrupować po ID. Postgis jest świetny, udało mi się też policzyć odległości szlaków (na razie rowerowych). Z dumą prezentuję swoje wypociny :slight_smile:

http://pomorskieszlaki.pl/#8/54.122/17.309/osm-rowerowe

Można kliknąć na szlak i pojawia się info. Mapa obejmuje na razie dwa województwa.

Nikt w kraju poza pomorskim nie potrzebuje czegoś podobnego? Szkoda się pewnie ograniczać z takim fajnym narzędziem.

Dobra robota, Wojtas82,
dziękuję i pozdrawiam!

Marek

Cała Polska jest do zrobienia, na mojej obecnej maszynie wyrenderowanie 3 warstw (rowerki, piesze i ddry) 2 województwa, zajmuje jakieś pół godziny. Cała Polska to pewnie z 2 godziny. Jestem amatorem i niestety lepiej tego zrobić nie umiem. Cieszę się, że w ogóle działa w miarę sprawnie. Druga sprawa to przebiegi szlaków. Mozolnie robiłem woj. Pomorskie i sprawdzałem szlak po szlaku. I jakoś to tam wygląda. Czasem są takie kwiatki, że ręce opadają. Mam wrażenie, że nowicjusze jak edytują to nie zwracają uwagi na relacje i potem się robi syf. Ba, nawet sam się złapałem na takich akcjach jak zaczynałem. Druga kwestia to dodawanie tras rowerowych, które nie istnieją w terenie bo takie też się trafiają. Z bomby powinny mieć state=proposed. Nie usuwam takich tras bo mogą być przydatne dla innych. Dziękuję za dobre słowo.

http://pomorskieszlaki.pl/#17/54.69471/18.68076/osm-ddr - tutaj nie oznacza drogi rowerowej w stronę Helu.

Dzięki za info. Wyłapanie wszystkich kombinacji rowerowych to niezła rzeźba. Dodam niebawem i dam znać. Jak już wszystko dopracuję to zrobię chyba całą PL bo zaczyna to jakoś wyglądać. Będę wdzięczny za inne nie wyświetlające się kombinacje.

Droga rowerowa, to jaki znak? Bo według mnie, za dużo jest tego na mapie. Rozumiem, że dajesz to wtedy gdy jest path,segregated=yes.
Ale ja renderowałbym to jako ciąg p-r.

Droga rowerowa jedynie tu na przykład https://tinyurl.com/h4snhkw (dałem specjalnie blisko Ciebie :smiley: ).
Zwłaszcza w kontekście ostatniego wyroku z Sopotu.

Czy zupełnie coś innego miałeś na myśli?

Chciałbyś renderować drogi dla rowerów jako ciągi pieszo-rowerowe? A to dlaczego? W Polsce ludzie nie jeżdżący rowerami nie rozumieją różnic między różnymi drogami rowerowymi. Nawet ci co mają prawo jazdy mają z tym problem, co skutkuje dużą śmiertelnością oraz wyzwiskami na drodze gdy kierowca nie tykający roweru zabiera się za edukowanie. Drogi dla rowerów oznacza się znakiem C13 i C13/C16 z kreską pionową.Ciąg pieszo-rowerowy to nazwa nie występująca w prawie drogowym jak np. ustawie PORD. To nazwa techniczna używana w przepisach budowlanych np dotyczących budowy dróg, która oznaczała to samo co “droga dla rowerów i pieszych” przez co zatarto różnicę między dwoma rodzajami ddrip co doprowadziło do wielu patologii w zakresie oznakowania poziomego czy wyroków sądów. Nawet nowelizacja PoRD z ok 2010 była tak interpretowana aby nagiąć ją do dawnego sprzecznego interpretowania co to jest ddrip, a co to ddr. W efekcie trzeba było poprawić rozporządzenie o znakach aby raz na zawsze ustalić, że ddrip czyli c p-r, to tylko nieseparowana ścieżka biegnąca po chodniku (C13/C16 z kreska poziomą) czyli wrócono do interpretacji sprzed 2003 r która była intuicyjna. Od tego czasu stało się powszechniejsze używanie określenia cp-r jako zamiennika dla nieseparowanej ddrip.Wcześniej nazywano drogi gdzie rowerzysta musiał ustępować pieszym śmieszkami, a teraz tę rolę przejął cp-r.

Akurat nie wiem co to za wyrok, ale wiem, że przez lata sądy wydawały złe wyroki, bo w podobnych sprawach w każdym województwie były inne orzeczenia.Takie polskie prawo, że nie występuje tu precedens, a gdy powiesz w sądzie, że stosowałeś się do wcześniej publikowanego orzeczenia to sędzia Ci odpowie, że każda sprawa jest inna i ważne co on orzeka w sprawie Twojej winy.
Z pewnością droga dla rowerów to nie tylko taka jak wskazujesz na google i na dodatek używasz określenia poza prawnego, bo drogą rowerową jest wszytko co przeznacza się dla rowerów, ale nie wszystko jest “drogą dla rowerów”.
Wiem o pracach nad ustawą aby zmienić nazewnictwo ścieżek aby właśnie drogi rowerowe nie myliły się z drogami dla rowerów.Sądzę jednak, że po wydaniu rozporządzenia o znakach już taka potrzeba doprecyzowania nazewnictwa nie jest taka konieczna.
Może należałoby zrezygnować z zamiennego stosowania cp-r i ddrip, bo to konserwacja dawnego bałaganu…

Trochę poza tematem to nie rozumiem dlaczego tak wielu maperów wprowadza chaos i do chodników dodaje tagi bicycle=yes i nie chodzi tu o błędne tagowanie ddrip ale o jakąś manię, co utrudnia renderom wyłapanie typowych sytuacji gdzie pod znakiem C16 jest tabliczka T22 (Droga dla pieszych+Nie dotyczy rowerów).
Ten problem też rozwiązuje rozporządzenie o C13/C16, bo chodziło o nieobowiązkową jazdę po chodniku, więc teraz znaki C16+T22 tracą sens. Może zostawią te C16+T22 tam gdzie nie można postawić C13/C16 z powodu zbyt wąskiego chodnika.

< w tym miejscu była długa odpowiedź na moralizatorską przemowę benka-vel-rowers, ale to nie miejsce aby o tym dyskutować >

Przypomnę jedynie Wojtkowi moją sugestię, aby rozróżnić może wszystkie 3 drogi rowerowe jakie u nas istnieją - albo nawet cztery (ten ostatni przykład benka c16+t22).

Moje założenie było takie aby uprościć to sprawy rowerowe jak najbardziej.
Oczywiście mógłbym zrobić render z dziesięcioma albo nawet więcej kombinacjami ale wprowadzi ona tylko chaos dla potencjalnego odbiorcy mapy. Miało być uproszczone. Kierowałem się taką zasadą. Jeśli jest ddr separowana z chodnikiem to jest oznaczona jako ddr, jeśli jest sama ddr, to tak samo, jeśli ciąg pieszo-rowerowy lub chodnik z dopuszczeniem rowerów to kreska kropka, pasy rowerowe i kontraruch też osobno (jak w legendzie). Dla mnie te 4 kombinacje najczęściej występują w terenie, po za tym nie chcę robić 2-stronicowej legendy :slight_smile: Trafiłem ostatnio na jakiś talk o ddrach i kombinacjach i powiem szczerze, że jest tego za dużo. Ja to w miarę ogarniam już i wy pewnie też ale przyjdzie świeżak i może zrobić meksyk na mapie na zupełnej nieświadomce. Pokój :slight_smile:

EDIT: Tak w ogóle to chciałem to zrobić jako mapę wektorową ale mapbox jest jakiś dziwny… Przeniosłem dane i styl do mapboxa ale utknąłem w momencie eksportu…I jak to potem wyświetlić w Leaflecie (nie chcę korzystać z serwera mapboxa bo mam swój )?

Od 8 października ub.r. ciąg p-r z rozdzielonym ruchem to z definicji chodnik i droga dla rowerów, biegnące obok siebie.
Czyli jako ciąg p-r powinniśmy oznaczać tylko takie ze wspólną powierzchnią, bez podzału na część rowerową i pieszą.