Viktigt

Översättning är en gemenskapsinsats du kan gå med i. Den här sidan är för närvarande översatt till 100.00%.

8. Stöd för projektioner

Råd

Kodsnuttarna på den här sidan behöver följande import om du befinner dig utanför pyqgis-konsolen:

1from qgis.core import (
2    QgsCoordinateReferenceSystem,
3    QgsCoordinateTransform,
4    QgsProject,
5    QgsPointXY,
6)

8.1. Referenssystem för koordinater

Koordinatreferenssystem (CRS) är inkapslade av QgsCoordinateReferenceSystem-klassen. Instanser av denna klass kan skapas på flera olika sätt:

  • ange CRS med dess ID

    # EPSG 4326 is allocated for WGS84
    crs = QgsCoordinateReferenceSystem("EPSG:4326")
    print(crs.isValid())
    
    True
    

    QGIS stöder olika CRS-identifierare med följande format:

Om inget prefix anges antas WKT-definitionen.

  • ange CRS genom dess välkända text (WKT)

    1wkt = 'GEOGCS["WGS84", DATUM["WGS84", SPHEROID["WGS84", 6378137.0, 298.257223563]],' \
    2      'PRIMEM["Greenwich", 0.0], UNIT["degree",0.017453292519943295],' \
    3      'AXIS["Longitude",EAST], AXIS["Latitude",NORTH]]'
    4crs = QgsCoordinateReferenceSystem(wkt)
    5print(crs.isValid())
    
    True
    
  • skapa en ogiltig CRS och sedan använda en av funktionerna create* för att initialisera den. I följande exempel använder vi en Proj-sträng för att initiera projektionen.

    crs = QgsCoordinateReferenceSystem()
    crs.createFromProj("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
    print(crs.isValid())
    
    True
    

Det är klokt att kontrollera om skapandet (d.v.s. uppslagningen i databasen) av CRS har lyckats: isValid() måste returnera True.

Observera att för initialisering av rumsliga referenssystem måste QGIS leta upp lämpliga värden i sin interna databas srs.db. Om du skapar en oberoende applikation måste du därför ställa in sökvägar korrekt med QgsApplication.setPrefixPath(), annars kommer den inte att hitta databasen. Om du kör kommandona från QGIS Python-konsolen eller utvecklar ett insticksprogram behöver du inte bry dig: allt är redan förberett åt dig.

Tillgång till information om rumsligt referenssystem:

 1crs = QgsCoordinateReferenceSystem("EPSG:4326")
 2
 3print("QGIS CRS ID:", crs.srsid())
 4print("PostGIS SRID:", crs.postgisSrid())
 5print("Description:", crs.description())
 6print("Projection Acronym:", crs.projectionAcronym())
 7print("Ellipsoid Acronym:", crs.ellipsoidAcronym())
 8print("Proj String:", crs.toProj())
 9# check whether it's geographic or projected coordinate system
10print("Is geographic:", crs.isGeographic())
11# check type of map units in this CRS (values defined in QGis::units enum)
12print("Map units:", crs.mapUnits())

Utdata:

1QGIS CRS ID: 3452
2PostGIS SRID: 4326
3Description: WGS 84
4Projection Acronym: longlat
5Ellipsoid Acronym: EPSG:7030
6Proj String: +proj=longlat +datum=WGS84 +no_defs
7Is geographic: True
8Map units: 6

8.2. CRS-omvandling

Du kan göra transformationer mellan olika rumsliga referenssystem genom att använda klassen QgsCoordinateTransform. Det enklaste sättet att använda den är att skapa ett CRS för källa och destination och konstruera en QgsCoordinateTransform-instans med dem och det aktuella projektet. Sedan anropar du bara upprepade gånger transform()-funktionen för att göra transformationen. Som standard gör den framåtriktad transformation, men den kan också göra invers transformation.

 1crsSrc = QgsCoordinateReferenceSystem("EPSG:4326")    # WGS 84
 2crsDest = QgsCoordinateReferenceSystem("EPSG:32633")  # WGS 84 / UTM zone 33N
 3transformContext = QgsProject.instance().transformContext()
 4xform = QgsCoordinateTransform(crsSrc, crsDest, transformContext)
 5
 6# forward transformation: src -> dest
 7pt1 = xform.transform(QgsPointXY(18,5))
 8print("Transformed point:", pt1)
 9
10# inverse transformation: dest -> src
11pt2 = xform.transform(pt1, QgsCoordinateTransform.ReverseTransform)
12print("Transformed back:", pt2)

Utdata:

Transformed point: <QgsPointXY: POINT(832713.79873844375833869 553423.98688333143945783)>
Transformed back: <QgsPointXY: POINT(18 4.99999999999999911)>