OGR座標参照システムと座標変換チュートリアル

はじめに

The OGRSpatialReference and OGRCoordinateTransformation classes provide respectively services to represent coordinate reference systems (known as CRS or SRS, such as typically a projected CRS associating a map projection with a geodetic datums) and to transform between them. These services are loosely modeled on the OpenGIS Coordinate Transformations specification, and rely on the Well Known Text (WKT) format (in its various versions: OGC WKT 1, ESRI WKT, WKT2:2015 and WKT2:2018) for describing coordinate systems.

参考文献と適用可能な標準

地理座標参照システムの定義

CRSは OGRSpatialReference クラスにカプセル化されています. OGRSpatialReferenceオブジェクトを有効な座標参照システムに初期化するためのいくつかの方法があります. 主要な2種類のCRSがあります. 1つ目は地理的なもの(位置は経度/緯度で測定されます)で,2つ目は投影されたもの(UTMなど - 位置はメートルまたはフィートで測定されます).

地理的なCRSには,測地基準(半長軸と逆扁平率で記述される楕円体を意味する)に関する情報,基準子午線(通常はグリニッジ),および通常は度の角単位タイプが含まれます. 以下のコードは,地理的なCRSを初期化するために,この情報と地理的なCRSのユーザー表示名を提供します.

OGRSpatialReference oSRS;

oSRS.SetGeogCS( "My geographic CRS",
                "World Geodetic System 1984",
                "My WGS84 Spheroid",
                SRS_WGS84_SEMIMAJOR, SRS_WGS84_INVFLATTENING,
                "Greenwich", 0.0,
                "degree", SRS_UA_DEGREE_CONV );

注釈

The abbreviation CS in OGRSpatialReference::SetGeogCS() is not appropriate according to current geodesic terminology, and should be understood as CRS

これらの値のうち, "My geographic CRS", "My WGS84 Spheroid", "Greenwich"および"degree"の名前は, キーではなく,ユーザーに表示されます. ただし,測地基準名"World Geodetic System 1984"は,測地基準を識別するためのキーとして使用され,適切な測地基準変換が座標操作中に行われるように,EPSGレジストリから既知の値に設定する必要があります.有効な測地基準のリストは, geodetic_datum.sql ファイルの3列目に表示されます.

注釈

WKT 1では,測地基準名のスペース文字は通常アンダースコアに置き換えられます.そしてWGS_1984は"World Geodetic System 1984"のエイリアスとして使用されます

OGRSpatialReferenceには,いくつかのよく知られたCRSに対する組み込みサポートがあり,これには"NAD27", "NAD83", "WGS72"および"WGS84"が含まれます.これらは, OGRSpatialReference::SetWellKnownGeogCS() への単一の呼び出しで定義できます.

oSRS.SetWellKnownGeogCS( "WGS84" );

注釈

SetWellKnownGeogCS() のCSの略称は,現在の測地学用語には適していません.これはCRSとして理解されるべきです

さらに,EPSGデータベースが利用可能な場合,そのGCSコード番号で任意の地理的なCRSを設定できます.

oSRS.SetWellKnownGeogCS( "EPSG:4326" );

投影定義のシリアル化および他のパッケージへの投影定義の送信には,座標システムのOpenGIS Well Known Text形式が使用されます.OGRSpatialReferenceは,WKTから初期化するか,またはWKTに変換することができます. GDAL 3.0では,WKTエクスポートのデフォルトフォーマットはまだOGC WKT 1です.

char *pszWKT = NULL;
oSRS.SetWellKnownGeogCS( "WGS84" );
oSRS.exportToWkt( &pszWKT );
printf( "%s\n", pszWKT );
CPLFree(pszWKT);

出力:

GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,
AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,
AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],
AUTHORITY["EPSG","4326"]]

またはより読みやすい形式で:

GEOGCS["WGS 84",
    DATUM["WGS_1984",
        SPHEROID["WGS 84",6378137,298.257223563,
            AUTHORITY["EPSG","7030"]],
        AUTHORITY["EPSG","6326"]],
    PRIMEM["Greenwich",0,
        AUTHORITY["EPSG","8901"]],
    UNIT["degree",0.0174532925199433,
        AUTHORITY["EPSG","9122"]],
    AXIS["Latitude",NORTH],
    AXIS["Longitude",EAST],
    AUTHORITY["EPSG","4326"]]

GDAL 3.0から, OGRSpatialReference::exportToWkt() メソッドはオプションを受け入れます,

char *pszWKT = nullptr;
oSRS.SetWellKnownGeogCS( "WGS84" );
const char* apszOptions[] = { "FORMAT=WKT2_2018", "MULTILINE=YES", nullptr };
oSRS.exportToWkt( &pszWKT, apszOptions );
printf( "%s\n", pszWKT );
CPLFree(pszWKT);
GEOGCRS["WGS 84",
    DATUM["World Geodetic System 1984",
        ELLIPSOID["WGS 84",6378137,298.257223563,
            LENGTHUNIT["metre",1]]],
    PRIMEM["Greenwich",0,
        ANGLEUNIT["degree",0.0174532925199433]],
    CS[ellipsoidal,2],
        AXIS["geodetic latitude (Lat)",north,
            ORDER[1],
            ANGLEUNIT["degree",0.0174532925199433]],
        AXIS["geodetic longitude (Lon)",east,
            ORDER[2],
            ANGLEUNIT["degree",0.0174532925199433]],
    ID["EPSG",4326]]

このメソッドはオプション付きでCで利用可能であり, OSRExportToWktEx() 関数として利用できます.

The OGRSpatialReference::importFromWkt() method can be used to set an OGRSpatialReference from a WKT CRS definition.

CRSと軸の順序

以前のセクションで省略されていた "詳細" の1つは,CRS内の座標軸の順序に関するトピックです.地理的なCRSは,ISO:19111モデリングによると,2つの主要なコンポーネントで構成されています:測地基準と 座標系 .2D地理的なCRSの場合,座標系の軸は経度と緯度であり,これらの軸に沿った値は一般的に度で表されます(古代フランス語ベースのCRSではグラードを使用する場合があります).

指定される順序,つまり緯度が最初で経度が2番目,またはその逆,は常に混乱の原因であり,測地権限, GISユーザー,ファイル形式およびプロトコル仕様などで使用される規則によって異なります.これはさまざまな相互運用性の問題の原因です.

GDAL 3.0以前, OGRSpatialReference クラスは,CRSを定義する権限によって指定された軸の順序を尊重せず,その結果,順序が緯度が最初で経度が2番目の場合,軸の順序情報をWKT文字列から削除しました.このクラスのTransform()メソッドで渡される地理座標または返される地理座標を使用する座標変換も,経度,緯度の順序を使用していると仮定していました.

GDAL 3.0から,CRSを定義する権限によって指定された軸の順序は,デフォルトでOGRCoordinateTransformationクラスによって尊重され,常にWKT1でエクスポートされます.その結果,"EPSG:4326"または"WGS84"文字列で作成されたCRSは,緯度が最初で経度が2番目の軸の順序を使用します.

まだ経度,緯度の順序で座標を使用しているコードベースからの移行を支援するために,座標変換の目的で実際に渡される値または返される値の順序が経度,緯度であることを指定するために,OGRSpatialReferenceインスタンスにメタデータ情報を添付することができます.そのために,次のように呼び出す必要があります

oSRS.SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER);

OGRSpatialReference::SetAxisMappingStrategy() に渡される引数は,データ軸からCRS軸へのマッピング戦略です.

  • OAMS_TRADITIONAL_GIS_ORDER は,緯度/経度の順序を持つ地理的なCRSの場合,データは引き続き経度/緯度の順序になります.同様に,北/東の順序を持つ投影されたCRSの場合,データは引き続き東/北の順序になります.

  • OAMS_AUTHORITY_COMPLIANT は,データ軸がCRS軸と同一であることを意味します.これは,OGRSpatialReferenceをインスタンス化するときのデフォルト値です.

  • OAMS_CUSTOM は,データ軸がSetDataAxisToSRSAxisMapping()でカスタムに定義されていることを意味します.

このセクションで議論された地理的なCRSの特定のケースについても,投影されたCRSにも同様に適用されます.ほとんどのものは,東が最初で北が2番目の規則を使用しますが,EPSGレジストリで定義された一部のものは逆の規則を使用します.

特定のよく知られたCRSに対して従来のGIS順序を引き続き使用する別の方法は, "NAD27", "NAD83"および"WGS84"の代わりに"CRS27", "CRS83"または"CRS84"を指定して OGRSpatialReference::SetWellKnownGeogCS() を呼び出すことです.

oSRS.SetWellKnownGeogCS( "CRS84" );

投影されたCRSの定義

投影されたCRS(UTM, Lambert Conformal Conicなど)には,線形位置(メートルまたはフィート)と角度の経度/緯度位置の間の変換に使用される投影変換の定義として,基礎となる地理的なCRS(測地基準)が必要です.以下のコードは,UTMゾーン17の投影されたCRSを定義し,その基礎となる地理的なCRS(測地基準)はWGS84です.

OGRSpatialReference oSRS;

oSRS.SetProjCS( "UTM 17 (WGS84) in northern hemisphere." );
oSRS.SetWellKnownGeogCS( "WGS84" );
oSRS.SetUTM( 17, TRUE );

Calling OGRSpatialReference::SetProjCS() sets a user name for the projected CRS and establishes that the system is projected. The OGRSpatialReference::SetWellKnownGeogCS() associates a geographic coordinate system, and the OGRSpatialReference::SetUTM() call sets detailed projection transformation parameters. At this time the above order is important in order to create a valid definition, but in the future the object will automatically reorder the internal representation as needed to remain valid.

注意

現時点では,OGRSpatialReferenceを定義する手順の順序に注意してください!

上記の定義は,次のようなWKTバージョンを生成します. UTM 17は,UTMゾーンの詳細な横メルカトル定義に展開されていることに注意してください.

PROJCS["UTM 17 (WGS84) in northern hemisphere.",
    GEOGCS["WGS 84",
        DATUM["WGS_1984",
            SPHEROID["WGS 84",6378137,298.257223563,
                AUTHORITY["EPSG",7030]],
            TOWGS84[0,0,0,0,0,0,0],
            AUTHORITY["EPSG",6326]],
        PRIMEM["Greenwich",0,AUTHORITY["EPSG",8901]],
        UNIT["DMSH",0.0174532925199433,AUTHORITY["EPSG",9108]],
        AXIS["Lat",NORTH],
        AXIS["Long",EAST],
        AUTHORITY["EPSG",4326]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",-81],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",0]]

OGRSpatialReference::SetTM() (横メルカトル), OGRSpatialReference::SetLCC() (ランベルト正角円錐), および OGRSpatialReference::SetMercator() を含む多くの投影方法に対するメソッドがあります.

座標参照システムの問い合わせ

OGRSpatialReferenceが確立されると,それに関するさまざまな情報を問い合わせることができます. OGRSpatialReference::IsProjected() および OGRSpatialReference::IsGeographic() メソッドを使用して,それが投影されたCRSか地理的なCRSかを確立できます. OGRSpatialReference::GetSemiMajor(), OGRSpatialReference::GetSemiMinor() および OGRSpatialReference::GetInvFlattening() メソッドを使用して,楕円体に関する情報を取得できます. OGRSpatialReference::GetAttrValue() メソッドを使用して,PROJCS, GEOGCS, DATUM, SPHEROIDおよびPROJECTION名の文字列を取得できます. OGRSpatialReference::GetProjParm() メソッドを使用して,投影パラメータを取得できます. OGRSpatialReference::GetLinearUnits() メソッドを使用して,線形単位タイプとメートルへの変換を取得できます.

投影方法とパラメータの名前は,WKT 1のものです.

以下のコードは, OGRSpatialReference::GetAttrValue() を使用して投影を取得し, OGRSpatialReference::GetProjParm() を使用して投影パラメータを取得する方法を示しています. GetAttrValue() メソッドは,WKTテキスト表現の名前付きエントリに関連付けられた最初の"value"ノードを検索します. GetProjParm() で投影パラメータを取得する際には,投影パラメータ用の #define'ed 定数(例: SRS_PP_CENTRAL_MERIDIAN)を使用する必要があります.各投影のSetメソッドのコードは,どのパラメータがどの投影に適用されるかを見つけるために,ogrspatialreference.cppのコードを参照できます.

const char *pszProjection = poSRS->GetAttrValue("PROJECTION");

if( pszProjection == NULL )
{
    if( poSRS->IsGeographic() )
        sprintf( szProj4+strlen(szProj4), "+proj=longlat " );
    else
        sprintf( szProj4+strlen(szProj4), "unknown " );
}
else if( EQUAL(pszProjection,SRS_PT_CYLINDRICAL_EQUAL_AREA) )
{
    sprintf( szProj4+strlen(szProj4),
    "+proj=cea +lon_0=%.9f +lat_ts=%.9f +x_0=%.3f +y_0=%.3f ",
            poSRS->GetProjParm(SRS_PP_CENTRAL_MERIDIAN,0.0),
            poSRS->GetProjParm(SRS_PP_STANDARD_PARALLEL_1,0.0),
            poSRS->GetProjParm(SRS_PP_FALSE_EASTING,0.0),
            poSRS->GetProjParm(SRS_PP_FALSE_NORTHING,0.0) );
}
...

座標変換

The OGRCoordinateTransformation class is used for translating positions between different CRS. New transformation objects are created using OGRCreateCoordinateTransformation(), and then the OGRCoordinateTransformation::Transform() method can be used to convert points between CRS.

OGRSpatialReference oSourceSRS, oTargetSRS;
OGRCoordinateTransformation *poCT;
double x, y;

oSourceSRS.importFromEPSG( atoi(papszArgv[i+1]) );
oTargetSRS.importFromEPSG( atoi(papszArgv[i+2]) );

poCT = OGRCreateCoordinateTransformation( &oSourceSRS,
                                          &oTargetSRS );
x = atof( papszArgv[i+3] );
y = atof( papszArgv[i+4] );

if( poCT == NULL || !poCT->Transform( 1, &x, &y ) )
    printf( "Transformation failed.\n" );
else
{
    printf( "(%f,%f) -> (%f,%f)\n",
            atof( papszArgv[i+3] ),
            atof( papszArgv[i+4] ),
            x, y );
}

変換が失敗する可能性があるいくつかのポイントがあります. まず,通常は内部で指定されたシステム間の変換が確立できないことが認識されるため,OGRCreateCoordinateTransformation() が失敗する可能性があり,その場合はNULLポインタが返されます.

OGRCoordinateTransformation::Transform() メソッド自体も失敗する可能性があります. これは,上記の問題の1つの遅延結果として発生するか,または渡された1つ以上の点に対して数値的に未定義の操作の結果として発生する可能性があります. Transform() 関数は成功した場合にTRUEを返し,いずれかの点が変換に失敗した場合にはFALSEを返します.エラー時には,ポイント配列は不確定な状態になります.

上記には示されていませんが,座標変換サービスは3Dポイントを取ることができ,楕円体および測地基準の高度差に対して高度を調整します.地理的または投影されたCRSで指定された高度は,楕円体高度であると仮定されます.水平CRS(地理的または投影された)と垂直CRSで構成される複合CRSを使用する場合,高度は垂直基準(平均海面,重力ベースなど)に関連付けられます.

GDAL 3.0から,時間依存の座標操作に対して時間値(通常は10進年での値)も指定できます.

以下の例は,投影された座標系と同じ地理的なCRSを使用して経度/緯度座標系を便利に作成し,それを使用して投影された座標と経度/緯度との間で変換する方法を示しています.返される座標は,SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER)を呼び出すことにより,経度,緯度の順序になります.

OGRSpatialReference    oUTM, *poLongLat;
OGRCoordinateTransformation *poTransform;

oUTM.SetProjCS("UTM 17 / WGS84");
oUTM.SetWellKnownGeogCS( "WGS84" );
oUTM.SetUTM( 17 );

poLongLat = oUTM.CloneGeogCS();
poLongLat->SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER);

poTransform = OGRCreateCoordinateTransformation( &oUTM, poLongLat );
if( poTransform == NULL )
{
    ...
}

...

if( !poTransform->Transform( nPoints, x, y, z ) )
...

高度な座標変換

OGRCreateCoordinateTransformation() は,ソースCRSからターゲットCRSへの変換を行ういくつかの候補座標操作を決定する可能性があります.それらの候補座標操作はそれぞれ独自の使用領域を持っています. Transform() が呼び出されると,変換するポイントの座標と使用領域に基づいて,最適な座標操作を決定します.たとえば,NAD27からWGS84への変換には,いくつかの数十の可能な座標操作があります.

座標を変換する対象領域の境界ボックスがわかっている場合,それを指定して候補座標操作を制限することができます:

OGRCoordinateTransformationOptions options;
options.SetAreaOfInterest(-100,40,-99,41);
poTransform = OGRCreateCoordinateTransformation( &oNAD27, &oWGS84, options );

特定の座標操作を使用する必要がある場合,PROJ文字列(単一ステップ操作または +proj=pipeline で始まる複数ステップ文字列),CoordinateOperationを記述するWKT2文字列,または urn:ogc:def:coordinateOperation:EPSG::XXXX URN として指定することができます.

OGRCoordinateTransformationOptions options;

// EPSG:8599, NAD27 to WGS 84 (46), 1.15 m, USA - Indiana
options.SetCoordinateOperation(
    "+proj=pipeline +step +proj=axisswap +order=2,1 "
    "+step +proj=unitconvert +xy_in=deg +xy_out=rad "
    "+step +proj=hgridshift +grids=conus "
    "+step +proj=hgridshift +grids=inhpgn.gsb "
    "+step +proj=unitconvert +xy_in=rad +xy_out=deg +step "
    "+proj=axisswap +order=2,1", false );

// or
// options.SetCoordinateOperation(
//      "urn:ogc:def:coordinateOperation:EPSG::8599", false);

poTransform = OGRCreateCoordinateTransformation( &oNAD27, &oWGS84, options );

代替インターフェース

座標系サービスのCインターフェースは,ogr_srs_api.hで定義されており,Pythonバインディングはosr.pyモジュールを介して利用できます.メソッドはC++メソッドの近似であり,しかしCおよびPythonバインディングは一部のC++メソッドには存在しません.

Cバインディング

typedef void *OGRSpatialReferenceH;
typedef void *OGRCoordinateTransformationH;

OGRSpatialReferenceH OSRNewSpatialReference( const char * );
void    OSRDestroySpatialReference( OGRSpatialReferenceH );

int     OSRReference( OGRSpatialReferenceH );
int     OSRDereference( OGRSpatialReferenceH );

void OSRSetAxisMappingStrategy( OGRSpatialReferenceH,
                                OSRAxisMappingStrategy );

OGRErr  OSRImportFromEPSG( OGRSpatialReferenceH, int );
OGRErr  OSRImportFromWkt( OGRSpatialReferenceH, char ** );
OGRErr  OSRExportToWkt( OGRSpatialReferenceH, char ** );
OGRErr  OSRExportToWktEx( OGRSpatialReferenceH, char **,
                        const char* const* papszOptions );

OGRErr  OSRSetAttrValue( OGRSpatialReferenceH hSRS, const char * pszNodePath,
                        const char * pszNewNodeValue );
const char *OSRGetAttrValue( OGRSpatialReferenceH hSRS,
                            const char * pszName, int iChild);

OGRErr  OSRSetLinearUnits( OGRSpatialReferenceH, const char *, double );
double  OSRGetLinearUnits( OGRSpatialReferenceH, char ** );

int     OSRIsGeographic( OGRSpatialReferenceH );
int     OSRIsProjected( OGRSpatialReferenceH );
int     OSRIsSameGeogCS( OGRSpatialReferenceH, OGRSpatialReferenceH );
int     OSRIsSame( OGRSpatialReferenceH, OGRSpatialReferenceH );

OGRErr  OSRSetProjCS( OGRSpatialReferenceH hSRS, const char * pszName );
OGRErr  OSRSetWellKnownGeogCS( OGRSpatialReferenceH hSRS,
                            const char * pszName );

OGRErr  OSRSetGeogCS( OGRSpatialReferenceH hSRS,
                    const char * pszGeogName,
                    const char * pszDatumName,
                    const char * pszEllipsoidName,
                    double dfSemiMajor, double dfInvFlattening,
                    const char * pszPMName ,
                    double dfPMOffset ,
                    const char * pszUnits,
                    double dfConvertToRadians );

double  OSRGetSemiMajor( OGRSpatialReferenceH, OGRErr * );
double  OSRGetSemiMinor( OGRSpatialReferenceH, OGRErr * );
double  OSRGetInvFlattening( OGRSpatialReferenceH, OGRErr * );

OGRErr  OSRSetAuthority( OGRSpatialReferenceH hSRS,
                        const char * pszTargetKey,
                        const char * pszAuthority,
                        int nCode );
OGRErr  OSRSetProjParm( OGRSpatialReferenceH, const char *, double );
double  OSRGetProjParm( OGRSpatialReferenceH hSRS,
                        const char * pszParamName,
                        double dfDefault,
                        OGRErr * );

OGRErr  OSRSetUTM( OGRSpatialReferenceH hSRS, int nZone, int bNorth );
int     OSRGetUTMZone( OGRSpatialReferenceH hSRS, int *pbNorth );

OGRCoordinateTransformationH
OCTNewCoordinateTransformation( OGRSpatialReferenceH hSourceSRS,
                                OGRSpatialReferenceH hTargetSRS );

void OCTDestroyCoordinateTransformation( OGRCoordinateTransformationH );

int OCTTransform( OGRCoordinateTransformationH hCT,
                int nCount, double *x, double *y, double *z );

OGRCoordinateTransformationOptionsH OCTNewCoordinateTransformationOptions(;

int OCTCoordinateTransformationOptionsSetOperation(
    OGRCoordinateTransformationOptionsH hOptions,
    const char* pszCO, int bReverseCO);

int OCTCoordinateTransformationOptionsSetAreaOfInterest(
    OGRCoordinateTransformationOptionsH hOptions,
    double dfWestLongitudeDeg,
    double dfSouthLatitudeDeg,
    double dfEastLongitudeDeg,
    double dfNorthLatitudeDeg);

void OCTDestroyCoordinateTransformationOptions(OGRCoordinateTransformationOptionsH);

OGRCoordinateTransformationH
OCTNewCoordinateTransformationEx( OGRSpatialReferenceH hSourceSRS,
                                OGRSpatialReferenceH hTargetSRS,
                                OGRCoordinateTransformationOptionsH hOptions );

Pythonバインディング

class osr.SpatialReference
    def __init__(self,obj=None):
    def SetAxisMappingStrategy( self, strategy ):
    def ImportFromWkt( self, wkt ):
    def ExportToWkt(self, options = None):
    def ImportFromEPSG(self,code):
    def IsGeographic(self):
    def IsProjected(self):
    def GetAttrValue(self, name, child = 0):
    def SetAttrValue(self, name, value):
    def SetWellKnownGeogCS(self, name):
    def SetProjCS(self, name = "unnamed" ):
    def IsSameGeogCS(self, other):
    def IsSame(self, other):
    def SetLinearUnits(self, units_name, to_meters ):
    def SetUTM(self, zone, is_north = 1):

class CoordinateTransformation:
    def __init__(self,source,target):
    def TransformPoint(self, x, y, z = 0):
    def TransformPoints(self, points):

歴史と実装上の考慮事項

GDAL 3.0以前, OGRSpatialReferenceクラスは, Coordinate Transformation Services (CT) specification (01-009) で指定されたOGC WKT(WKT 1)形式に強く結びついており,GDALによって解釈される方法がありました.これには, OGC WKT Coordinate System Issues ページで詳細に説明されているさまざまな注意事項が含まれていました.このクラスは,主にWKT 1文字列のメモリ内ツリーのような表現を含んでいました.このクラスは,OGC WKT 1, WKT-ESRIおよびPROJ.4形式へのインポートおよびエクスポートを直接実装していました.再投影サービスは,PROJライブラリを利用してGDALがビルドされている場合にのみ利用可能でした.

GDAL 3.0から, PROJ >= 6.0 ライブラリがGDALの必須依存関係になりました. PROJ 6には,OGC WKT 1, ESRI WKT, OGC WKT 2:2015およびOGC WKT 2:2018表現の組み込みサポートがあります. PROJ 6はまた,ISO-19111 / OGC Abstract Topic 2 "Referencing by coordinate" 標準のC++オブジェクトクラス階層を実装しています.その結果,OGRSpatialReferenceクラスは,主にPROJ PJ* CRSオブジェクトのラッパーとして動作するように変更され,OGC WKT 1表現からできるだけ抽象化しようとしています.ただし,後方互換性のため,一部のメソッドは引数または返り値がOGC WKT 1固有であることを引き続き期待しています. OGRSpatialReferenceクラスの設計はまた,まだ一枚岩です.直接的で細かい粒度のCRS表現へのアクセスを望むユーザーは,PROJ 6 CまたはC++ APIを直接使用することができます.