2012-10-31 48 views
6

Tôi phải sử dụng gdal trong một dự án C#. Điều tôi phải làm là "chuyển đổi" một bitmap đơn giản thành một GeoTiff. Tôi đọc một số tài liệu trên trang web gdal nhưng tôi đã không thành công để làm cho nó hoạt động hoàn hảo. Trong thực tế bitmap của tôi là successfuly xuất khẩu sang một GeoTIFF, nhưng nếu tôi mở GeoTiff với một phần mềm GIS (ví dụ QuantumGIS) các GeoTiff được đảo ngược trên trục y:Tạo một geotiff từ một bitmap hiện có trong C# với gdal

enter image description here:

Trong khi bitmap gốc giống như thế này:

enter image description here

đây là những gì tôi đã thực hiện:

Trước tiên tôi viết một tập tin tạm thời vào đĩa (có nghĩa là bitmap), tôi tạo ra một tập dữ liệu chứa bitmap nhờ hàm gdal (Gdal.Open (đường dẫn)), và tôi tạo tập dữ liệu mới (với trình điều khiển GTiff) bằng cách sử dụng tập dữ liệu bitmap, tôi đặt chuyển đổi địa lý và tôi viết geotiff vào đĩa:

String wktProj = null; 
    String tmpPath = @"C:\tmp.bmp"; 
    Bitmap tmpBitmap = bmp.Clone(new Rectangle(0, 0, bmp.Width, bmp.Height), pixFormat); 
    tmpBitmap.Save(tmpPath, ImageFormat.Bmp); 

    String[] options = null; 
    Gdal.AllRegister(); 
    OSGeo.GDAL.Driver srcDrv = Gdal.GetDriverByName("GTiff"); 
    Dataset srcDs = Gdal.Open(tmpPath, Access.GA_ReadOnly); 
    Dataset dstDs = srcDrv.CreateCopy(path, srcDs, 0, options, null, null); 

    //Set the map projection 
    Osr.GetWellKnownGeogCSAsWKT("WGS84", out wktProj); 
    dstDs.SetProjection(wktProj); 

    //Set the map georeferencing 
    double mapWidth = Math.Abs(latLongMap.listBounds.topRight.x - latLongMap.listBounds.bottomLeft.x); 
    double mapHeight = Math.Abs(latLongMap.listBounds.topRight.y - latLongMap.listBounds.bottomLeft.y); 
    double[] geoTransfo = new double[] { -5.14, mapWidth/bmp.Width, 0, 48.75, 0, mapHeight/bmp.Height }; 
    dstDs.SetGeoTransform(geoTransfo); 

    dstDs.FlushCache(); 
    dstDs.Dispose(); 
    srcDs.Dispose(); 
    srcDrv.Dispose(); 
    tmpBitmap.Dispose(); 

    File.Delete(tmpPath); 

Bất kỳ ý tưởng nào về những gì tôi đang làm sai?

Chỉnh sửa Tôi không biết điều đó có quan trọng hay không nhưng bitmap pixel là 8bppIndexed.

+0

Bạn đã sử dụng lớp học nào cho latLongMap? Cảm ơn. –

Trả lời

5

Để giải quyết vấn đề tôi thay thế dòng này:

double[] geoTransfo = new double[] { -5.14, mapWidth/bmp.Width, 0, 48.75, 0, mapHeight/bmp.Height }; 

Bằng cách này:

double[] geoTransfo = new double[] { -5.14, mapWidth/bmp.Width, 0, 48.75, 0, (mapHeight/bmp.Height)*(-1) }; 

Có vẻ kích thước pixel (chiều cao) phải là tiêu cực.

+2

Có lẽ khá rõ ràng bây giờ, nhưng tọa độ hình ảnh bắt đầu từ trên cùng bên trái (tăng giá trị y cho biết hàng tiếp theo của dữ liệu pixel), trong khi ảnh địa lý bắt đầu ở dưới cùng bên trái. –

+0

@ErikVullings Bạn hoàn toàn đúng. Tôi quên cập nhật câu trả lời của mình với thông tin này. Cảm ơn bạn đã chỉ ra điều đó;) – Ashbay