アフィン座標を緯度/経度に変換するにはどうすればよいですか?


14

私はGISを初めて使用します。

私はgdal土地利用/土地被覆地図を読み込むために使用しており、特定の土地被覆タイプの緯度/経度を選択して、緯度/経度でのみ表現される別のデータセットにインデックスを付ける必要があります。Unfortuantelyは、私は具体的には、geotransformから私に与えられたx、y座標の形式を理解していないoriginXoriginY、以下の:

geotransform = dataset.GetGeoTransform()
originX = geotransform[0]
originY = geotransform[3]

これらの値を印刷すると、のような座標が得られます(447466.693808, 4952570.40529)。これらは元の緯度と経度にどのように関係していますか?

編集:

ここに私が探していたものを手に入れた簡単なpythonの例があります:

srs = osr.SpatialReference()
srs.ImportFromWkt(dataset.GetProjection())

srsLatLong = srs.CloneGeogCS()
ct = osr.CoordinateTransformation(srs,srsLatLong)
print ct.TransformPoint(originX,originY)

盗難:tolatlong.py


データが投影されているように見えます(例:UTM)。投影を「アン投影」して長い/緯度の座標に戻すには、投影が何であるかを知る必要があります。

@Danありがとう、a dataset.GetProjectionRef()を介して投影を取得し、「UTM Zone 10」を使用していることがわかりますが、それではどうでしょうか。「unproject」などのメソッドを探し回っていますが、nullになります。
リッチ

10進度のデータは投影されないため、unproject(引用符で)という用語を使用して申し訳ありませんが、任意の投影から投影データを10進度に戻したい場合は、(引用符に注意して) "project"地理座標系、つまり小数度データに戻ります。

2
この(新しい)スレッドは、明示的な一例と別の解決策を提供gis.stackexchange.com/questions/8430/...
whuber

回答:


10

gdal_translateは、次の方法を使用して、他の投影法(この場合はEPSG:4326が必要)にデータを再投影します。

gdal_translate -a_srs epsg:4326 srcfile new_file 

または、gdaltrasformを使用してポイントを変換できます(そして、Python(?)からもアクセスできると確信しています)


(+1)アフィン変換が適用された後に必要になるような何らかの操作のように見えるので、なぜこれがダウン投票されたのかわかりません。
whuber

gdal_translateは、本来の方法では機能しません(または、単にEPSG:4326をデータに割り当てるだけです)。次のようなデータをワープする必要があります。gdalwarp -s_srs EPSG:32610 -t_srs EPSG:4326 src destデータにはすでにprojメタデータが含まれているため、-s_srsパラメーターを削除できます。
MerseyViking

たぶんこれは私が望んでいることです。「epsg:4326」はグローバルな緯度/経度への変換ですか?投影を提供できるクラスがいくつかあると思います。「WGS:84」を考えていましたが、違いはわかりません。
リッチ

1
@Rich 質問の「coordinate-system」タグをクリックし、得られたページを投票で並べ替えて、読み始めます。あなたの質問の多くは数分以内に回答されます。
whuber

7

geotransformはhttps://gdal.org/user/raster_data_model.htmlに文書化されています。これは、データセットから(x、y)座標を直接取得し、線形変換を適用して(u、v)を取得するという考え方です。

u = a*x + b*y
v = c*x + d*y

(これを線形変換の定義とすることができます)、uにgeotransform [0]を、vにgeotransform [3]を追加して原点をシフトします。これにより、(x、y)の「アフィン変換」が得られます。回転、スケールの変更、スキューエラーの多少の修正、および既知の座標系と一致するようにデータ固有の座標(x、y)を再配置することを実際に意図しています。結果は、投影座標を生成することになっています。 これは単に、(経度、緯度)を取り、既知の座標に変換する数学的手順があることを意味します。これは「投影」と呼ばれます。「投影解除」はその逆です。したがって、必要な投影法がわかっている場合は、アフィン変換された(x、y)座標に適用します 緯度と経度を取得します。

ところで、定数a、b、c、dの値は、geotransform配列の1、2、4、および5エントリによって与えられます。


1
あなたが提供したリンクの地理変換セクションを読みましたが、これが私が望んでいることではないと思います。私が鈍い場合は申し訳ありませんが、これは投影された座標にxおよびyインデックス(0からXSizeまたはYSize)を投影する方法を説明していませんか?投影座標を緯度と経度に変換する方法を知りたいです。簡単な例として、ジオトランスフォームは、投影座標(447466.693808、4952570.40529)でラスターの左上隅のx / y原点を定義します。これらの座標を緯度/経度(緯度:44、lng:-122のようなもの)に戻す方法を教えてください。
リッチ

@Richいいえ、そのリンクは投影を説明していません。これは、世界と地図の間ではなく、2つの地図間の座標の変化のみを説明しています。非投影は、座標のアフィン変換を(lat、lon)に変換します。あなたがそれを助けることができるなら、あなたはそのためのコードを書きたくありません!非投影は、ほとんどの場合、どの投影が必要かを特定し、適切なソフトウェアを呼び出してあなたのために仕事をする問題です(@iantの返信で示唆されているように)。
whuber

リンクが壊れています。@whuber(GDALのGetGeoTransformからの)アフィン変換は、ピクセルとCRS座標の間の変換であると思いますか?たとえば、データがGDAプロジェクションにある場合、ポイントは、たとえばCoordianteTransformを使用してWGS84 / lat / lonからGDAXXに変換し、次にアフィンGeoTransformを使用してピクセルに変換する必要がありますか?この2段階のプロセスは、私をかなりつまずかせてきたものであり、OPのトラブルも引き起こしていると思われます。xarray / rasterioがGeoTransformの値を台無しにするバグを持っているように見えるのを助けませんでした:github.com/pydata/xarray/issues/3185
naught101

@naught新しいURLを見つけて、投稿を更新しました。
whuber

0

以下を使用できます。

import gdal, numpy as n
def coord(file):
    padfTransform = file.GetGeoTransform()
    indices = n.indices(file.ReadAsArray().shape)
    xp = padfTransform[0] + indices[1]*padfTransform[1] + indices[1]*padfTransform[2]   
    yp = padfTransform[3] + indices[0]*padfTransform[4] + indices[0]*padfTransform[5]  
    return xp,yp
file = gdal.Open('Yourfile.tif') # A GeoTiff file
x,y = coord(file)

coordは、すべてのピクセルの経度(x)と緯度(y)を返します。座標はピクセルの左隅にあることに注意してください


それはindixes [1] * padfTransform [1] + indexs [0] * padfTransform [2]であり、その逆はypではないでしょうか?
CMCDragonkai
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.