2017-11-26 20 views
1

GEOTIFF FAA 단면 차트에서 위도 및 경도 위치를 픽셀 위치 (x, y)로 변환하려고합니다. 참고로, 내가 일하고있는 시애틀 섹션 파일을위한 GDALInfo 출력물이 있습니다.GDAL을 사용하여 FAA 단면의 픽셀 위치 찾기

Driver: GTiff/GeoTIFF 
    Files: d:\programming\gps\Seattle SEC 94.tif 
    Size is 17869, 12333 
    Coordinate System is: 
    PROJCS["Lambert Conformal Conic", 
     GEOGCS["NAD83", 
      DATUM["North_American_Datum_1983", 
       SPHEROID["GRS 1980",6378137,298.2572221010042, 
        AUTHORITY["EPSG","7019"]], 
       AUTHORITY["EPSG","6269"]], 
      PRIMEM["Greenwich",0], 
      UNIT["degree",0.0174532925199433], 
      AUTHORITY["EPSG","4269"]], 
     PROJECTION["Lambert_Conformal_Conic_2SP"], 
     PARAMETER["standard_parallel_1",46.66666666666666], 
     PARAMETER["standard_parallel_2",41.33333333333334], 
     PARAMETER["latitude_of_origin",46.75], 
     PARAMETER["central_meridian",-121], 
     PARAMETER["false_easting",0], 
     PARAMETER["false_northing",0], 
     UNIT["metre",1, 
      AUTHORITY["EPSG","9001"]]] 
    Origin = (-409375.329186913440000,261032.079643933710000) 
    Pixel Size = (42.334884781508684,-42.335597515618694) 
    Image Structure Metadata: 
     COMPRESSION=LZW 
    INTERLEAVE=BAND 
    Corner Coordinates: 
    Upper Left (-409375.329, 261032.080) (126d34'48.90"W, 48d58'12.69"N) 
    Lower Left (-409375.329, -261092.845) (126d 8'14.67"W, 44d17' 3.85"N) 
    Upper Right ( 347106.727, 261032.080) (116d15'59.44"W, 49d 0'18.33"N) 
    Lower Right ( 347106.727, -261092.845) (116d38'32.78"W, 44d19' 0.07"N) 
    Center  ( -31134.301,  -30.382) (121d24'26.75"W, 46d44'56.53"N) 

다음과 같은 탐색 코드 (C++)를 아래에 작성했습니다. 위도와 경도의 변형을 수행하면 결과 픽셀 위치가 예상 한 것과 다릅니다. 예를 들어, 중심 경도 및 위도 위치를 x, y 픽셀 위치로 변환하려고 할 때.

long = 121.407431 and latitude = 46.749036 This is the center point from the GDALInfo output converted to decimal form. 

내가 얻을 :

(Approx.) x = 8935 and y = 6167 

은 분명히 내가 잘못 내 변환을 설정 또는 추가 번역 및/또는 스케일링이 필요했다 : 나는 예상대로
x = -6234845.2270864788 and y = 5392747.8923152313 

. 다음은 C++의 탐색 코드입니다. 이 코드는 스택 오버플로와 비슷한 질문에서 파생되었지만 예상 한 결과가 아닙니다. 제공 할 수있는 도움을 주시면 감사하겠습니다.

GDALAllRegister(); 

    GDALDataset* poDataset = (GDALDataset *)GDALOpen("D:\\programming\\gps\\Seattle SEC 94.tif", GA_ReadOnly); 
    const char * szProjection = poDataset->GetProjectionRef(); 
    OGRSpatialReference dst(szProjection); 
    OGRSpatialReference src; 
    src.SetWellKnownGeogCS("WGS84"); 

    OGRErr error = dst.Validate(); 
    error = src.Validate(); 

    OGRCoordinateTransformation* pTransform = OGRCreateCoordinateTransformation(&src, &dst); 

    // Center point of map in lattitude and longitude 
    double lng = 121.407431; 
    double lat = 46.749036; 

    double x = lng; 
    double y = lat; 

    pTransform->Transform(1, &x, &y); 

예상치 못한 x 및 x 값.
실제 : X = -6234845.2270864788와 y = 5392747.8923152313
예상 : (. 약) X = 8935와 y = A 마지막 단계가 필요하다 6167

답변

2

을, 당신은 픽셀로 이미지 정보 변환에서 변환 할 수 있습니다

double georef[6]; 
poDataset->GetGeoTransform(georef); 

int pixelX = int((x - georef[0])/georef[1]); 
int pixelY = int((y - georef[3])/georef[5]); 
+1

감사합니다. Sga! 그 고정 된 것들을 멋지게. 나는 사소한 다른 하나의 변화를 만들어야 만했다. 나는 경도를 음수 (-121.407431)로 표현해야했다. 이유는 아직 모르지만 모든 것이 지금 작동 중입니다. 나는 행복하다. 도움을 주셔서 감사합니다. – Olan

+1

GDAL은 반구 (이 경우 'W'), '121d24'26.75'W'를 포함하는 형식으로 출력합니다. 10 진수 형식으로 변환하면 서반구의 좌표는 음수입니다 (그렇지 않으면 문자 그대로 중국에서 끝납니다). –