web-dev-qa-db-ja.com

GeoTIFFファイルから緯度と経度を取得する

PythonでGDALを使用して、GeoTIFFファイルの緯度と経度をどのように取得しますか?

GeoTIFFには座標情報が格納されていないようです。代わりに、XY原点座標を保存します。ただし、XY座標は、左上隅と左下隅の緯度と経度を提供しません。

この問題を解決するためにいくつかの計算を行う必要があるようですが、どこから始めればよいかわかりません。

これを実行するにはどのような手順が必要ですか?

これにはGetGeoTransform()メソッドが重要であることは知っていますが、そこからどうすればよいかわかりません。

41
Phanto

Geotiffのコーナーの座標を取得するには、次のようにします。

from osgeo import gdal
ds = gdal.Open('path/to/file')
width = ds.RasterXSize
height = ds.RasterYSize
gt = ds.GetGeoTransform()
minx = gt[0]
miny = gt[3] + width*gt[4] + height*gt[5] 
maxx = gt[0] + width*gt[1] + height*gt[2]
maxy = gt[3] 

ただし、これらは緯度/経度の形式ではない場合があります。 Justinが述べたように、あなたのgeotiffはある種の座標系で保存されます。座標系がわからない場合は、gdalinfoを実行して確認できます。

gdalinfo ~/somedir/somefile.tif 

どの出力:

Driver: GTiff/GeoTIFF
Size is 512, 512
Coordinate System is:
PROJCS["NAD27 / UTM zone 11N",
    GEOGCS["NAD27",
        DATUM["North_American_Datum_1927",
            SPHEROID["Clarke 1866",6378206.4,294.978698213901]],
        PRIMEM["Greenwich",0],
        UNIT["degree",0.0174532925199433]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_Origin",0],
    PARAMETER["central_meridian",-117],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",0],
    UNIT["metre",1]]
Origin = (440720.000000,3751320.000000)
Pixel Size = (60.000000,-60.000000)
Corner Coordinates:
Upper Left  (  440720.000, 3751320.000) (117d38'28.21"W, 33d54'8.47"N)
Lower Left  (  440720.000, 3720600.000) (117d38'20.79"W, 33d37'31.04"N)
Upper Right (  471440.000, 3751320.000) (117d18'32.07"W, 33d54'13.08"N)
Lower Right (  471440.000, 3720600.000) (117d18'28.50"W, 33d37'35.61"N)
Center      (  456080.000, 3735960.000) (117d28'27.39"W, 33d45'52.46"N)
Band 1 Block=512x16 Type=Byte, ColorInterp=Gray

この出力で十分です。 pythonでプログラムでこれを実行したい場合は、これが同じ情報を取得する方法です。

上記の例のように座標系がPROJCSの場合は、投影座標系を扱っています。投影された座標系は 回転楕円体の地球の表面の表現ですが、平面上に平坦化され、歪んでいます です。緯度と経度が必要な場合は、座標を必要な地理座標系に変換する必要があります。

悲しいことに、すべての緯度/経度のペアが等しく作成されるわけではなく、地球のさまざまな回転楕円体モデルに基づいています。この例では、 WGS84 に変換しています。これは、GPSでよく使用され、人気のあるすべてのWebマッピングサイトで使用されている地理座標系です。座標系は、明確に定義された文字列によって定義されます。それらのカタログは spatial ref から入手できます。たとえば WGS84 を参照してください。

from osgeo import osr, gdal

# get the existing coordinate system
ds = gdal.Open('path/to/file')
old_cs= osr.SpatialReference()
old_cs.ImportFromWkt(ds.GetProjectionRef())

# create the new coordinate system
wgs84_wkt = """
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.01745329251994328,
        AUTHORITY["EPSG","9122"]],
    AUTHORITY["EPSG","4326"]]"""
new_cs = osr.SpatialReference()
new_cs .ImportFromWkt(wgs84_wkt)

# create a transform object to convert between coordinate systems
transform = osr.CoordinateTransformation(old_cs,new_cs) 

#get the point to transform, pixel (0,0) in this case
width = ds.RasterXSize
height = ds.RasterYSize
gt = ds.GetGeoTransform()
minx = gt[0]
miny = gt[3] + width*gt[4] + height*gt[5] 

#get the coordinates in lat long
latlong = transform.TransformPoint(minx,miny) 

うまくいけば、これはあなたが望むことを行います。

80
fmark

これが完全な答えであるかどうかはわかりませんが、 このサイト は次のように述べています。

X/yマップの寸法は、東座標と北座標と呼ばれます。地理座標系のデータセットの場合、これらは経度と緯度を保持します。投影座標系の場合、これらは通常、投影座標系の東座標と北座標になります。地理参照されていない画像の場合、東座標と北座標は、各ピクセルのピクセル/ラインオフセットになります(単一の地理座標変換によって暗示される)。

そのため、実際には経度と緯度になる可能性があります。

16
Justin Peel