Menu
  • Hem
  • Dokument
  • Om Mig
Geosupportsystem

Geopackage med Python

Posted on 2016-11-07

I detta inlägg försöker jag dokumentera enklast möjliga sättet att lägga till punkter i ett geopackage. Heter det förresten en eller ett geopackage(-fil)?
På sikt så vill jag använda detta för att spara data till en fil direkt från en Raspberry Pi med ansluten GPS.
Hur GPS ansluts och hur man läser data från denna har jag skrivit om tidigare, men nu vill jag kunna spara till något annat än en textfil.
Detta innebär lite fler utmaningar, men det är inte oöverkomligt.
För det första behöver man ha GDAL/OGR installerat med python-bindningar. För geopackage behöver GDAL även ”libsqlite3”.

from osgeo import ogr, osr
# Skapa koordinatsystem för lagrets koordinater
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326)
# Skapa "driver" för geopackage
gpkgDrv = ogr.GetDriverByName("GPKG")
# Skapa en datakälla
dS = gpkgDrv.CreateDataSource("filnamn.gpkg")
# Skapa själva lagret med en geometri
lr = dS.CreateLayer("filnamn.gpkg", srs, ogr.wkbPoint)
# Skapa eventuella attribut, upprepa för flera fält
fD = ogr.FieldDefn("textfält", ogr.OFTString)
lr.CreateField(fD)
# Hämta lagerdefinition
lD = lr.GetLayerDefn()
# Objektet...
ft  = ogr.Feature(lD)
# Nästa rad skapar en enskild punkt
punkt = ogr.Geometry(ogr.wkbPoint)
# och lägger till en position i X, Y
punkt.AddPoint(15,55)
# Tilldela objektet positionen
ft.SetGeometry(punkt)
# Tilldela objektet attribut, upprepa för alla attribut
ft.SetField("textfält", "attributvärde")
# Skapa objektet i lagret
lr.CreateFeature(ft)
# Stäng filen och frigör resurser
dS.Destroy()

Koden ovan skapar ett geopackage med en punkt, men vill man ha flera så behöver man göra lite anpassningar.
För att det skall gå att upprepa så skall ”ft” objektet skapas på nytt, för varje gång ett nytt objekt skall läggas till. Det block som inleds med # Objektet… skall därför upprepas för varje punkt som skall läggas till.
Nu har jag lagt till kommentarer vid varje rad i koden ovan så det ser mer ut än vad det är. Nu kan jag använda detta för att skapa en ”skrivare” för geopackage i mina pythonskript.
Vill man använda andra attributtyper än ”text” så kan man använda OFTInteger, OFTReal, OFTDate, med flera typer. Vissa av dessa har ytterligare egenskaper som kan eller bör sättas.
För att skapa funktioner så börjar jag med att ”bryta ut” det som jag vill kunna ändra i variabler.

EPSG = 4326
filnamn = "filnamn.gpkg"
attrNamn = ["namn1", "namn2"]
attrTyp = [ogr.OFTString, ogr.OFTString]
lon = 15.2 # nytt värde för varje punkt
lat = 55.3 # nytt värde för varje punkt
attrVarde = ["Värde1", "Värde2"] # ny lista för varje punkt

Sedan kan man skicka dessa variabler med anrop av funktioner som skapar lagret, lägger till punkter och sedan avslutar.

skapaLager(EPSG, filnamn, attrNamn, attrTyp)
# Upprepa för varje punkt
nyPunkt(lon, lat, attrVarde)
avslutaLager()

Själva funktionerna kan du nog själv lista ut hur de kan skrivas… eller?
Tänk bara på att deklarera eventuella ”globala” variabler om du inte är fruktansvärt kreativ med anropen.
Ja, ja! Okej då! Här kommer mina funktioner.

def skapaLager(EPSG, filnamn, attrNamn, attrTyp):
   gpkgDrv = ogr.GetDriverByName("GPKG")
   global dS
   dS = gpkgDrv.CreateDataSource(filnamn)
   global lr
   srs = osr.SpatialReference()
   srs.ImportFromEPSG(EPSG)
   lr = dS.CreateLayer(filnamn, srs, ogr.wkbPoint)
   for namn, typ in zip(attrNamn, attrTyp):
     fD = ogr.FieldDefn(namn, typ)
     lr.CreateField(fD)
def nyPunkt(lon, lat, attrNamn, attrVarde):
   global lr
   lD = lr.GetLayerDefn()
   ft = ogr.Feature(lD)
   punkt = ogr.Geometry(ogr.wkbPoint)
   punkt.AddPoint(lon, lat)
   ft.SetGeometry(punkt)
   for namn, varde in zip(attrNamn, attrVarde):
     ft.SetField(namn, varde)
   lr.CreateFeature(ft)
def avslutaLager():
   global dS
   dS.Destroy()

Lämna ett svar Avbryt svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

Translate with Google

GBR In English
GER Auf Deutch
FRA En Français
ESP En Español
Swedish is a hard language for a machine to translate. Nuance and detail will likely be lost.
     

Bok om QGIS på Svenska

Bok

Beställ Boken/E-bok genom att klicka på bilden (även förhandsgranskning).

Senaste kommentarer

  • Lene Fischer om Skapa bildmask för WebODM
  • Gabriel om Punktmoln i QGIS 3.18
  • klakar om Punktmoln i QGIS 3.18
  • Gabriel om Punktmoln i QGIS 3.18
  • Hector Garrido om QGIS LTR vs LTR

Arkiv

Prenumerera på Geosupportsystem

Skriv in namn och epost för att prenumerera på meddelanden från denna blogg.
Loading

geosupport

YouTube video to frames. Processed in OpenDroneMap YouTube video to frames. Processed in OpenDroneMap and visualized in QGIS 3.17.
Japp! Dubbelbeställde TVÅ gånger. En annan mode Japp! Dubbelbeställde TVÅ gånger. En annan modell levererades idag.
Ooops. Tryckte nog för många gånger på bestäl Ooops. Tryckte nog för många gånger på beställ-knappen...
Ladda mer...

Meta

  • Logga in
  • Flöde för inlägg
  • Flöde för kommentarer
  • WordPress.org
©2021 Geosupportsystem | WordPress Theme by Superbthemes.com