Publicerad den Lämna en kommentar

Sätt upp en ClassicPress server

Vill man ha en egen webbsida lokalt, eller ut på Internet så kan man anlita ett hostingföretag, eller sätta upp servern själv. Oavsett vilket så är chansen stor att WordPress kan vara något som passar som bas för sidan. Eller det kanske var det fram till förra veckan…

Med Gutenberg i ”core” så är det många som söker andra alternativ och då kan ClassicPress vara ett sådant alternativ. Detta tänkte jag kika närmare på här.

Jag börjar med en fräsch Ubuntu Server 18.04 så skall vi se hur många rader terminalkommandon som behövs innan vi är framme vid ett gränssnitt i en webbläsare.

sudo apt install mysql-server apache2
apt-get install php libapache2-mod-php php-mysql
wget https://github.com/ClassicPress/ClassicPress-release/archive/1.0.0-beta1.tar.gz
tar -xvzf 1.0.0-beta1.tar.gz
sudo mysql
# create database classicpress;
# create user 'classicpress'@'localhost' identified by 'password';
# grant all on classicpress.* to 'classicpress'@'localhost';
# flush privileges;
# quit
sudo rm /var/www/html/index.html
sudo cp -R ClassicPress-release-1.0.0-beta1/* /var/www/html/
sudo service apache2 restart

Några kommandon ovan innebär att du skall mata in lösenord och liknande och några kommandon skrivs i databasterminalen (dessa presenteras med # först på raden).

Skärmklipp från 2018-12-07 17:20:28

Nu kan man fortsätta i en webbläsare som pekar på serverns IP adress. När man klickar på ”Let’s go!” så får man fylla i namnet på databasen (classicpress), ange ett användarnamn (classicpress) och ett lösenord (password), sedan är det bara att gå vidare.

Jag fuskade lite här eftersom skriptet inte hade skrivrättigheter på servern genom att sätta fullständigt skrivrättigheter på hela webbkatalogen (sudo chmod 777 -R /var/www/html/), vilket inte är att rekommendera, om man inte är lat, bara vill testa och struntar i säkerheten.

Skärmklipp från 2018-12-07 17:22:36.png

Tja, svårare än så var det inte.

När man kör installationen så skapar man en sida, väljer en användare och ett lösenord för användaren, sedan är det klart!

Skärmklipp från 2018-12-07 17:29:41.png

Nu kan man utan problem fortsätta som man är van från WordPress 4.9, utan tillstymmelse av Gutenberg.

Just det. Om du vill uppdatera, installera nya teman och tillägg så behöver du även sätta upp en ftp till din webbsökväg och det enklaste är att skapa en ny användare med sin hemmakatalog i den aktuella katalogen.

sudo apt install vsftpd
sudo useradd -d /var/www/html/ classicpress
sudo passwd classicpress

Glöm inte att lägga till ”skrivrättigheter” i /etc/vsftpd.conf och starta om tjänsten. Det är bara ett ”#” tecken som skall tas bort i början av konfigurationsfilen (vid #write_enable=YES).

I stället för att öppna upp webbkatalogen för alla så kan du om du skapade användaren ovan innan du startar webbgränssnittet även sätta denna användare som ”ägare” av katalogen.

sudo chown classicpress /var/www/html/
sudo chgrp classicpress /var/www/html/

Det finns säker en massa man måste justera och fixa med exempelvis php inställningarna, men det får man ta medan man provar ut och driftsätter sidan. Frågan är bara hur sjutton man migrerar från WordPress till en egen webbserver och få med sig allt (inklusive bilder och media).

Nyhet från Geosupportsystem , orginal inlägg

Publicerad den Lämna en kommentar

Indexkarta med QGIS

Vad är en indexkarta? För länge, länge sedan, när ”Televerket” gav ut kataloger med alla abonnenters telefonnummer, så brukade det även finnas kartor i dessa och de hade ett rutnät som inte var skalenligt. Rutnätet var uppdelat anpassat till sidan och namngivna med bokstäver och siffror. Ofta fanns även en lista med platsnamn som dessutom refererade till vilken ruta platserna fanns i.

I QGIS är det enkelt att skapa ett liknande rutnät på kartor, även om man behöver använda lite uttryck och funktioner för att det skall bli bra.

Vilken karta eller vilken skala du använder spelar absolut ingen roll. Jag börjar med OpenStreetMap och väljer att zooma till Eksjö.

I layouten lägger jag till kartan och den pappersstorlek jag väljer kommer att styra resten av inställningarna, så redan nu gäller det att tänka till. Jag vill ha ett rutnät med 2 cm intervall så baserat på kartelementets storlek så anger jag storleken med datadefinierade uttryck till något jämnt delbart med 2 centimeter.

Skärmklipp från 2018-12-07 10:04:33.png

Detta gör jag för att få jämna (hela) rutor i layouten, eftersom rutorna kommer att skapas baserat på layouten och inte på geografiska koordinater.

Intervallenheten för rutnätet sätts till millimeter (eller centimeter) och intervallet anges i mitt fall till 20 x 20 mm.

Skärmklipp från 2018-12-07 10:07:08.png

Genom att välja kartelementets storlek som en multipel av intervallet så går det jämnt ut.

Som ram väljer jag ”External Ticks” som jag sträcker ut 10 mm. För att även ha en ram runt själva kartan så får jag även kryssa i ”Frame” i kartans grundläggande elementegenskaper. Alternativt använda ramen från ett senare steg nedan.

Skärmklipp från 2018-12-07 10:10:37.png

Varför skapar jag så långa ticks? För att jag vill rama in mina tecken lite trevligare. Jag lägger nämligen till en rektangel i layouten som jag också sätter till en fast storlek, som är 20 mm större än kartelementet. Placeringen kan göras manuellt, eller så sätter man X och Y på samma sätt som storleken, så att ramen justeras till kartan.

Skärmklipp från 2018-12-07 10:17:57.png

Nästa steg blir att lägga till bokstäver och siffror. Här väljer jag att använda bokstäver från vänster till höger och siffror uppifrån och ner (för att det är så vi normalt läser text, och det är så det ser ut i ett kalkylark).

För att skapa ”etiketter” så lägger jag till ett nytt rutnät med samma grund som tidigare, men offset med 10 mm i båda riktningar. Något rutnät skall dock inte ritas ut.

Skärmklipp från 2018-12-07 10:23:26.png

Sedan kommer vi till etiketterna och alla funktioner och uttryck.

Skärmklipp från 2018-12-07 10:26:03.png

Till att börja med så behöver jag skilja på om det är horisontella eller vertikala etiketter, vilket är enkelt att fixa med ett if uttryck.

För bokstäverna så skapar jag en Array med alla bokstäver genom att använda string_to_array funktionen med en ”tom” textsträng som delare, vilket delar upp strängen i enskilda tecken. Observera att denna metod skapar en tom textsträng på index ”0”, så det första tecknet i textsträngen blir index ”1”. Om textsträngen innehåller ”,” för att separera poster i listan, så kommer första posten i strängen att få index = ”0”.

Skärmklipp från 2018-12-07 10:38:46

Från denna array hämtar jag sedan det tecken som motsvaras av rutnätsvärdet med array_get. Jag måste skapa ett uttryck även för detta index. Detta fungerar då avrundningen genom to_int funktionen görs ”uppåt”. Jag skulle också kunna använda ceil för att vara på den säkra sidan i stället för int. Om jag valt att använda ”,” som separerare i strig_to_array, så hade jag här fått välja floor som funktion i stället för att få med index ”0”.

För den vertikala axeln så använder jag samma numeriska funktion för att få siffror. Jag vill dock vända siffrornas ordning, vilket jag kan göra genom att minska (i mitt fall) 14 med det tal som genereras.

Nu återstår bara att justera typsnittet något, så är min indexkarta klar!

Skärmklipp från 2018-12-07 11:01:04.png

Den skarpsynte kan notera att jag ”fuskat” ytterligare lite i bilden ovan…

Det är så att justeringen av etiketter är begränsad till avstånd från kanten, vilket gör att enkelsiffror hamnar med centrum närmare kartan än dubbelsiffror. Detta kompenserar jag något för genom att lägga till mellanslag på båda sidor om siffror mindre än 10.

with_variable('nummer', 14 - to_int(@grid_number/20),
if(@nummer<10, ' '|| @nummer || ' ', @nummer)
)

Ett annat sätt att undvika problemet helt vore att rotera siffrorna så att de skrivs ut vertikalt på sidorna, eller göra en indelning som inte passerar 9…

Nyhet från Geosupportsystem , orginal inlägg

Publicerad den Lämna en kommentar

Kraften med Open Source

Har du hört talas om Gutenberg? I det här fallet menar jag den nya editorn för WordPress 5. Det verkar som att INGEN webbutvecklare som använder WordPress som plattform gillar Gutenberg… Men företaget bakom WordPress har ändå drivit igenom denna editor i den nya versionen av WordPress.

Så företaget bakom WordPress.org har antagligen sneglat på Wix med flera hosting leverantörer och dragit slutsatsen att de måste ändra på plattformen för att kunna konkurrera med dessa om användarna, men man verkar ha glömt alla tredjepartsutvecklare som inte gillar den nya editorn.

Källkoden för WordPress är GPLv2 (eller senare)…

Så gissa vad. Någon har skapat en ”fork” och nu finns ClassicPress.net på nätet.

Skärmklipp från 2018-12-07 15:16:00.png

Hur livskraftigt detta kommer att vara på längre sikt vet jag inte, men liknande saker har hänt tidigare när det varit synpunkter på den riktning ett open source projekt tagit.

När exempelvis skrivbordsmiljön Gnome gick till version 3 med stora förändringar så skapades flera ”forks” på Gnome 2. Det var exempelvis såhär skrivbordsmiljön Mate startade.

Hur ClassicPress kommer att utvecklas är som sagt för tidigt att säga, men med tanke på att det är så otroligt många som har invändningar mot Gutenberg så skulle jag bli förvånad om inte den här, eller någon annan fork kommer att leva vidare under lång tid framöver.

Är du webbutvecklare som använder WordPress för att skapa webbsidor så är du säkert redan medveten om ”problemet”, om inte så kanske du skall kika lite närmare på ClassicPress.

Den här bloggen skrivs med WordPress.com men det är inte jag som administrerar sidan. Det har under en längre tid tjatats om att en ”ny bättre editor” är på väg. Vi får väl se hur detta kommer att påverka mitt arbete med bloggen. Förhoppningsvis så kommer det inte att betyda någonting, annars får vi väl se vad som händer…

Nyhet från Geosupportsystem , orginal inlägg

Publicerad den Lämna en kommentar

Dagens ord: ”ortogonalisera”

Att redigera geometrier i QGIS är riktigt bra! Något som jag tidigare haft lite synpunkter på är att digitalisera byggnader, eller bara ”fyrkantiga” objekt. Hur garanterar man att det blir räta vinklar?

Med de nya ”CAD” verktygen så finns det flera sätt, men även de tidigare metoderna har nu en enkel lösning i och med ”In-Place” redigering.

Först och främst så är det ju enkelt att skapa helt rätvinkliga fyrkanter med ”rektangel från tre punkter”.

Skärmbild från 2018-12-06 13-34-58.png

Klicka på ett hörn, klicka på nästa hörn och dra ut polygonen så den täcker byggnaden och avsluta med högerklick. Enkelt.

Är det mera oregelbundet så går det att använda de avancerade redigeringsverktygen och ”snappa” till jämna vinklar.

Skärmbild från 2018-12-06 13-37-39.png

Men den sista vinkeln är i det närmaste omöjlig att få till om man inte manuellt matar in alla värden i den avancerade digitaliseringspanelen.

Det är här ”ortogonalisering” kommer in. Detta innebär att göra något ”vinkelrät”.

Skärmbild från 2018-12-06 13-39-47.png

Det räcker att byggnadspolygonen kommer ”nära”. Sedan kan man markera de polygoner som skall ”fixas” och köra ”Orthogonalize” i ”in-place” läge (markerad knapp i processverktygen i bilden ovan).

Alla vinklar som är mindre än den angivna kommer antingen att rätas ut till en rak linje, eller krökas till exakt 90 grader.

Detta gör att det inte bara fungerar på oregelbundna rätvinkliga geometrier, utan även på byggnader som har en ”sned” utbyggnad. Sneda vinklar som överstiger gränsvärdet struntar processen i.

Skärmbild från 2018-12-06 13-51-04.png

Här får man vara lite försiktig och tänka efter i vilken ordning man digitaliserar byggnadshörnen så att man får så stor nytta av de avancerade verktygen som möjligt. Börja exempelvis vid en av de udda vinklarna, och inte vid ett rätvinkligt hörn.

Om byggnadens vinkel är under gränsvärdet så kommer det att rätas ut, så om det är små vinklar så får man vara lite noggrannare och sätta gränsvärdet lägre.

Skärmbild från 2018-12-06 14-08-57.png

Tänk också på att det kan vara enklare att skapa flera polygoner och sedan markera och slå ihop dessa till ett objekt.

Jag har märkt att ortogonaliseringsverktyget inte alltid ger rätt resultat… Jag vet inte varför, men det är alltid för former som har en eller flera udda vinklar. Vill man kontrollera resultat som ser lite skumma ut så kan man använda vinkelmätningsverktyget.

Skärmbild från 2018-12-06 14-15-22.png

Vinkelverktyget finns på samma plats som det vanliga mätverktyget, där även verktyget för att mäta area finns. Om man dessutom aktiverar ”snappning” så kan man mäta exakta vinklar med verktyget.

För att fixa ett vinkelfel så hjälper det ibland att bara flytta den brytpunkt som ligger lite fel något, men långt ifrån alltid.

Metoden för att undvika denna typ av problem är att, som nämnts ovan, dela upp komplexa byggnader i helt rätvinkliga komponenter och digitalisera dessa separat först. Lägg till eventuella oregelbundna former och slå sedan samman samtliga till en polygon.

Skärmklipp från 2018-12-06 14:41:24.png

När jag gjorde byggnaden ovan så blev resultatet ändå några extra brytpunkter där jag inte riktigt lyckats få polygonerna att passa in i varandra. Med följden att jag fick några hörn som inte var exakt 90 grader när jag tagit bort överflödiga punkter. Men efter att ha kört ortogonaliseringen på polygonen som helhet så fixades faktiskt alla räta hörn. Det är så det är tänkt att fungera, men av någon anledning så gör det inte alltid det, så var lite uppmärksamma när ni använder verktyget.

Nyhet från Geosupportsystem , orginal inlägg

Publicerad den Lämna en kommentar

Framdriften i handlingsplanens aktiviteter

Den Nationella geodatastrategin beskriver hur vi gemensamt skapar en väl fungerande infrastruktur för geodata i Sverige.

Här kan du ta del av läget och framdriften gällande aktiviteter, bemanning, arbetsinsatser mm inom de olika aktiviteterna i handlingsplanen för geodata 2018-2020.

Nyhet från geodata.se, orginal inlägg

Publicerad den Lämna en kommentar

Migrera PostGIS databasen

Jag har en dator med PostGIS, där databasen ligger på en disk där utrymmet börjar ta slut. Nu har jag lagt till några diskar i en ny RAID partition och tänkte flytta databasen dit.

Jag har monterat min raid på /raid, naturligtvis!

På denna plats skapar jag en katalog ”postgis” där jag vill skapa den nya databasen. Denna katalog måste ”ägas” av användaren postgres.

sudo chown postgres /raid/postgis
sudo chgrp postgres /raid/postgis

Sedan är det dags att skapa en ny databas på denna sökväg.

sudo -u postgres psql
postgres=# create tablespace ts location '/raid/postgis';
postgres=# create database geodata with tablespace = ts;
postgres=# \q

Initiera databasen som vanligt.

sudo -u postgres psql -d geodata
geodata=# create extension postgis;
geodata=# select PostGIS_version();

Det finns säkert flera sätt att flytta data från en databas till en annan, men jag kör ”universalmetoden” att ”dumpa” hela databasen till en fil och sedan läsa in den i den nya databasen.

sudo -u postgres pg_dump old_database > /raid/old_database.sql
sudo -u postgres psql -d geodata -f /raid/old_database.sql

När jag tänker efter så borde jag kunna köra båda kommandon samtidigt med ett ”|” kommando, eftersom jag dumpar och importerar på samma maskin… Ovanstående fungerar dock bra även om man har databaserna på olika maskiner och skall flytta data mellan dessa, eller om man vill ta en backup…

Det brukar bli en massa felmeddelanden när man kör skriptet, men det brukar vara i sin ordning då en del som skriptet försöker skapa i den nya databasen redan finns. Ha tålamod och vänta bara på resultatet. Radera sedan inte något gammalt vare sig i databasen eller den genererade filen förrän allt i den nya databasen är testat.

För mig gick det betydligt snabbare att dumpa den 36 Gb stora sql-filen än att läsa in den.

Ett problem dock! De QGIS stilar som var lagrade i databasen och direkt kopplade till varje lager fungerar inte. Tabellerna med stilarna finns i den nya databasen, men tabellen är tom. Jag kan inte heller dumpa tabellen separat och läsa in den då det verkar som att sql skriptet inte riktigt är kompatibelt med koden för stilerna som de lagras…

Skärmbild_2018-12-05_13-21-48

Projektfiler som är lagrade i databasen överförs dock, men då dessa har data som pekar på den gamla databasen så är de inte speciellt användbara heller. Projektfilerna sparas i ett binärformat och inte som xml, vilket kan vara anledningen till att dessa överförs korrekt. Lösningen är att dels se till att dumpningen görs i ”plain” format och att man lägger till en rad överst i det genererade skriptet:

SET XML OPTION DOCUMENT;

Med detta så importeras stilarna till den nya databasen, men de är inte längre kopplade till lagerna, så den inläsningen får ändå göras manuellt. Jag kan tänka mig att det vore bättre att göra om hela skiten, men med texten ovan i dump-filen.

echo "SET XML OPTION DOCUMENT;" > /raid/backup.sql
sudo -u postgres pg_dump gammal_databas >> /raid/backup.sql
sudo -u postgres psql -d ny_databas -f /raid/backup.sql

Så det provade jag också… Men nix! Stilarna följde med men de applicerades inte på lagren. Det blir till att göra detta manuellt för varje lager. Om det skulle se annorlunda ut om man flyttade data mellan två databaser med samma namn har jag inte provat, men jag kan tänka mig att det kan fungera bättre då man inte ändrar några grundläggande förutsättningar.

Som sista kommentar kring PostGIS vill jag trycka på att om ni är beroende av PostGIS databasen så är nog inte ”pg_dump” den bästa metoden för att hantera backup… Det finns andra alternativ som är bättre, exempelvis ”pgbackrest”.

Nyhet från Geosupportsystem , orginal inlägg

Publicerad den Lämna en kommentar

PostGIS och ArcGIS

Då är det dags för test! Jag har lånat en dator med ArcMap 10.6.1 (senaste?) och ArcGIS Pro 2.2 (som jag kan väldigt dåligt). Och nu är det dags att prova hur bra (eller dåligt) det fungerar att jobba med PostGIS databaser.

Det kan finnas specialknep som jag inte känner till, men det första försöket blir en ren PostGIS installation, så får vi ta det därifrån. Det som gör ArcMap 10.6 lite mera intressant är att man här utökat stödet för PosgGIS geometrityper, men jag är inte riktigt säker på vad det innebär. Jag misstänker att jag kommer att bli besviken, men låt oss göra ett försök först.

Jag börjar med en Ubuntu Server, för att jag tycker att det är enklare, men det skulle nog lika gärna kunna vara en Windows Server.

ArcMap är eventuellt lite kräsen när det gäller vilka versioner som kan användas (länk) så det är bäst att följa detta till punkt och pricka, så får vi se om stödet är bredare lite senare. Man anger även att man stödjer Ubuntu 16.04, så vi får se om min 18.04 server ställer till problem.

Jag kan välja lite versioner enligt sidan, men jag måste ha en Postgresql version senare än 9.6.8 för att kunna använda PostGIS ”geography type” (vad nu det betyder).

Hmm, det står ju faktiskt ”minimum” för versionsnumren. Betyder det att jag kan använda Postgresql 10.6 som är den senaste av version 10?

Äh, det är 10.6 som finns i programbiblioteken tillsammans med PostGIS 2.4.3, så det får det bli.

sudo apt install postgresql-10
sudo apt install postgispg

Konfiguration av databasen görs så grundläggande och enkel som möjligt. Om det fungerar så får man klä på med användare och lite bättre säkerhet.

sudo passwd postgres
sudo -u postgres psql
# \password postgres
# \q
sudo -u postgres createdb geodata
# create extension postgis;
# select PostGIS_version();
# \q

Sedan skall som vanligt några filer redigeras så att det går att anropa servern från nätverket.

I filen /etc/postgresql/10/main/postgresql.conf redigeras ”listen_addresses” så att servern faktiskt lyssnar på datorer på nätverket. Nu anger jag ‘*’ istället för en korrekt adress.

I filen pg_hba.conf på samma sökväg läggs en adressrymd till under IPv4 så att de datorer jag har på nätverket kommer åt databasen.

host all all 192.168.0.0/24 md5

Sedan är det bara att starta om tjänsten med sudo service postgresql restart.

Skärmbild_2018-12-04_18-22-17

Via PgAdmin så kan jag bekräfta att databasen finns. Dags för ArcMap…

(Känns inte ArcMap 10.6 ganska långsam jämfört med tidigare versioner?)

databasanslutning

Det går smidigt från ArcCatalog att ansluta till databasen. Men alternativet att ”Enable Geodatabase…” kräver autentiseringsfiler (=ArcGIS Server licens?). Jag börjar ana vartåt det här lutar…

Att skapa en ny featureclass fungerar inte heller riktigt. Jag misslyckas vid skapandet för att schemat ”postgres” inte finns…

databas_skapa_data

Om jag skapar ett schema för postgres i PgAdmin så går det att skapa en ny featureclass, men när jag försöker redigera så…

kan_inte_redigera.PNG

Om jag skapar ett lager i QGIS i detta schema så går det bra att redigera där. Lagret blir också synligt i ArcMap, och går att lägga till i kartan. Men det går inte att redigera lagret.

Om jag skapar ett nytt schema i QGIS och ett nytt lager, så går det också att lägga till och visa i ArcMap. Redigera? Icke!!!

arcmap_gpkg.PNG

Det är lite samma sak som med GeoPackage. Det går att hitta data och lägga till i kartan, men så fort man vill redigera så är det ”the esri way – or the highway”. (Jag blir så trött…)

Skärmbild_2018-12-04_19-46-10.png

På esri webbsida om vad som krävs finns en rubrik ”requirements and limitations”. Vare sig här, eller någonstans i övrigt på sidan står det att det inte går att redigera data. Så den lilla förhoppning som inledde det här experimentet är (som vanligt) grusat.

Ett positivt resultat dock! Det fungerade fint att lägga till data från PostGIS 2.5 installerat på en Postgresql 11 server. Vill man jobba med data i QGIS på ett modernt sätt, och använda ArcMap som tittskåp för dessa data så kommer det inte att vara några problem…

Slutsatser

Jag vill att det här skall fungera!!!

Jag vägrar däremot att låta mig bli inlåst ännu mera i en enda leverantörs lösningar! Om man från esri sida vill behålla kunder som tänker som jag så bör man ta sig en rejäl funderare. Om jag inte kan arbeta med data med blandade verktyg, från olika leverantörer och från Open Source, så kommer leverantörer som inte låter mig göra det att fasas ut till förmån för de som låter mig jobba som jag vill.

Även om ett stort företag eller organisation har råd att använda en enterprice licens och därmed en esri geodataserver så ställer jag mig frågan, varför skulle man vilja det? När det innebär att man är låst till att använda en enda leverantörs verktyg.

För mig börjar det mer och mer se ut som att QGIS, eller andra öppna verktyg, kommer att bli det som används för att bearbeta och hantera data, inte minst för kartor på Internet! ArcMap får vara kvar där det är nödvändigt och fortfarande går snabbare att utföra vissa moment, eller där det finns inarbetade mallar och skript som inte är översatta till QGIS (ännu).

Och jag säger det igen. Jag VILL att det här skall fungera, för det är en liten extra säkerhet att ha ett stort företag bakom en mjukvara, även om jag mer och mer börjar förstå att den tryggheten är värd mindre och mindre…

Jag tar och avslutar med en länk till en diskussion på Reddit som är relevant för inlägget: https://www.reddit.com/r/gis/comments/7sp58m/postgresqlpostgis_versioning_control_and_revision/

Nyhet från Geosupportsystem , orginal inlägg

Publicerad den Lämna en kommentar

Skapa program i Python

Om man skriver lite kod i Python för husbehov, GIS-skript eller liknande, så kanske man funderat på om det går att skapa fristående program i Python.

Och visst går det. Har man QGIS installerat så är det dessutom ganska enkelt genom att man bygger programmet med Qt plattformen som ingår i installationen av QGIS.

Det finns flera sätt att koppla ett gränssnitt med fönster och knappar till pythonkoden, men det som jag tycker är enklast (kanske inte bäst) är att bygga gränssnittet först och sedan komplettera med koden.

Skärmklipp från 2018-12-01 08:57:12.png

I QtDesigner väljer man först en ”mall” att börja med och sedan hämtar man komponenter från en lista till vänster, till formulärfönstret. Dessa placerar man som man vill ha dem, och gör eventuella inställningar i objektens egenskaper till höger.

Det är speciellt bra att döpa komponenterna till något som är lätt att komma ihåg, eller som överensstämmer med det de är kopplade till (en textruta för namn kanske döps till txtNamn).

När man är nöjd med gränssnittet (det går att förhandsgranska med Ctrl + R), så sparar man det som en *.ui fil.

Beroende på vilket operativsystem man använder så kommer nästa steg att se lite olika ut. Man behöver köra ett program från terminalen/kommandoprompten och för Windows så kan man även behöva ange sökvägen till programmet om den inte finns med i miljövariablerna. Prova att skriva in pyuic5 i terminalen. Då bör du få ett felmeddelande om att det saknas lite variabler. Om kommandot är okänt så behöver du söka efter var programmet finns och använda hela sökvägen när du kör det.

pyuic5 -x mitt_program.ui -o mitt_program.py

Programmet körs från den katalog där man sparat ui-filen och kommer att generera en python-fil som man sedan kan öppna i valfri pythonredigerare.

Koden kan redigeras direkt här, men om man vill göra ändringar i gränssnittet så måste man kompilera om ui-filen till python, vilket skriver över eventuella ändringar.

Det är därför bättre att skapa ett ”huvudprogram” som importerar resurser i form av dialogfönstret.

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from mitt_program import Ui_Dialog # Här importeras koden från UI filen class MittGuiProgram(Ui_Dialog): def __init__(self, dialog): Ui_Dialog.__init__(self) self.setupUi(dialog) # Koppla "btnPush" knappen till en funktion (addInputTextToLabel) self.btnPush.clicked.connect(self.addInputTextToLabel) def addInputTextToLabel(self): # Detta är guifunktionen som anropas när knappen trycks ner txt = self.lineEdit.text() self.label.setText(txt) if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) dialog = QtWidgets.QDialog() prog = MittGuiProgram(dialog) dialog.show() sys.exit(app.exec_())

Programmet skall ha minst en klass som skapar kopplingen till ui-filen från importen i början. I klassen skapar man även de kopplingar som behöver göras till exempelvis knappar i gränssnittet. I min fil ovan så skall något hända när man klickar på knappen ”btnPush”. Den action som man anropar blir en egen funktion i klassen och i mitt fall så läser funktionen innehållet i textfältet och skriver detta till en etikett.

För att något skall hända så behöver allt initieras, vilket görs i den sista if satsen (if __name__ == ‘__main__’:). Om programmet körs fristående så exekveras det som står i denna if-sats i Python. Här skapas instanser av Qt applikationen och en dialog, som sedan tilldelas egenskaper från den tidigare skapade klassen och när det är klart visar den på skärmen.

Skärmbild från 2018-12-01 16-35-16.png

Mitt exempel här är inte speciellt avancerat men det går att skapa i princip hur komplicerad kod man vill för exempelvis beräkningar.

Det finns även betydligt mer avancerade komponenter att lägga till i gränssnittet om man vill det, men även en massa extra tillägg om dessa inte räcker.

Sedan har man ju tillgång till alla pythonbibliotek som man normalt använder och som kan tillföra i princip vilken funktionalitet som helst till ett program.

För att köra programmet så krävs det två saker. Dels python, i rätt version. Annars kan man inte starta programmet:

python3 mitt_program.py

Dessutom så behöver man lite Qt filer på datorn som skall köra programmet. Om du skall köra på den egna datorn så är det inga problem, då har du redan allt du behöver.

Vill du distribuera ditt ”program” så kan du använda pyinstaller som kan installeras med pip3 install pyinstaller.

Pyinstaller körs sedan på den pythonfil som normalt startar programmet. Detta skapar ett antal kataloger och filer med kompilerad binärkod av programmet och alla beroenden. Vill man bara ha ”en” körbar fil så kan man lägga till ett tillägg i kommandot.

pyinstaller --onefile mitt_program.py

Det är sannolikt fortfarande så att du behöver några filer extra för att programmet skall gå att köra, men alla filer du behöver finns i underkataloger i projektmappen. Observera att de binära filerna blir mycket större än pythonfilerna! Det beror på att alla, eller väldigt många, beroenden bakas in i filen.

Om du bygger på Windows så skapas en *.exe fil och på MacOS så antar jag att det blir något motsvarande. På Linux skapas en exekverbar fil i underkatalogen ”dist”. Observera att du inte kan bygga körbara filer för Mac eller Linux från en Windowsdator, eller tvärt om. Du måste ha en dator med det operativsystem du vill köra programmet på när du skapar det med pyinstaller.

Så med Qt Designer och Python så kan man inte bara skriva små kluriga tillägg och funktioner i QGIS, utan även hela program med egna gränssnitt som man kan dela med andra.

Nyhet från Geosupportsystem , orginal inlägg

Publicerad den Lämna en kommentar

User question of the Month – Dec 18 & answers from Nov

It’s December and that means it is time to plan for the next year. Planning also means preparing a budget and to do so, we would like to learn more about what you think QGIS.ORG should focus on: features or bug fixing and polishing? Therefore, we invite you to our QGIS user question of December 2018.

Your answers in November

In November, we wanted to know which version of QGIS you use.

Nyhet från XXXXXX, orginal inlägg

Publicerad den Lämna en kommentar

Call for presentations: QGIS User Conference and Developer Meeting, 2019

The next International QGIS User Conference and Developer Meeting will take place in the week from 4 to 10 March 2019 in A Coruña (Spain).
The International QGIS User and Developer Conference wants to be the reference conference for the QGIS community, a meeting point for the family of users and developers associated with the QGIS project. Attending the conference is an opportunity to gather experience and share knowledge about QGIS. The language of the conference is English.

Nyhet från XXXXXX, orginal inlägg