Pokazywanie postów oznaczonych etykietą Open Source. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą Open Source. Pokaż wszystkie posty

poniedziałek, 30 grudnia 2019

Sylwester w Lututowie

Początek roku to termin wprowadzania zmian na mapie administracyjnej Polski, to znaczy przesuwania granic, zmiany statusu, podziałów i fuzji.

W tym roku na szczęście żadna gmina nie podzieli losu zlikwidowanych przed rokiem Ostrowic, natomiast cztery miejscowości (Lututów, Czerwińsk nad Wisłą, Piątek i Klimontów) odzyskają prawa miejskie, utracone jeszcze w czasach carskich.

To świetna okazja, żeby przyjrzeć się możliwościom, jakie oferuje pakiet języka Python (w wersji 3) o nazwie Matplotlib-Basemap i szybko narysować mapę z nowymi miastami.



Do narysowania powyższej mapki wystarczy ok. 25 linijek kodu w Pythonie.



Instalacja

Instalacja matplotlib-basemap pod Linuksem jest banalna i np. w Ubuntu sprowadza się do zainstalowania paczki dostępnej w repozytoriach systemowych (plus drugiej – dość sporej – z danymi na temat linii brzegowej, rzek, jezior itp.).

Kartografowie z Windows nie mają tak łatwego życia – wersja dostępna przez instalator pip jest dość wiekowa, albo nie zawsze da się zainstalować; osobiście korzystałem z Pythona do celów naukowych o nazwie Anaconda (ze świetnym instalatorem pakietów conda. Można też spróbować zainstalować gotowy pakiet stąd.

Kopalnia współrzędnych

Przy zaledwie czterech punktach na mapie współrzędne można oczywiście wygrzebać z Wikipedii. Gdyby jednak trzeba ich było znaleźć więcej, to polecam plik Excela z Państwowego Rejestru Nazw Geograficznych (plik można legalnie i nieodpłatnie pobrać tutaj, sprawdźcie tylko, czy nie ma jakichś ograniczeń licencyjnych).

Tabela zawiera w tej chwili 265092 nazw geograficznych (np. miast, wsi i ich części) oraz ich współrzędnych. Jest to na tyle ciekawy zbiór, że zasługuje na osobną notkę; mam nadzieję, że ukaże się ona przed kolejnym Sylwestrem.

Uwaga techniczna: współrzędne, zarówno w Wikipedii jak i w pliku PRNG są podane w stopniach i minutach kątowych (np. 51°22'18'' N), więc trzeba je przeliczyć na ułamki dziesiętne (51+22/60+18/3600 = 51.3716666666667). W tym zapisie półkulę południową i zachodnią przedstawia się przy użyciu liczb ujemnych.

Rysujemy mapę

Po zaimportowaniu wszystkich potrzebnych pakietów, możemy zabrać się za rysowanie mapy. Kolejna linia, rozbita na części ze względu na czytelność, zawiera sporo parametrów:
  • projection (odwzorowanie) – tutaj będzie to stary dobry Mercator
  • lat_0 – w tym odwzorowaniu: szerokość geograficzna środkowego równoleżnika
  • lon_0 – w tym odwzorowaniu: długość geograficzna środkowego południka
  • resolution – rozdzielczość high (czyli wysoka, może być też 'l' (low = niska) czy 'c' (crude = toporna)
  • area_thresh to parametr oznaczający jakie obiekty mają być pominięte (tutaj – wszystkie obiekty o powierzchni poniżej 150 km2)
  • llcrnrlon i llcrnrlat to odpowiednio długość i szerokość geograficzna lewego dolnego rogu (lower left corner) mapy, a urcrnrlon i urcrnrlat to długość i szerokość geograficzna jej prawego górnego rogu (upper right corner).


Czas na kropki

Do narysowania punktów i miejscowości potrzebne są trzy listy: z długościami geograficznymi naszych miast, z szerokościami no i z nazwami (etykietami).

W linii 14 program przelicza dane z listy na współrzędne na rysunku, a w następnej rysuje punkty.

W kolejnych liniach program wstawia nazwy miast. Etykiety nie mogą być w tym samym miejscu, co punkty, stąd przesunięcie (podawane, co ciekawe, w metrach): -80000 dla współrzędnej x i +22000 dla współrzędnej y.

Tak naprawdę ciężko jest znaleźć jedno i takie samo optymalne przesunięcie dla wszystkich nazw – powinno ono być inne dla każdego napisu i umieszczone w postaci oddzielnej listy. Problem ten dość ładnie rozwiązano na blogu peak 5390, który był dla mnie sporą pomocą i inspiracją w trakcie pisania tej notki.

Kolorowanie

Kolejne linie programu to polecenia do rysowania wybrzeży (drawcoastlines), granic państwowych (drawcountries, tutaj z opcjonalnie podanym kształtem przerywanych kresek), wreszcie wypełnienia lądów (fillcontinents) i mórz (drawmapboundary).

Oprócz poetyckich nazw kolorów istnieje możliwość wpisania ich numeru RGB. Dodatkowo, kasując linijki i wstawiając odpowiednie polecenie, można stworzyć tło z danych satelitarnych – w stylu mapy Google (bluemarble), tradycyjnej mapy topograficznej (etopo) czy cieniowanej rzeźby terenu (shadedrelief).

Z góry jednak uprzedzam, że tego rodzaju tła w tej skali wyglądają dość mizernie.


Tło ze zdjęć satelitarnych jest dość niewyraźne;



na mapie topograficznej widać wręcz kwadratowe ,,kafelki"...



...a cieniowana rzeźba terenu jest mocno uproszczona (gdzie jest Pas Wyżyn?).


Tego rodzaju tło dużo lepiej sprawdza się w przypadku mapy świata:



Dla ciekawych – kod programu (8 linijek!):



Inna sprawa, że generowanie takiego tła może nam strasznie spowolnić komputer. To chyba największa wada pakietu Basemap – python nie należy do najszybszych języków programowania, a ilość obliczeń, jakich musi tutaj dokonać, jest spora. Zwykła mapa potrafi zatkać komputer na pół minuty, natomiast czas rysowania cieniowanej rzeźby terenu niekiedy jest dłuższy od bloku reklamowego na Polsacie.

Skoro zacząłem już o wadach – nie wiedzieć czemu, polecenie do rysowania podziałki nie działa w każdym odwzorowaniu, co gorsza, programista nie dostaje nawet najmniejszego ostrzeżenia w tej sprawie.

Zapis mapy

Ostatnia linia programu służy do zapisu – format docelowy rysunku (SVG, PNG, JPEG, PDF) program automatycznie rozpoznaje na podstawie rozszerzenia pliku.

Szczęśliwego Nowego Roku!

niedziela, 24 września 2017

Czarno na białym

Kiedy nadchodzi sezon palenia w piecu, zaczynam tęsknić za blokami. Może dlatego dzisiaj notka między innymi o osiedlach, choć niekoniecznie o tzw. wielkiej płycie.

Wbrew temu, co sugerowano na filmie Poszukiwany, poszukiwana, osiedla nie zawsze planowano na zasadzie A jezioro przesuniemy tutaj. Za niektórymi projektami stał konkretny pomysł, jakaś idea urbanistyczna.



Niekiedy po dołożeniu jakiegoś przypadkowego pawilonu handlowego czy wciśnięciu dodatkowego bloku na bezcennych gruntach pomysł ten przestaje być jasny i oczywisty, ale jest jeden sposób, żeby się o tym przekonać: schwarzplan, czyli mapa, na której czarnym kolorem na białym tle zaznaczono układ budynków i nic poza tym. Żadnych dróg, linii tramwajowych czy rzek.

Zaczniemy od poniemieckiego klasyka, czyli wrocławskiego osiedla-ogrodu Sępolno, zbudowanego na planie orła (łatwiej go zobaczyć, gdy się przekręci głowę w lewo) — drobne kropki wewnątrz tego orła, które psują efekt, to dobudowane później garaże, szopy, pomieszczenia gospodarcze itp.



O schwarzplanach i układach miast bardzo ładnie pisał na swoim blogu Marcin Piotrowski, przedstawiając fascynujące tło powstania miasta Brasilii (polecam cały cykl artykułów!), zrobił to tak ciekawie, że w zasadzie wyczerpał temat. W tej notce chciałbym jedynie podać przepis na szybkie narysowanie schwarzplanu przy użyciu bezpłatnego narzędzia Maperitive oraz danych z OpenStreetMap.

1. Instalacja

Pobieramy program Maperitive i rozpakowujemy go. Następnie w katalogu Maperitive, a ściślej w podkatalogu Rules, gdzie znajdują się reguły renderowania map, zapisujemy plik Schwarzplan.mrules. Teraz trzeba uruchomić program i zarejestrować nową regułę, wpisując w wierszu znajdującym się na dole okna polecenie:

use-ruleset location=Rules/Schwarzplan.mrules as-alias=Schwarzplan

i naciskając ENTER.

2. Wybór obszaru roboczego

Przesuwamy mapę w interesującym nas obszar. Można tego dokonać przy użyciu myszki, przydadzą się też przyciski przybliżania i oddalania [+]/[-]. Jeżeli znamy współrzędne geograficzne danego miejsca (w postaci dziesiętnej), możemy od razu przejść tam, wpisując komendę:

move-pos y=szerokość_geograficzna x=długość_geograficzna

Wszystkie kolejne operacje będą domyślnie wykonywane dla widocznego na podglądzie obszaru mapy. Jeżeli go chcemy zmodyfikować albo obejrzeć w pomniejszeniu lub powiększeniu, to należy skorzystać z opcji Set Geometry Bounds w menu Map. Po zmianie powiększenia będzie widać obszar roboczy, zaznaczony czerwoną ramką.

3. Pobranie danych i renderowanie

Po ustaleniu obszaru pobieramy dane z OpenStreetMap — służy do tego opcja w menu Map o nazwie Download OSM Data (Overpass API). Jeżeli operacja zakończy się sukcesem, to na liście warstw oznaczonych gwiazdkami w prawym, dolnym rogu programu pojawi się nowa warstwa o nazwie OSM File.

Teraz w menu Map wybieramy Switch to rules, potem z listy reguł wybieramy Schwarzplan. Można już wyłączyć podgląd warstwy o nazwie Web map, odznaczając gwiazdkę na liście warstw (Sources), w podglądzie Maperitive zostanie już tylko czarno-biały układ budynków.



4. Obszar, skala i format wyjściowy planu

Granice obszaru roboczego, dla którego program pobrał dane OSM oraz wyrenderował je (tzw. Geometry Bounds — czerwona ramka) nia nie zawsze pokrywają się granicami do eksportu (Printing Bounds — niebieska ramka). Żeby ustalić te ostatnie, należy wybrać opcję Set Printing Bounds z menu Map albo kliknąć drugim przyciskiem myszy na czerwoną ramkę i wybrać opcję Place Printing Bounds Here.

Od tego momentu przyciski powiększenia i oddalenia [+]/[-] mają wpływ nie tylko na widok ale też skalę i wielkość eksportowanej mapy.

Pozostaje nam już tylko format rysunku; do wyboru mamy grafikę rastrową PNG albo wektorową SVG (w dwóch wersjach, bo podobno Adobe Illustrator nie zawsze prawidłowo czyta pliki przeznaczone dla Inkscape'a). Jeżeli wybierzemy opcję eksportu z menu Tools, to program domyślnie zapisze schwarzplan w podkatalogu output. Możemy też sami ustalić ścieżkę do zapisu przy użyciu polecenia

export-bitmap file="ścieżka/nazwapliku.png"

5. Problemy miast

Na deser kilka narysowanych naprędce planów.
Rzut oka na mapę Miasteczka Wilanów sprawia, że budzą się we mnie podejrzenia — wszystko jakieś takie zbyt idealne, z drugiej strony budynki prawdopodobnie mają funkcję głównie mieszkalną. Bez wizyty na osiedlu widzę, że wszelkie sklepy, knajpy i punkty usługowe jeżeli są, to schowane na parterach domów. Szkoła, gdzie jest szkoła?



Dla porównania dokładam Podzamcze — sypialnię na obrzeżach Wałbrzycha, podobno jedno z lepiej zaprojektowanych osiedli w Polsce z lat 70'/80'.
W czasach świetności mieszkało tam ponad 40 tys. ludzi, teraz zdaje się została połowa. Widać budynki handlowe, mały budynek na planie krzyża to zapewne kościół; dużo przestrzeni pomiędzy ułożonymi jak szańce blokami daje wytchnienie, ale wiać tam musi strasznie.
Dwie linie małych budynków w górnej części mapy to ciągi garaży — nie zaplanowano ich w trakcie budowy osiedla, więc obstawiam, że na Podzamczu mogą być problemy z parkowaniem.



Analizę Nowej Huty pozostawiam już Czytelnikom.



poniedziałek, 1 maja 2017

Mapyrus - schemat połączeń kolejowych

Do rozpracowania Mapyrusa zabrałem się już jakiś czas temu; na pierwszy rzut oka sprawiał wrażenie nowoczesnego — wieloplatformowy, może pracować jako serwer, produkuje ładne grafiki wektorowe itp.

Mętna dokumentacja plus niestabilność tamtej wersji programu sprawiła, że odłożyłem go na półkę. Później jednak wypatrzyłem na stronie internetowej Mapyrusa drobiazg, który mnie zachwycił — przykładowy schemat połączeń komunikacyjnych.

Narysowanie mapy/wykresu sprowadza się do stworzenia skryptu w dość dziwnym języku programowania (czy tylko ja widzę fascynację autora PostScriptem?), potem trzeba ów skrypt uruchomić poleceniem:

java -classpath ścieżka_do_programu\mapyrus.jar org.mapyrus.Mapyrus nazwa_skryptu

Niezwykle intuicyjne, prawda? Na szczęście można wstawić to polecenie do jakiegoś programu wsadowego (np. mapka.bat) i później uruchamiać go normalnie, klikając myszką.

Nie pisałem własnego skryptu, przerobiłem jedynie odrobinę przykład o nazwie mapview3.mapyrus dołączony do dokumentacji tak, żeby obsługiwał polskie znaki i żeby układ wykresu był pionowy. W jednym folderze ze skryptem powinien znaleźć się oddzielny plik z listą stacji (oba przykładowe pliki można pobrać stąd). Aha, dużo ładniejszy wynik uzyskamy w formacie SVG, wystarczy zmodyfikować w jednej z ostatnich linii skryptu po poleceniu newpage najpierw nazwę formatu, potem nazwę pliku.



Linia kolejowa 285 jest jedną z ładniejszych w Polsce, obecnie trwają prace nad jej przywróceniem do użytku. Malownicze wiadukty już dawno docenili ludzie z Sowiogórskiego Bractwa Kolejowego, którzy na tej trasie organizują Mistrzostwa Polski w  Drezynowaniu.