FAQ
測地基準系の変換を考慮した座標系の変換

ナレッジ番号:5292 | 登録日:2023/07/26 | 更新日:2024/10/09

概要

フィーチャクラスやジオメトリを異なる測地基準系に変換する場合、投影変換メソッドの引数に IGeoTransformation を実装したオブジェクトを設定する必要があります。測地成果2000 や測地成果 2011 に対応した変換を行う場合は NTv2Transformation オブジェクトを使用します。

サンプル コード

ジオメトリの座標を変換

ジオメトリ オブジェクトを異なる測地系に変換するには、IGeometry2::ProjectEx メソッドを使用します。引数には順に以下を設定します。IGeoTransformation オブジェクトは、変換したい方法によってオブジェクトのプロパティが異なります。

  1. 変換後の空間参照オブジェクト
  2. 変換方向
  3. IGeoTransformation オブジェクト
  4. 変換により直線がカーブになる場合、カーブする場所に新たに頂点を挿入するかどうか
  5. 頂点を挿入した際の最大セグメント長
  6. 頂点を挿入した際の最大湾曲偏差
上記の 5,6 の引数は、4 が True の時のみ有効です。また 4 を True にしても 5,6 を 0 に設定すると 4 が False の時と同じ振る舞いになります。 (0 を指定することにより最適な値が自動的に割り当てられるわけではありません。)
System.Type t = System.Type.GetTypeFromProgID("esriGeometry.SpatialReferenceEnvironment");
ISpatialReferenceFactory pSpatialReferenceFactory = (ISpatialReferenceFactory)System.Activator.CreateInstance(t);

//GCS_Tokyo の作成
ISpatialReference GCS_Tokyo = pSpatialReferenceFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_Tokyo);

//ポイントの作成
IPoint pPoint = new PointClass();
pPoint.SpatialReference = GCS_Tokyo;    //空間参照のセット
pPoint.PutCoords(135, 35);

//GCS_JGD2000 の作成
ISpatialReference GCS_JGD2000 = pSpatialReferenceFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCS3Type.esriSRGeoCS_JapanGeodeticDatum2000);

String report = "GCS_Tokyo (X:" + pPoint.X.ToString() + ", Y:" + pPoint.Y.ToString() +")" + Environment.NewLine;

//測地系の変換
IGeometry2 pGeometry = (IGeometry2)pPoint;
pGeometry.ProjectEx(GCS_JGD2000, esriTransformDirection.esriTransformForward, TKY2JGD2000(),false, 0, 0);

report += "GCS_JGD2000 (X:" + pPoint.X.ToString() + ", Y:" + pPoint.Y.ToString() + ")";

System.Windows.Forms.MessageBox.Show(report);
Dim t As System.Type = System.Type.GetTypeFromProgID("esriGeometry.SpatialReferenceEnvironment")
Dim pSpatialReferenceFactory As ISpatialReferenceFactory = DirectCast(System.Activator.CreateInstance(t), ISpatialReferenceFactory)

'GCS_Tokyo の作成
Dim GCS_Tokyo As ISpatialReference = pSpatialReferenceFactory.CreateGeographicCoordinateSystem(CInt(esriSRGeoCSType.esriSRGeoCS_Tokyo))

'ポイントの作成
Dim pPoint As IPoint = New PointClass()
pPoint.SpatialReference = GCS_Tokyo '空間参照のセット
pPoint.PutCoords(135, 35)

'GCS_JGD2000 の作成
Dim GCS_JGD2000 As ISpatialReference = pSpatialReferenceFactory.CreateGeographicCoordinateSystem(CInt(esriSRGeoCS3Type.esriSRGeoCS_JapanGeodeticDatum2000))

Dim report As String = "GCS_Tokyo (X:" & pPoint.X.ToString() & ", Y:" & pPoint.Y.ToString() & ")" + Environment.NewLine

'測地系の変換
Dim pGeometry As IGeometry2 = CType(pPoint, IGeometry2)
pGeometry.ProjectEx(GCS_JGD2000, esriTransformDirection.esriTransformForward, TKY2JGD2000(), False, 0, 0)

report += "GCS_JGD2000 (X:" & pPoint.X.ToString() & ", Y:" & pPoint.Y.ToString() & ")"

System.Windows.Forms.MessageBox.Show(report)

NTv2Transformation オブジェクトの作成(測地成果2000)

測地成果2000 に対応した IGeoTransformation オブジェクトを作成するには以下のように記述します。

//TKY2JGD(測地成果2000)の作成
static IGeoTransformation TKY2JGD2000()
{
    IGridTransformation pGridTransformation = new NTv2TransformationClass();
    pGridTransformation.Name = "Tokyo_To_JGD_2000_NTv2";
    pGridTransformation.GridDatasetName = "Dataset_japan/tky2jgd.gsb";
    pGridTransformation.Load();
    return (IGeoTransformation)pGridTransformation;
}
'TKY2JGD(測地成果2000)の作成
Private Shared Function TKY2JGD2000() As IGeoTransformation
        Dim pGridTransformation As IGridTransformation = New NTv2TransformationClass()
        pGridTransformation.Name = "Tokyo_To_JGD_2000_NTv2"
        pGridTransformation.GridDatasetName = "Dataset_japan/tky2jgd.gsb"
        pGridTransformation.Load()
        Return CType(pGridTransformation,  IGeoTransformation)
End Function

NTv2Transformation オブジェクトの作成(測地成果2011)

測地成果2011 に対応した IGeoTransformation オブジェクトを作成するには以下のように記述します。

//TKY2JGD(測地成果2011)の作成
static IGeoTransformation TKY2JGD2011()
{
    IGridTransformation pGridTransformation = new NTv2TransformationClass();
    pGridTransformation.Name = "JGD_2000_To_JGD_2011_NTv2_1";
    pGridTransformation.GridDatasetName = "Dataset_japan/touhokutaiheiyouoki2011.gsb";
    pGridTransformation.Load();
    return (IGeoTransformation)pGridTransformation;
}
'TKY2JGD(測地成果2000)の作成
Private Shared Function TKY2JGD2000() As IGeoTransformation
        Dim pGridTransformation As IGridTransformation = New NTv2TransformationClass()
        pGridTransformation.Name = "JGD_2000_To_JGD_2011_NTv2_1"
        pGridTransformation.GridDatasetName = "Dataset_japan/touhokutaiheiyouoki2011.gsb"
        pGridTransformation.Load()
        Return CType(pGridTransformation,  IGeoTransformation)
End Function

ISpatailReferenceFactory::CreateGeoTransformation メソッドを使用した NTv2Transformation オブジェクトの作成(バージョン 10.1 以降)

バージョン10.1 から、測地成果2000 と測地成果2011 に対応した NTv2Transformation オブジェクトを作成するための定数が用意されました。CreateGeoTransformation メソッドによりオブジェクトが作成できます。

割り当てる定数 (WKID) については、こちらのドキュメント でご確認ください。バージョンによって使用する地理座標系変換の名称が異なる場合があるのでご注意ください。

static IGeoTransformation TKY2JGD()
{
    System.Type t = System.Type.GetTypeFromProgID("esriGeometry.SpatialReferenceEnvironment");
    ISpatialReferenceFactory pSpatialReferenceFactory = (ISpatialReferenceFactory)System.Activator.CreateInstance(t);
    ITransformation pTransformation = pSpatialReferenceFactory.CreateGeoTransformation(6712); //6712:Tokyo_To_JGD_2000_NTv2, 6713:JGD_2000_To_JGD_2011_NTv2_1
    
    IGeoTransformation pGeoTransformation = (IGeoTransformation)pTransformation;
    return pGeoTransformation;
}
Private Shared Function TKY2JGD() As IGeoTransformation
    Dim t As System.Type = System.Type.GetTypeFromProgID("esriGeometry.SpatialReferenceEnvironment")
    Dim pSpatialReferenceFactory As ISpatialReferenceFactory = CType(System.Activator.CreateInstance(t), ISpatialReferenceFactory)
    Dim pTransformation As ITransformation = pSpatialReferenceFactory.CreateGeoTransformation(6712)   '6712:Tokyo_To_JGD_2000_NTv2, 6713:JGD_2000_To_JGD_2011_NTv2_1
    Dim pGeoTransformation As IGeoTransformation = CType(pTransformation, IGeoTransformation)
   Return pGeoTransformation
End Function

ISpatailReferenceFactory::CreateGeoTransformation メソッドを使用したコンポジット地理座標系変換オブジェクトの作成

コンポジット地理座標系変換オブジェクトは ICompositeGeoTransformation を実装して作成し、Add メソッドで地理座標系変換オブジェクトを追加します。以下は「Tokyo_To_JGD_2000_NTv2 + JGD_2000_To_JGD_2011_NTv2_1」を作成した例です。

static ICompositeGeoTransformation TransCompo()
{
    System.Type t = System.Type.GetTypeFromProgID("esriGeometry.SpatialReferenceEnvironment");
    ISpatialReferenceFactory pSpatialReferenceFactory = (ISpatialReferenceFactory)System.Activator.CreateInstance(t);

    ICompositeGeoTransformation pCompositeGeoTransformation = (ICompositeGeoTransformation)new CompositeGeoTransformation();

    //GeoTransformation の作成①
    IGeoTransformation pGeoTransformationA = pSpatialReferenceFactory.CreateGeoTransformation(6712) as IGeoTransformation;  //6712:Tokyo_To_JGD_2000_NTv2
    pCompositeGeoTransformation.Add(esriTransformDirection.esriTransformForward, pGeoTransformationA);

    //GeoTransformation の作成②
    IGeoTransformation pGeoTransformationB = pSpatialReferenceFactory.CreateGeoTransformation(6713) as IGeoTransformation; //6713:JGD_2000_To_JGD_2011_NTv2_1
    pCompositeGeoTransformation.Add(esriTransformDirection.esriTransformForward, pGeoTransformationB);

    return pCompositeGeoTransformation;

}
Private Shared Function TransComposite() As ICompositeGeoTransformation
    Dim t As System.Type = System.Type.GetTypeFromProgID("esriGeometry.SpatialReferenceEnvironment")
    Dim pSpatialReferenceFactory As ISpatialReferenceFactory = CType(System.Activator.CreateInstance(t), ISpatialReferenceFactory)

    'CompositeGeoTransformation オブジェクトを作成
    Dim pCompositeGeoTransformation As ICompositeGeoTransformation = New CompositeGeoTransformationClass()

    '/GeoTransformation の作成①
    Dim pGeoTransformationA As IGeoTransformation = pSpatialReferenceFactory.CreateGeoTransformation(6712)
    pCompositeGeoTransformation.Add(esriTransformDirection.esriTransformForward, pGeoTransformationA)

    '/GeoTransformation の作成②
    Dim pGeoTransformationB As IGeoTransformation = pSpatialReferenceFactory.CreateGeoTransformation(6713)
    pCompositeGeoTransformation.Add(esriTransformDirection.esriTransformReverse, pGeoTransformationB)
    Return pCompositeGeoTransformation
End Function

注意

ArcGIS 10 では、標準インストールでは測地成果2011 の変換に対応したパラメーターはインストールされません。国内対応パックとパッチをインストールしてください。

メタデータ

機能

種類

製品