투영 지원

좌표계

QgsCoordinateReferenceSystem 클래스가 좌표계(Coordinate Reference Systems; CRS)를 캡슐화하고 있습니다. 몇 가지 방법으로 이 클래스의 인스턴스를 생성할 수 있습니다.

  • 좌표계의 ID로 CRS 설정

    # PostGIS SRID 4326 is allocated for WGS84
    crs = QgsCoordinateReferenceSystem(4326, QgsCoordinateReferenceSystem.PostgisCrsId)
    

    QGIS는 모든 좌표계를 3가지 형태의 ID로 식별할 수 있습니다.

    • PostgisCrsId — PostGIS 데이터베이스에서 사용되는 ID

    • InternalCrsId — QGIS 데이터베이스에서 내부적으로 사용되는 ID

    • EpsgCrsId — EPSG 기구에서 부여한 ID

    앞의 예시에서 두 번째 파라미터를 지정하지 않으면, 기본값인 PostGIS SRID가 사용됩니다.

  • WKT(well-known text)로 CRS 설정

    wkt = 'GEOGCS["WGS84", DATUM["WGS84", SPHEROID["WGS84", 6378137.0, 298.257223563]],'
           PRIMEM["Greenwich", 0.0], UNIT["degree",0.017453292519943295],'
           AXIS["Longitude",EAST], AXIS["Latitude",NORTH]]'
    crs = QgsCoordinateReferenceSystem(wkt)
  • 유효하지 않은 CRS를 생성한 다음 create*() 함수 가운데 하나를 써서 초기화하는 방법도 있습니다. 다음은 투영을 초기화하기 위해 Proj4 문자열을 이용하는 예시 코드입니다.

    crs = QgsCoordinateReferenceSystem()
    crs.createFromProj4("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
    

좌표계를 성공적으로 생성했는지 (예를 들면 데이터베이스에서 검색한다거나 해서) 확인해보는 것이 좋습니다. isValid() 함수가 True 를 반환해야만 합니다.

좌표계를 초기화하기 위해 QGIS가 내부 데이터베이스인 srs.db 에서 적절한 값을 검색해야 한다는 사실에 주의하십시오. 때문에 독립적인 응용 프로그램을 만드는 경우 QgsApplication.setPrefixPath() 함수로 정확한 경로를 지정하지 않으면 데이터베이스를 찾지 못 할 것입니다. 플러그인을 개발하거나 QGIS 파이썬 콘솔에서 명령어를 실행하는 경우라면 신경 쓸 필요는 없습니다. 모든 것이 이미 설정돼 있으니까요.

좌표계 정보에는 다음과 같이 접근할 수 있습니다.

print "QGIS CRS ID:", crs.srsid()
print "PostGIS SRID:", crs.srid()
print "EPSG ID:", crs.epsg()
print "Description:", crs.description()
print "Projection Acronym:", crs.projectionAcronym()
print "Ellipsoid Acronym:", crs.ellipsoidAcronym()
print "Proj4 String:", crs.proj4String()
# check whether it's geographic or projected coordinate system
print "Is geographic:", crs.geographicFlag()
# check type of map units in this CRS (values defined in QGis::units enum)
print "Map units:", crs.mapUnits()

투영

QgsCoordinateTransform 클래스를 사용하면 서로 다른 공간좌표계간의 상호 변환을 할 수 있습니다. 이 클래스를 이용하는 가장 간단한 방법은 입력 및 출력 CRS를 생성해서 이 좌표계들로 QgsCoordinateTransform 클래스 인스턴스를 생성하는 것입니다. 그런 다음 transform() 함수를 반복 호출해서 변환 작업을 수행하십시오. 기본적으로 정방향으로 변환하지만, 역방향 변환도 가능합니다.

crsSrc = QgsCoordinateReferenceSystem(4326)    # WGS 84
crsDest = QgsCoordinateReferenceSystem(32633)  # WGS 84 / UTM zone 33N
xform = QgsCoordinateTransform(crsSrc, crsDest)

# forward transformation: src -> dest
pt1 = xform.transform(QgsPoint(18,5))
print "Transformed point:", pt1

# inverse transformation: dest -> src
pt2 = xform.transform(pt1, QgsCoordinateTransform.ReverseTransform)
print "Transformed back:", pt2