2013-04-19 1 views
2

각 포인트에 대해 해당 포인트의 위도와 경도를 알고 있고 다른 데이터에서 투영 된 GTiff에 데이터를 쓰고 싶습니다. 파일. 새 파일을 어떻게 정확하게 지리 참조합니까? 난 그냥 지금 시도하고있는 무슨 Python GDAL : 다른 파일을 투영에 사용하는 지형 참조 배열

은 다음과 같습니다

import numpy as np 
import gdal 
from gdalconst import * 
from osgeo import osr 

def GetGeoInfo(FileName): 
    SourceDS = gdal.Open(FileName, GA_ReadOnly) 
    GeoT = SourceDS.GetGeoTransform() 
    Projection = osr.SpatialReference() 
    Projection.ImportFromWkt(SourceDS.GetProjectionRef()) 
    return GeoT, Projection 

def CreateGeoTiff(Name, Array, driver, 
        xsize, ysize, GeoT, Projection): 
    DataType = gdal.GDT_Float32 
    NewFileName = Name+'.tif' 
    # Set up the dataset 
    DataSet = driver.Create(NewFileName, xsize, ysize, 1, DataType) 
      # the '1' is for band 1. 
    DataSet.SetGeoTransform(GeoT) 
    DataSet.SetProjection(Projection.ExportToWkt()) 
    # Write the array 
    DataSet.GetRasterBand(1).WriteArray(Array) 
    return NewFileName 

def ReprojectCoords(x, y,src_srs,tgt_srs): 
    trans_coords=[] 
    transform = osr.CoordinateTransformation(src_srs, tgt_srs) 
    x,y,z = transform.TransformPoint(x, y) 
    return x, y 

# Some Data 
Data = np.random.rand(5,6) 
Lats = np.array([-5.5, -5.0, -4.5, -4.0, -3.5]) 
Lons = np.array([135.0, 135.5, 136.0, 136.5, 137.0, 137.5]) 

# A raster file that exists in the same approximate aregion. 
RASTER_FN = 'some_raster.tif' 

# Open the raster file and get the projection, that's the 
# projection I'd like my new raster to have, it's 'projected', 
# i.e. x, y values are numbers of pixels. 
GeoT, TargetProjection, DataType = GetGeoInfo(RASTER_FN) 
# Meanwhile my raster is currently in geographic coordinates. 
SourceProjection = TargetProjection.CloneGeogCS() 

# Get the corner coordinates of my array 
LatSize, LonSize = len(Lats), len(Lons) 
LatLow, LatHigh = Lats[0], Lats[-1] 
LonLow, LonHigh = Lons[0], Lons[-1] 
# Reproject the corner coordinates from geographic 
# to projected... 
TopLeft = ReprojectCoords(LonLow, LatHigh, SourceProjection, TargetProjection) 
BottomLeft = ReprojectCoords(LonLow, LatLow, SourceProjection, TargetProjection) 
TopRight = ReprojectCoords(LonHigh, LatHigh, SourceProjection, TargetProjection) 
# And define my Geotransform 
GeoTNew = [TopLeft[0], (TopLeft[0]-TopRight[0])/(LonSize-1), 0, 
      TopLeft[1], 0, (TopLeft[1]-BottomLeft[1])/(LatSize-1)] 

# I want a GTiff 
driver = gdal.GetDriverByName('GTiff') 
# Create the new file... 
NewFileName = CreateGeoTiff('Output', Data, driver, LatSize, LonSize, GeoTNew, TargetProjection) 
+0

무엇을하려고합니까? 'SourceProjection = TargetProjection.CloneGeogCS()'를 사용한다면, 데이터 값을 목표 그리드로 보간하기를 원하지 않습니까? osr.CoordinateTransformation을 사용한 재 투영은 소스 및 대상 격자가 아마도 '정렬'되어 있지 않기 때문에 래스터/격자에 유용하지 않으므로 채워진 대상 격자가 필요하면 일부 보간 형식을 수행해야합니다. –

+0

@RutgerKassies 예. 재 투영이 어떤 형태의 보간법을 초래할 수도 있지만, 너무 좁은 영역에서는 그다지 중요하지 않을 것이라는 것을 알고 있습니다. QGIS에서 다른 래스터 파일로 열 수 있도록 배열에 양식을 저장하고 싶습니다. – EddyTheB

+1

다른 질문으로 썼습니다. (http://gis.stackexchange.com/questions/58517/python-gdal-save-array-as-raster-with-projection-from-other-file/58551?noredirect=1# 58551) 그런 다음 몇 가지 이유로 내 프로필에서 질문이 사라 졌으므로 여기를 클릭하여 저장하지 않았거나 무언가를 다시 작성하지 못했다고 가정했습니다. 이제 원판이 대답과 함께 나타났습니다. 아마도 필요한 reptation을 가진 누군가가이 질문을 복제본으로 표시 할 수 있습니까? – EddyTheB

답변

1

당신은 QGIS에서 사용하기에 래스터에 데이터를 저장하면된다하려는 모든, 당신은 단순히 새로운 Geotiff (또는 다른를 구성 할 수있는 경우 GDAL 형식). 어떤 형태의 재 투영이나 보간을하고 싶지 않으면 '목표 래스터'가 필요하지 않습니다. 여기

은 예이다 :

import gdal 
import osr 
import numpy as np 

data = np.random.rand(5,6) 
lats = np.array([-5.5, -5.0, -4.5, -4.0, -3.5]) 
lons = np.array([135.0, 135.5, 136.0, 136.5, 137.0, 137.5]) 

xres = lons[1] - lons[0] 
yres = lats[1] - lats[0] 

ysize = len(lats) 
xsize = len(lons) 

ulx = lons[0] - (xres/2.) 
uly = lats[-1] - (yres/2.) 

driver = gdal.GetDriverByName('GTiff') 
ds = driver.Create('D:\\test.tif', xsize, ysize, 1, gdal.GDT_Float32) 

# this assumes the projection is Geographic lat/lon WGS 84 
srs = osr.SpatialReference() 
srs.ImportFromEPSG(4326) 
ds.SetProjection(srs.ExportToWkt()) 

gt = [ulx, xres, 0, uly, 0, yres ] 
ds.SetGeoTransform(gt) 

outband = ds.GetRasterBand(1) 
outband.WriteArray(data) 

ds = None 

이 예제에서 나는 것으로하여 위도/경도 GDAL가 반 pixelsize가 필요한 추가 에지에서 작동 이후의은, 화소의 중심을 참조.