2012-01-13 13 views
5

Tôi đang sử dụng thư viện GDAL. Hiện tại, tôi có thể chụp ở góc trên bên trái và một điểm trên bên phải và cắt một hình ảnh ra khỏi ảnh gốc. Những gì tôi muốn làm bây giờ, được lấy trong hai điểm WKT và chuyển đổi sang X, Y phối hợp để làm điều tương tự. Tôi đã chỉ tự hỏi nếu nó đã có thể làm điều này nếu tôi biết GeoTransform và những gì phối hợp hệ thống nó đã được sử dụng (WGS84)?Nếu bạn có một GeoTiff, nó sẽ có thể biến đổi một điểm Lat/Lon thành X, Y bằng cách sử dụng GeoTransform?

+0

biết thêm thông tin: Tôi hiện có thể chuyển đổi X, Y thành Lat/Lon bằng GeoTransform. – avtoader

Trả lời

0

Tôi đã sử dụng biến đổi affine cho hình ảnh để tính toán một số vĩ độ/kinh độ mẫu. Vấn đề duy nhất tôi gặp phải là nếu hình ảnh là Mặt trận hướng Bắc, geoTransform [2] và geTransform [4] cần phải được đánh số ra khi tính toán độ lớn/vĩ độ.

x = (int)Math.Abs(Math.Round((Latitude - geotransform[0])/geotransform[1]));
y = (int)Math.Abs(Math.Round((Longitude - geotransform[3])/geotransform[5]));

Nếu bạn muốn sức mạnh vũ phu nó, bạn có thể làm như sau (tôi đã làm điều này và nó làm việc nhưng điều này chỉ là giả):

//Get the Pixel for the length and width, this portion is for the full image
pixelXSize = AbsoluteValue((latitudeAt(Zero)-(latitudeAt(Length)-1))/imageLength);
pixelYSize = AbsoluteValue((longitudeAt(Zero)-(LongitudeAt(Width)-1))/imageWidth);

//Calculate the x,y conversion for the points you want to calculate
x = AbsoluteValue((latitudeToConvert-latitudeAt(Zero))/pixelXSize);
y = AbsoluteValue((longitudeToConvert-longitudteAt(Zero))/pixelYSize);

Câu trả lời này có thể được tắt bằng một hoặc hai pixel. Nếu bạn đang sử dụng một biến đổi địa lý, một lần nữa các biến North Facing có thể làm hỏng câu trả lời được trả về. Cho đến nay, tôi đã chỉ thử nghiệm này cho hình ảnh phía bắc phải đối mặt.

+1

Tôi đoán câu hỏi của tôi ở đây sẽ là cách xử lý hình ảnh không phải hướng bắc. – avtoader

4

Tôi đã từng tham gia điều này trước đây và đây là cách thực hiện các phép biến đổi tọa độ hợp lý.

Lưu ý từ GDAL documentation:

Các hệ tọa độ được trả về bởi GDALDataset :: GetProjectionRef() mô tả tọa độ tham chiếu hình học ngụ ý bởi affine tham chiếu địa lý biến đổi được trả về bởi GDALDataset :: GetGeoTransform().

Chúng tôi có thể sử dụng điều này với OGRCoordinateTransformation để thực hiện chuyển đổi cho chúng tôi.

Về cơ bản mã sẽ giống như thế này:

// Load up some dataset. 
dataset = (GDALDataset *) GDALOpen(mapfile, GA_ReadOnly); 

// Define Geographic coordinate system - set it to WGS84. 
OGRSpatialReference *poSRS_Geog = new OGRSpatialReference(); 
poSRS_Geog->importFromEPSG(4326); // WGS84 

// Define Projected coordinate system - set to the GeoTransform. 
const char *sProj = dataset->GetProjectionRef(); 
OGRSpatialReference *poSRS_Proj = new OGRSpatialReference(sProj); 

// Set up the coordinate transform (geographic-to-projected). 
OGRCoordinateTransformation *poCT_Geog2Proj; 
poCT_Geog2Proj = OGRCreateCoordinateTransformation(poSRS_Geog, poSRS_Proj); 

// Now everything is set up and we set transforming coordinates! 
// Pass Lon/Lat coordinates to the Transform function: 
double x = lon; 
double y = lat; 
poCT_Geog2Proj->Transform(1, &x, &y); 

// Now x and y variables will contain the X/Y pixel coordinates. 

Đó là cách bạn có thể chuyển đổi giữa kinh độ/vĩ độ và điểm ảnh tọa độ. Lưu ý bạn có thể sử dụng mảng với Transform() và chuyển đổi nhiều tọa độ cùng nhau. Đối số đầu tiên là số cặp tọa độ cần chuyển đổi, và đối số thứ hai và thứ ba là con trỏ trỏ tới x và y. Tôi chỉ biến đổi một cặp ở đây.

Lưu ý nó không kém phần dễ dàng để thiết lập nghịch đảo:

// Set up the coordinate transform (projected-to-geographic). 
OGRCoordinateTransformation *poCT_Proj2Geog; 
poCT_Proj2Geog = OGRCreateCoordinateTransformation(poSRS_Proj, poSRS_Geog); 
0

tôi sử dụng phương pháp này:

void transformCoordinatesEPSG(OGRGeometry &geometry,int from, int to) { 
    OGRSpatialReference srcSpatialReference; 
    OGRErr error = srcSpatialReference.importFromEPSG(from); 

    #ifdef __OGRTRANSFORMDEBUG 
     qDebug() << "Import EPSG " << from << "return " << error; 
    #endif 

    OGRSpatialReference dstSpatialReference; 
    error = error | dstSpatialReference.importFromEPSG(to); 

    #ifdef __OGRTRANSFORMDEBUG 
    qDebug() << "Import EPSG " << to << "return " << error; 
    #endif 

    OGRCoordinateTransformation* coordTrans = OGRCreateCoordinateTransformation(&srcSpatialReference, &dstSpatialReference); 
    geometry.transform(coordTrans); 
} 

Đối lat/dài để phải 4326.

Các vấn đề liên quan