중요

번역은 여러분이 참여할 수 있는 커뮤니티 활동입니다. 이 페이지는 현재 100.00% 번역되었습니다.

8. 투영체 지원

힌트

PyQGIS 콘솔을 사용하지 않는 경우 이 페이지에 있는 코드 조각들을 다음과 같이 가져와야 합니다:

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

8.1. 좌표계

QgsCoordinateReferenceSystem 클래스가 좌표계를 캡슐화합니다. 이 클래스의 인스턴스를 몇 가지 서로 다른 방법으로 생성할 수 있습니다:

  • 좌표계 ID로 좌표계 지정하기

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

    QGIS는 다음 서식을 가진 서로 다른 좌표계 식별자들을 지원합니다:

    • EPSG:<code> — EPSG 기관이 할당한 ID입니다. createFromOgcWms() 메소드로 처리합니다.

    • POSTGIS:<srid>— PostGIS 데이터베이스에서 쓰이는 ID입니다. createFromSrid() 메소드로 처리합니다.

    • INTERNAL:<srsid> — QGIS 데이터베이스에서 쓰이는 ID입니다. createFromSrsId() 메소드로 처리합니다.

    • PROJ:<proj>createFromProj() 메소드로 처리합니다.

    • WKT:<wkt>createFromWkt() 메소드로 처리합니다.

접두어를 지정하지 않는 경우, WKT(well-known 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
    
  • 무결하지 않은 좌표계를 생성한 다음 create* 함수들 가운데 하나를 사용해서 초기 설정합니다. 다음 예시에서는 투영체를 초기 설정하는 데 Proj 문자열을 사용합니다.

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

좌표계를 성공적으로 생성했는지 여부를 (예: 데이터베이스 검색) 확인하는 편이 좋습니다: isValid() 메소드가 True 를 반환해야만 합니다.

공간 참조 시스템(spatial reference system)을 초기 설정하기 위해 QGIS가 srs.db 내부 데이터베이스에서 알맞은 값을 검색해야 한다는 사실을 기억하십시오. 즉 여러분이 독립 응용 프로그램을 생성한 경우 QgsApplication.setPrefixPath() 메소드로 경로를 정확하게 설정해야 합니다. 그렇지 않을 경우 이 데이터베이스를 찾지 못할 것입니다. 여러분이 QGIS 파이썬 콘솔에서 명령어를 실행하거나 또는 플러그인을 개발하는 중이라면 상관없습니다. 이미 모든 것이 설정되어 있기 때문입니다.

공간 참조 시스템 정보에 접근하기:

 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())

산출물:

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: DistanceUnit.Degrees

8.2. 좌표계 변환

QgsCoordinateTransform 클래스를 사용해서 서로 다른 공간 참조 시스템들을 변환시킬 수 있습니다. 이 클래스를 가장 쉽게 사용하는 방법은 소스 및 대상 좌표계를 생성한 다음 이 좌표계들과 현재 프로젝트를 가진 QgsCoordinateTransform 인스턴스를 작성하는 것입니다. 그 다음 transform() 함수를 반복 호출해서 변환을 수행합니다. 이 함수는 기본적으로 정방향 변환을 하지만, 역방향 변환도 할 수 있습니다.

 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)

산출물:

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