Đánh giá lại Wator 1984 Web Mercator (EPSG: 3857) bằng Python với GDAL


17

Tôi đang định hướng lại các trình quét trong python bằng GDAL. Tôi cần phải chiếu một số tiff từ tọa độ WGS 84 địa lý đến WGS 1984 Web Mercator (Phụ trợ hình cầu), để sử dụng chúng sau này trong Openlayers cùng với OpenStreetMap và có thể là bản đồ Google. Tôi đang sử dụng Python 2.7.5 và GDAL 1.10.1 từ đây và chuyển đổi tọa độ bằng các lời khuyên từ đây (mã của tôi ở bên dưới). Nói tóm lại, tôi đã nhập osgeo.osr và sử dụng ImportFromEPSG (mã)Tọa độ Thông tin (từ, đến) .

Tôi cố gắng trước hết EPSG (32.629) là khu UTM 29 và nhận được raster dự này (nhiều hơn hoặc ít hơn tốt), do đó các mã có vẻ là đúng: ừm Sau đó, tôi sử dụng EPSG (3857) bởi vì tôi đã đọc nàynày thắc mắc and Found Đó là mã hợp lệ gần đây chính xác . Nhưng raster được tạo ra không có tham chiếu không gian nào cả. Nó ở rất xa trong khung dữ liệu WGS 84 (nhưng sẽ ổn nếu tôi chuyển khung dữ liệu sang Web Mercator). 3857

Với EPSG (900913) , đầu ra được tham chiếu địa lý, nhưng đã dịch chuyển khoảng 3 ô raster về phía bắc: 900913

Khi tôi từ chối trình raster bằng ArcGIS (xuất trong WGS_1984_Web_Mercator_Auxadder_Sphere), kết quả gần như tốt: hồ quang

Và khi tôi sử dụng mã cũ 102113 (41001,54004) thì kết quả thật hoàn hảo: 54004

Tóm tắt các bài kiểm tra của tôi bằng cách sử dụng tất cả các mã :

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

Vì vậy, câu hỏi của tôi là:

  • Tại sao mã EPSG chính xác cho tôi kết quả sai?
  • Và tại sao các mã cũ hoạt động tốt, không phải chúng bị phản đối?
  • Có lẽ phiên bản GDAL của tôi không tốt hoặc tôi có lỗi trong mã python của mình?

Mật mã:

    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'

Nó có thể giúp những gì tôi sẽ nói, tôi đang chiếu lại một raster từ EPSG: 3042 cho Google Mercator, tôi nghĩ rằng về nguyên tắc là 3857, nhưng khi tôi thử: gdal_translate -a_srs EPSG: 3857 input.tif output.tif, đầu ra ở rất xa (GDAL 1.11.2), may mắn thay khi warp chúng bằng ArcGIS 10.2 và WGS_1984_Web_Mercator_Auxadder_Sphere (WKID: 3857 Author: EPSG) các hình ảnh raster đang ở đúng vị trí. Vì vậy, tôi tin rằng EPSG: 3857 không được xử lý đúng cách trong các phiên bản mới nhất của GDAL.
Doanh nhân Web-GIS

3
Sau khi từ chối, raster không phải là một hình chữ nhật nữa. Vì vậy, từ chối các tọa độ góc có thể là giải pháp sai. Bạn đã thử gdalwarp trên dòng lệnh chưa? BTW bạn có thể nhận phiên bản GDAL mới nhất từ ​​gisi INTERNals.
AndreJ

Câu trả lời:


5

Tôi sẽ reproject các tập tin với gdalwarp.

Tôi đã làm tương tự cho các tệp trong EPSG: 3763 mà tôi muốn chuyển đổi sang EPSG: 3857. Tôi đã so sánh kết quả bằng cách sử dụng QGIS và Geoserver và hình ảnh được tạo ra đều ổn. Vì một vòng xoay nhỏ được áp dụng cho hình ảnh, bạn có thể có một số đường màu đen trên đường viền (nhưng những đường này có thể được làm trong suốt sau đó).

Vì bạn có một số tifhình ảnh, bạn có thể sử dụng tập lệnh như thế này mà không thay đổi bất kỳ tệp hiện có nào và đặt các tệp được tạo vào một thư mục có tên 3857:

#!/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

Nếu bạn cũng muốn tạo các .twftệp, tôi đã thêm listgeo.

Kịch bản này dành cho Linux, nhưng bạn có thể viết một cái gì đó tương tự cho Windows.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.