GDAL C++ API 学習ロード (4) 空間参照システム OGRSpatialReference クラス

クラス OGRSpatialReference #include <ogr_spatialref.h>

OGRSpatialReference は、GDAL/OGR ライブラリの重要なクラスであり、地理空間データの空間参照システム (Spatial Reference System、SRS) を管理および操作するために使用されます。ユーザーが地理空間データの座標系と投影情報を定義、クエリ、解析、変換できる一連の関数を提供します。

公的行事

IsSameGeogCS

int IsSameGeogCS(const  OGRSpatialReference *) const 

GeogCS は一致しますか

パラメータ:

poOther  -- 比較される SRS。

戻り値: 同じ場合は TRUE、そうでない場合は FALSE

    // 定义两个 WGS 84 经纬度坐标系的WKT字符串
    const char* wktString1 = "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[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
    const char* wktString2 = "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[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
    
    // 创建两个 OGRSpatialReference 对象,并从WKT字符串中导入空间参考系统
    OGRSpatialReference srs1;
    srs1.importFromWkt(&wktString1);
    OGRSpatialReference srs2;
    srs2.importFromWkt(&wktString2);
    
    // 判断两个空间参考系统是否具有相同的地理坐标系
    int isSameGeogCS = srs1.IsSameGeogCS(&srs2);

    // 输出判断结果
    if (isSameGeogCS) {
        printf("两个空间参考系统具有相同的地理坐标系。\n");
    } else {
        printf("两个空间参考系统具有不同的地理坐标系。\n");
    }

IsSameVertCS

int IsSameVertCS(const  OGRSpatialReference *) const

VertCS は一致しますか

パラメータ:

poOther  -- 比較される SRS。

戻り値: 同じ場合は TRUE、そうでない場合は FALSE

それは同じだ

int IsSame(const  OGRSpatialReference *) const 

2 つの空間参照は同じシステムを表しますか?

パラメータ:

poOtherSRS  – 比較する SRS。

戻り値: 同等の場合は TRUE、そうでない場合は FALSE

   // 定义两个相同的 WGS 84 经纬度坐标系的WKT字符串
    const char* wktString1 = "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[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
    const char* wktString2 = "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[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
    
    // 创建两个 OGRSpatialReference 对象,并从WKT字符串中导入空间参考系统
    OGRSpatialReference srs1;
    srs1.importFromWkt(&wktString1);
    OGRSpatialReference srs2;
    srs2.importFromWkt(&wktString2);
    
    // 判断两个空间参考系统是否完全相同
    int isSame = srs1.IsSame(&srs2);

それは同じだ

int IsSame(const  OGRSpatialReference *, const char *const *papszOptions) const

2 つの空間参照は同じシステムを表しますか?

パラメータ:

  • poOtherSRS  – 比較する SRS。

  • papszOptions – オプション。空またはヌルで終了するオプションのリスト

戻り値: 同等の場合は TRUE、そうでない場合は FALSE

クリア

ボイド クリア( )

現在の定義を消去する

SetProjection

OGRErr  SetProjection ( const  char * )

投影名を設定する

パラメータ:

pszProjection  -- 投影名は、ogr_srs_api.h のマクロから選択する必要があります (SRS_PT_TRANSVERSE_MERCATOR など)。

戻り値: OGRERR_NONE 成功

    // 定义一个 UTM 投影的 WKT 字符串
    const char* wktString = "PROJCS[\"WGS 84 / UTM zone 18N\",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[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-75],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AUTHORITY[\"EPSG\",\"32618\"]]";
    
    // 创建一个 OGRSpatialReference 对象
    OGRSpatialReference srs;
    
    // 设置空间参考系统的投影信息
    OGRErr err = srs.SetProjection(wktString);

SetGeocCS

OGRErr  SetGeocCS ( const  char *pszGeocName )

ユーザーに表示される GEOCCS 名を設定する

パラメータ:

pszName  -- 割り当てるユーザーに表示される名前。鍵としては使用しません。

戻り値: OGRERR_NONE 成功

    // 定义一个地心坐标系的 WKT 字符串
    const char* wktString = "GEOCCS[\"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[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Geocentric X\",OTHER],AXIS[\"Geocentric Y\",EAST],AXIS[\"Geocentric Z\",NORTH],AUTHORITY[\"EPSG\",\"4984\"]]";
    
    // 创建一个 OGRSpatialReference 对象
    OGRSpatialReference srs;
    
    // 设置空间参考系统的地心坐标系名称
    OGRErr err = srs.SetGeocCS(wktString);

SetProjCS

OGRErr  SetProjCS ( const  char * ) ;

ユーザーに表示される PROJCS 名を設定します

パラメータ:

pszName  -- 割り当てるユーザーに表示される名前。鍵としては使用しません。

戻り値: OGRERR_NONE 成功

    // 定义一个墨卡托投影坐标系的 WKT 字符串
    const char* wktString = "PROJCS[\"Mercator\",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[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Mercator_1SP\"],PARAMETER[\"central_meridian\",0],PARAMETER[\"scale_factor\",1],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Easting\",EAST],AXIS[\"Northing\",NORTH],AUTHORITY[\"EPSG\",\"3395\"]]";
    
    // 创建一个 OGRSpatialReference 对象
    OGRSpatialReference srs;
    
    // 设置空间参考系统的投影坐标系名称
    OGRErr err = srs.SetProjCS(wktString);

SetGeogCS

OGRErr SetGeogCS ( const  char *pszGeogName,  const  char *pszDatumName,  const  char *pszEllipsoidName, double dfSemiMajor, double dfInvFlattening,  const  char *pszPMName =  nullptr

double dfPMOffset = 0.0、  const  char *pszUnits =  nullptr、double dfConvertToRadians = 0.0 )

地理座標系を設定する

このメソッドは、地理座標系の測地基準系、楕円体、本初子午線、および角度単位を設定するために使用されます。これを単独で使用して地理空間参照を確立することも、投影座標系に適用して基本的な地理座標系を確立することもできます。

パラメータ:

  • pszGeogName  -- ユーザーに表示される地理座標系の名前 (キーとしては使用されません)。

  • pszDatumName  – このデータのキー名。OpenGIS 仕様にはいくつかの既知の値がリストされていますが、それ以外の場合は、標準変換を含む EPSG データム名が有効なキーとみなされます。

  • pszSpheroidName  -- ユーザーに表示されるスフェロイド名 (キーとして使用されません)

  • dfSemiMajor  -- 楕円体の長半径。

  • dfInvFlattening  -- 楕円体の逆平坦化。これは、準短軸から 1/f = 1.0 / (1.0 - 準短軸/準長軸) として計算できます。

  • pszPMName  -- 本初子午線の名前 (キーとして使用されません) NULL の場合、デフォルト値「グリニッジ」が使用されます。

  • dfPMOffset  -- 本初子午線を基準としたグリニッジの経度。常に度単位で

  • pszAngularUnits  – Angular 単位名 (いくつかの標準名については ogr_srs_api.h を参照)。NULL の場合、値「度」が想定されます。

  • dfConvertToRadians  -- 角度単位に値を乗算してラジアンに変換します。pszAngularUnits が NULL の場合、値 SRS_UA_DEGREE_CONV が使用されます。

戻り値: OGRERR_NONE 成功

    // 创建一个 OGRSpatialReference 对象
    OGRSpatialReference srs;
    
    // 设置地理坐标系的属性
    OGRErr err = srs.SetGeogCS("WGS 84", "WGS_1984", "WGS 84", 6378137, 298.257223563);

SetWellKnownGeogCS

OGRErr  SetWellKnownGeogCS ( const  char * )

既知の名前に基づいて GeogCS をセットアップする

パラメータ:

pszName  -- 既知の地理座標系の名前。

戻り値: 成功した場合は OGRERR_NONE、名前が認識されなかった場合、ターゲット オブジェクトが初期化された場合、または EPSG 値を正常に検索できなかった場合は OGRERR_FAILURE

    // 创建一个 OGRSpatialReference 对象
    OGRSpatialReference srs;
    
    // 设置为 WGS 84 地理坐标系
    OGRErr err = srs.SetWellKnownGeogCS("WGS84");

GeogCSFrom をコピー

OGRErr  CopyGeogCSFromconst  OGRSpatialReference  *poSrcSRS

別のOGRSpatialReferenceから  GEOGCS をコピーします

パラメータ:

poSrcSRS  -- GEOGCS 情報のコピー元の空間参照。

戻り値: 成功時またはエラーコードの場合は OGRERR_NONE

    // 定义一个源空间参考系统,用于复制地理坐标系信息
    const char* srcWktString = "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[\"degree\",0.01745329251994328,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
    OGRSpatialReference srcSRS;
    srcSRS.importFromWkt(&srcWktString);
    
    // 创建一个目标空间参考系统
    OGRSpatialReference dstSRS;
    
    // 复制源空间参考系统中的地理坐标系信息到目标空间参考系统
    OGRErr err = dstSRS.CopyGeogCSFrom(&srcSRS);

SetCompoundCS

OGRErr  SetCompoundCS(const char *pszName、const  OGRSpatialReference  *poHorizSRS、  const  OGRSpatialReference  *poVertSRS

複合座標系の設定 このメソッドは、現在の SRS を水平座標系と垂直座標系で構成される COMPD_CS 座標系に置き換えます。

パラメータ:

  • pszName  -- 複合座標系の名前。

  • poHorizSRS  - 水平 SRS (PROJCS または GEOGCS)。

  • poVertSRS -- 垂直 SRS  (VERT_CS)。

戻り値: OGRERR_NONE 成功

    // 创建一个 OGRSpatialReference 对象
    OGRSpatialReference srs;
    
    // 设置复合坐标系
    const char* compoundCSName = "WGS 84 + EGM96";
    
    // 创建水平坐标系(地理或投影)和垂直坐标系的空间参考系统
    OGRSpatialReference horizSRS, vertSRS;
    horizSRS.SetWellKnownGeogCS("WGS84");
    vertSRS.importFromEPSG(5773); // EGM96 - Earth Gravitational Model 1996
    
    // 设置复合坐标系
    OGRErr err = srs.SetCompoundCS(compoundCSName, &horizSRS, &vertSRS);

座標エポックの設定

void  SetCooperativeEpoch(double  dfCooperativeEpoch

座標エポックを 10 進数の年に設定します

パラメータ:

dfCoownedEpoch  -- エポックを 10 進数の年として調整します (例: 2021.3)

    // 创建一个 OGRSpatialReference 对象
    OGRSpatialReference srs;
    
    // 设置坐标时期为 2000.0 年
    double coordinateEpoch = 2000.0;
    srs.SetCoordinateEpoch(coordinateEpoch);
    
    // 输出设置结果
    printf("成功设置空间参考系统的坐标时期为 %.1f 年。\n", coordinateEpoch);
空间参考系统的坐标时期为 2000.0 年。

座標期間が 2000.0 で時刻が 1998 年の場合、時間差は座標期間 2000.0 に対して -2.0 年です。

時間差は、ターゲット時間から座標期間を引いたものとして計算されます。ターゲット時刻が座標エポックよりも遅い場合、時間差は正となり、ターゲット時刻が座標エポックよりも早い場合、時間差は負になります。

この例では、時刻が 1998 年の場合、座標期間 2000.0 との時差は -2.0 年です。これは、空間データ内の位置情報が 2000 年を基準としたものであることを意味します。これらの位置情報を 1998 年を基準とした位置に変換する場合は、時差 -2.0 年に従って対応する座標変換を実行できます。これにより、2年間の地球の小さな変化を考慮し、より正確な位置情報を取得することができます。

座標エポックの取得

double GetCooperativeEpoch() const

戻り値: 座標エポック エポックを 10 進数の年 (例: 2021.3) として座標化します。設定されていないか関連していない場合は 0 を返します。

    // 创建一个 OGRSpatialReference 对象
    OGRSpatialReference srs;
    
    // 设置坐标时期为 2000.0 年
    double coordinateEpoch = 2000.0;
    srs.SetCoordinateEpoch(coordinateEpoch);
    
    // 获取坐标时期并输出结果
    double retrievedEpoch = srs.GetCoordinateEpoch();
    printf("空间参考系统的坐标时期为 %.1f 年。\n", retrievedEpoch);
空间参考系统的坐标时期为 2000.0 年。

Guess you like

Origin blog.csdn.net/qq_69574549/article/details/132068599