2012-01-13 22 views
5

私はGDALライブラリを使用しています。現在、左上の点と右上の点を取り、元の画像から切り抜くことができます。私が今したいことは、2つの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); } 

を:私、それは逆変換を設定することも同様に簡単です

注意GeoTransformを使用してX、YをLat/Lonに変換することができます。 – avtoader

答えて

0

画像のアフィン変換を使用して、いくつかのサンプルの緯度/経度を計算しました。私が持っていた唯一の問題は、画像がNorth Facingの場合、geoTransform [2]とgeTransform [4]をLat/Lonを計算するときにゼロにする必要があることでした。

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

この回答は1でオフにすることもまたは2つのピクセル。ジオトランスフォームを使用している場合は、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()で配列を使用し、複数の座標を一緒に変換することができます。最初の引数は変換する座標対の数であり、2番目と3番目の引数はxとyのポインタです。私はちょうどここで一つのペアを変換します。

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

私は、このメソッドを使用します:4326

関連する問題