2012-01-13 8 views
5

GDAL 라이브러리를 사용하고 있습니다. 현재, 왼쪽 상단 점과 오른쪽 상단 점을 가져 와서 원본 이미지를 칩에 넣을 수 있습니다. 제가 지금하고 싶은 것은 두 개의 WKT 포인트를 가져 와서 같은 것을하기 위해 X, Y 좌표로 변환하는 것입니다. 내가 GeoTransform을 알고 있고 그것을 사용하고있는 좌표계 (WGS84)가 있다면 이것을 수행 할 수 있는지 궁금합니다.GeoTiff가있는 경우 GeoTransform을 사용하여 위도/경도를 X, Y로 변환 할 수 있습니까?

+0

추가 정보해야 롱/위도를 들어

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 현재 GeoTransform을 사용하여 X, Y를 위도/경도로 변환 할 수 있습니다. – avtoader

답변

0

일부 샘플 위도/경도를 계산하기 위해 이미지에 대해 아핀 변환을 사용했습니다. 이미지가 North Facing 인 경우 geoTransform [2] 및 geTransform [4]가 위도/경도를 계산할 때 제로화되어야합니다.

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

당신이 그것을 무력하고 싶었다면, 다음을 할 수있는 (내가 이런 짓을하며 일을하지만 이것은 단지 의사입니다) :

//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);

이 답변 한으로 해제 할 수있다 또는 두 픽셀. geotransform을 사용하는 경우 North Facing 변수가 반환되는 답변을 엉망으로 만들 수 있습니다. 지금까지는 북쪽을 향한 이미지 만 테스트했습니다.

+1

여기 내 질문은 북쪽을 향하지 않는 이미지를 다루는 방법 일 것이라고 생각합니다. – avtoader

4

나는 이것도 전에 만났고 여기서는 좌표 변환을 수행 할 수있는 좋은 방법이 있습니다. GDAL documentation에서

참고 GDALDataset :: GetProjectionRef() 아핀 지리 참조하여 암시 지리 좌표 GDALDataset :: GetGeoTransform()에 의해 리턴 변환 기술에 의해 반환

좌표계.

OGRCoordinateTransformation과 함께 사용하면 변환 작업을 수행 할 수 있습니다.

는 기본적으로 코드는 다음과 같이 표시됩니다

당신은 위도/경도 및 픽셀 좌표 사이의 변환을 수있는 방법
// 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. 

. 배열을 Transform()과 함께 사용하고 여러 좌표를 함께 변환 할 수 있습니다. 첫 번째 인수는 변환 할 좌표 쌍의 수이고 두 번째 및 세 번째 인수는 x 및 y에 대한 포인터입니다. 나는 여기서 한쌍을 변형시킨다.

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

을 나는이 방법을 사용합니다 : 4326