Pokazywanie postów oznaczonych etykietą GUI jest dla słabych. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą GUI jest dla słabych. Pokaż wszystkie posty

niedziela, 17 października 2021

Zimno jak w Suwałkach albo sztuka rysowania klimatogramów

Przygotowanie

1. Pobieramy i instalujemy program Gnuplot (wersję pod Windowsa można znaleźć tutaj, program działa też na innych platformach (Linux, macOS, ba, nawet na Androidzie!). Po uruchomieniu Gnuplota wita nas ekran, który bardziej przypomina jakieś środowisko programistyczne – nic dziwnego, bo jest to tak naprawdę prosty język do projektowania wykresów.

Możemy go przetestować, wpisując plot x*x i naciskając 'Enter'. Powinno nam się pokazać okno z ładnym wykresem funkcji kwadratowej.


 2. Zarówno dane jak i skrypt możemy edytować w systemowym Notatniku, ale szczerze polecam Notepad++ albo Geany.

Pobieramy dane

Dane możemy pobrać ze strony Klimadiagramme (po niemiecku) albo Climate Data (po angielsku) – na tej drugiej znajdziemy więcej miejscowości, choć nie jestem pewien, czy są to dane z obserwacji czy z jakichś skomplikowanych modeli matematycznych.

Na potrzeby niniejszego posta, pobrałem sobie dane ze średnią temperaturą i opadami w Suwałkach. Skasowałem pierwszą linię (nagłówek) i ostatnią (dane roczne), dodałem na początku kolejny numer miesiąca, a niemieckie nazwy miesięcy zastąpiłem liczbami rzymskimi. Całość powinna więc wyglądać tak (liczby mogą być oddzielone spacją lub znakami tabulacji, nie ma to znaczenia):

Zapisujemy dane w pliku np. jako suwalki.txt (bezpieczniej nie używać polskich znaków).

Skrypt do generowania wykresu

Otwieramy nowe okno w Notatniku i przeklejamy tam poniższy skrypt.

 

Zapisujemy plik skryptu np. pod nazwą klimatogram.txt w tym samym folderze, co nasz plik z danymi. Teraz otwieramy skrypt z menu Gnuplota, wybierając opcję File -> Open.
Sam proces rysowania odbywa się po cichu i bez komunikatów – w Gnuplocie wyświetli się tylko w nowej linii napis load 'klimatogram.txt', ale w folderze pojawi gotowy plik graficzny z klimatogramem o nazwie ustalonej w skrypcie (suwalki.jpg)

 


Modyfikacje

Jeżeli chcemy przerobić skrypt tak, żeby rysował klimatogram dla innego miasta, to należy w nim zmodyfikować nie tylko tytuł w pierwszej linijce, nazwy pliku z danymi (2 razy w ostatniej linii) czy nazwy obrazka wyjściowego, ale przede wszystkim zakresy dla osi po lewej i prawej stronie diagramu.

Oś x (z miesiącami) pozostaje niezmienna, ale zakresy temperatury (set yrange) i opadów (set yrange2) warto dostosować do strefy klimatycznej – na pewno inaczej będą one wyglądać dla Mumbaju a inaczej dla Anchorage. Podawanie ujemnego zakresu dla opadów wydaje się bez sensu, ale mi osobiście podoba się, gdy ich oś 0 przebiega przez środek diagramu – parametry dla y2ticks wyraźnie podają, że podziałka osi ma się zacząć dopiero od 0, skończyć na 100 i iść co 25 jednostek.

Formaty wyjściowe

Gnuplot obsługuje kilkadziesiąt formatów wyjściowych – zarówno tych przeznaczonych przede wszystkim do druku (PDF), Internetu (SVG) jak i popularnych formatów graficznych (z tych mniej popularnych znajdziemy tu nawet coś dla miłośników AutoCADa (DXF) czy Amigi!). Pełną listę można przejrzeć, wpisując polecenie set term i naciskając 'Enter'.
Jeżeli chcemy podejrzeć od razu efekt pracy programu, a dopiero potem zapisać go na dysku, to można zamienić w linii 14 set term jpeg na set term qt (uwaga – za pierwszym razem otworzenie okna z podglądem zajmuje trochę więcej czasu!).

Aha, Gnuplot przechowuje historię swoich działań – jeżeli chcemy jeszcze raz otworzyć ten sam skrypt, to wystarczy w głównym oknie nacisnąć strzałkę kursora do góry.

Disclaimer

Powyższy skrypt w Gnuplocie nie jest mojego autorstwa, natknąłem się na niego dawno temu w Wikipedii, wśród materiałów podesłanych przez fińską programistkę o nicku windytan. W międzyczasie w samej Wikipedii pojawił się inny, wbudowany sposób prezentowania danych klimatycznych, który nie wymaga już zewnętrznych narzędzi.

Udanych eksperymentów z Gnuplotem!


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!

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.