GDAL을 사용하여 파이썬으로 래스터를 다시 투영하고 있습니다. 나중에 OpenStreetMap 및 Google지도와 함께 Openlayers에서 사용하려면 지리적 WGS 84 좌표에서 WGS 1984 Web Mercator (Auxiliary Sphere)로 여러 가지 강성을 투영해야합니다. 여기 에서 Python 2.7.5 및 GDAL 1.10.1을 사용하고 여기 에서 조언을 사용하여 좌표를 변환하고 있습니다 (내 코드는 다음과 같습니다). 즉, 나는 수입 osgeo.osr 및 사용 ImportFromEPSG (코드) 와 (에,에서) CoordinateTransformation을 .
내가 먼저 시도 EPSG (32629) 코드가 올바른 것 같다, 그래서 UTM 구역 (29)이며,이 투영 된 래스터 (더 많거나 적은 미세) 도착 : 그럼 난 사용 EPSG (3857)를 내가 읽은 때문에 이 와 이 질문에 발견을 올바른 최근 유효한 코드 입니다. 그러나 래스터는 공간 참조없이 생성됩니다. WGS 84 데이터 프레임에서 멀리 떨어져 있지만 데이터 프레임을 Web Mercator로 전환해도 괜찮습니다.
함께 EPSG (900,913) 의 출력은 참조 된되지만 북쪽 3 개 래스터 셀에 대해 시프트 :
ArcGIS (WGS_1984_Web_Mercator_Auxiliary_Sphere로 내보내기)를 사용하여 래스터를 재 투영하면 결과가 거의 좋습니다.
그리고 이전 코드 102113 (41001,54004)을 사용 하면 결과가 완벽합니다.
모든 코드를 사용한 테스트 요약 :
3857: far away up (missing georeference)
3785: far away up (like 3857)
3587: far away right
900913: slightly jumped up
102100: python error
102113: perfect
41001: perfect
54004: perfect
ArcGIS (web merc. aux.): good
그래서 내 질문은 :
- 올바른 EPSG 코드가 왜 잘못된 결과를 줍니까?
- 왜 이전 코드가 제대로 작동합니까, 더 이상 사용되지 않습니까?
- 어쩌면 내 GDAL 버전이 좋지 않거나 파이썬 코드에 오류가 있습니까?
코드:
yres = round(lons[1]-lons[0], 4) # pixel size, degrees
xres = round(lats[1]-lats[0], 4)
ysize = len(lats)-1 # number of pixels
xsize = len(lons)-1
ulx = round(lons[0], 4)
uly = round(lats[-1], 4) # last
driver = gdal.GetDriverByName(fileformat)
ds = driver.Create(filename, xsize, ysize, 2, gdal.GDT_Float32) # 2 bands
#--- Geographic ---
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326) # Geographic lat/lon WGS 84
ds.SetProjection(srs.ExportToWkt())
gt = [ulx, xres, 0, uly, 0, -yres] # the affine transformation coeffs (ulx, pixel, angle(skew), uly, angle, -pixel)
ds.SetGeoTransform(gt) # coords of top left corner of top left pixel (w-file - center of the pixel!)
outband = ds.GetRasterBand(1)
outband.WriteArray(data)
outband2 = ds.GetRasterBand(2)
outband2.WriteArray(data3)
#--- REPROJECTION ---
utm29 = osr.SpatialReference()
# utm29.ImportFromEPSG(32629) # utm 29
utm29.ImportFromEPSG(900913) # web mercator 3857
wgs84 = osr.SpatialReference()
wgs84.ImportFromEPSG(4326)
tx = osr.CoordinateTransformation(wgs84,utm29)
# Get the Geotransform vector
# Work out the boundaries of the new dataset in the target projection
(ulx29, uly29, ulz29) = tx.TransformPoint(ulx, uly) # corner coords in utm meters
(lrx29, lry29, lrz29) = tx.TransformPoint(ulx + xres*xsize, uly - yres*ysize )
filenameutm = filename[0:-4] + '_web.tif'
dest = driver.Create(filenameutm, xsize, ysize, 2, gdal.GDT_Float32)
xres29 = round((lrx29 - ulx29)/xsize, 2) # pixel size, utm meters
yres29 = abs(round((lry29 - uly29)/ysize, 2))
new_gt = [ulx29, xres29, 0, uly29, 0, -yres29]
dest.SetGeoTransform(new_gt)
dest.SetProjection(utm29.ExportToWkt())
gdal.ReprojectImage(ds, dest, wgs84.ExportToWkt(), utm29.ExportToWkt(), gdal.GRA_Bilinear)
dest.GetRasterBand(1).SetNoDataValue(0.0)
dest.GetRasterBand(2).SetNoDataValue(0.0)
dest = None # Flush the dataset to the disk
ds = None # only after the reprojected!
print 'Image Created'