GDAL ile Python'da WGS 1984 Web Mercator (EPSG: 3857) yeniden projelendiriliyor


17

GDAL kullanarak python içindeki rasterleri yeniden üretiyorum. Coğrafi WGS 84 koordinatlarından WGS 1984 Web Mercator'a (Yardımcı Küre) birkaç tiff'i daha sonra OpenStreetMap ve belki de Google haritaları ile birlikte kullanmak için projelendirmem gerekiyor. Buradan Python 2.7.5 ve GDAL 1.10.1 kullanıyorum ve buradan önerileri kullanarak koordinatları dönüştürüyorum (kodum aşağıdadır). Kısacası, osgeo.osr dosyasını içe aktardım ve ImportFromEPSG (kod) ve CoordinateTransformation'ı (- arasında) kullandım .

Öncelikle UTM bölgesi 29 olan EPSG'yi (32629) denedim ve bu tahmini raster (az ya da çok iyi) aldım, bu yüzden kod doğru görünüyor: utm Sonra EPSG (3857) kullandım çünkü bu ve bu soruları okudum ve buldum doğru son geçerli kod olduğunu . Ancak raster hiç bir uzaysal referans olmadan yaratılır. WGS 84 veri çerçevesinde çok uzaktır (ancak veri çerçevesini Web Mercator'a değiştirirsem tamam olur). 3857

İle EPSG (900913'ü destekler) çıkış referanslandırılmıştır, kuzey yönünde 3 kafes hücreler hakkında değiştirdi 900913

Raster'i ArcGIS (WGS_1984_Web_Mercator_Auxiliary_Sphere'de dışa aktar) kullanarak yeniden projelendirdiğimde sonuç neredeyse iyi: arcgis

Ve eski kodu 102113 (41001,54004) kullandığımda sonuç mükemmel: 54004

Tüm kodları kullanarak testlerimin özeti :

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

Yani sorularım:

  • Doğru EPSG kodu neden yanlış sonuçlar veriyor?
  • Ve eski kodlar neden iyi çalışıyor, kullanım dışı değil mi?
  • Belki GDAL sürümüm iyi değil veya python kodumda hatalar var?

Kod:

    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'

Söyleyeceğim şeylere yardımcı olabilir, EPSG: 3042'den Google Mercator'a bir raster yeniden tasarlıyorum, prensip olarak 3857 olduğunu düşündüm, ancak denediğimde: gdal_translate -a_srs EPSG: 3857 input.tif output.tif, çıktı çok aşağıda (GDAL 1.11.2), neyse ki ArcGIS 10.2 ve WGS_1984_Web_Mercator_Auxiliary_Sphere (WKID: 3857 Authority: EPSG) kullanarak onları çarpıttığında raster görüntüleri doğru yerdedir. Bu yüzden, EPSG: 3857'nin GDAL'ın en son sürümlerinde düzgün bir şekilde ele alınmadığına inanıyorum.
Web-GIS girişimcisi

3
Yeniden projeksiyondan sonra, tarama artık bir dikdörtgen olmak zorunda değildir. Bu nedenle köşe koordinatlarının yeniden projelendirilmesi yanlış çözüm olabilir. Komut satırında gdalwarp'i denediniz mi? BTW gisinternals en son GDAL sürümünü alabilirsiniz.
AndreJ

Yanıtlar:


5

Dosyaları yeniden projelendiririm gdalwarp.

EPSG: 3857'ye dönüştürmek istediğim EPSG: 3763 dosyalarında da aynısını yaptım. Sonuçları QGIS ve Geoserver kullanarak karşılaştırdım ve oluşturulan görüntüler gayet iyi. Görüntülere küçük bir döndürme uygulandığından, kenarlıkta bazı siyah çizgiler elde edebilirsiniz (ancak bu çizgiler daha sonra şeffaf hale getirilebilir).

Birkaç tifgörüntünüz olduğundan, varolan bir dosyayı değiştirmeyen ve oluşturulan dosyaları 3857 adlı bir klasöre koyan böyle bir komut dosyası kullanabilirsiniz :

#!/bin/bash
mkdir 3857
for file in $(ls *.tif); do
    gdalwarp -s_srs EPSG:3763 -t_srs EPSG:3857 $file 3857/$file;
    listgeo -tfw 3857/$file;
done

.twfDosyaları da oluşturmak istiyorsanız , ekledim listgeo.

Bu komut dosyası Linux içindir, ancak Windows için benzer bir şey yazabilirsiniz.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.