아핀 좌표를 위도 / 경도로 변환하려면 어떻게해야합니까?


14

저는 GIS를 처음 접했습니다.

나는 gdal토지 사용 / 토지 표지 맵을 읽는 데 사용 하고 있으며 특정 토지 표지 유형의 위도 / 경도를 선택하여 다른 데이터 세트로 색인화하여 위도 / 경도로만 표현해야합니다. 불행히도, 나는 지형 변환에서 나에게 주어진 x 및 y 좌표의 형태, 특히 originXoriginY아래를 이해하지 못합니다 .

geotransform = dataset.GetGeoTransform()
originX = geotransform[0]
originY = geotransform[3]

이 값을 인쇄하면과 같은 좌표가 표시 (447466.693808, 4952570.40529)됩니다. 이것들은 원래 위도와 경도와 어떤 관련이 있습니까?

편집하다:

여기 내가 찾던 것을 얻은 간단한 파이썬 예제가 있습니다.

srs = osr.SpatialReference()
srs.ImportFromWkt(dataset.GetProjection())

srsLatLong = srs.CloneGeogCS()
ct = osr.CoordinateTransformation(srs,srsLatLong)
print ct.TransformPoint(originX,originY)

도난 : tolatlong.py


데이터가 투영 된 것처럼 보이며 (예 : UTM) 투영을 길고 / 위도 좌표로 "투영"하려면 투영이 무엇인지 알아야합니다.

@ Dan 감사합니다. 그래서 a를 통해 프로젝션을 얻을 수 있고 dataset.GetProjectionRef()"UTM Zone 10"을 사용하고 있음을 알았습니다. "unproject"와 같은 메소드를 찾고 있지만 null이됩니다.
Rich

십진 도수의 데이터는 투영되지 않기 때문에 unproject (따옴표로 표시)라는 용어를 사용하여 죄송합니다. 그러나 특정 투영에서 투사 된 데이터를 십진 도로 되돌리려면 "따옴표"를 사용해야합니다. 그것은 십진도 데이터라고 불리는 지리 좌표계로 돌아갑니다.

2
이 (새로운) 스레드는 명시적인 예제와 다른 솔루션을 제공합니다. gis.stackexchange.com/questions/8430/…
whuber

답변:


10

gdal_translate 는 다음을 사용하여 데이터가 다른 투영 (이 경우 EPSG : 4326)에 관계없이 데이터를 다시 투영합니다.

gdal_translate -a_srs epsg:4326 srcfile new_file 

또는 gdaltrasform 을 사용 하여 점을 변환 할 수 있습니다 (그리고 파이썬에서도 액세스 할 수 있다고 확신합니까?)


(+1) 왜 이것이 다운 피트 (downvoted)되었는지는 모르겠습니다.
whuber

gdal_translate는 당신이 가진 방식으로 작동하지 않습니다 (또는 단순히 EPSG : 4326을 데이터에 할당 할 것입니다) .gdalwarp -s_srs EPSG : 32610 -t_srs EPSG : 4326 src dest 데이터에 proj 메타 데이터가 이미 있으면 -s_srs 매개 변수를 버릴 수 있습니다.
MerseyViking

어쩌면 이것이 내가 따르는 것입니다. "epsg : 4326"이 전역 위도 / 경도로 변환됩니까? 프로젝션을 제공 할 수있는 클래스가 있다고 생각합니다. "WGS : 84"를 생각하고 있었지만 그 차이를 모릅니다.
Rich

1
@Rich 질문 에있는 "coordinate-system"태그 를 클릭하고 결과 페이지를 투표별로 정렬 한 다음 읽기를 시작하십시오. 몇 분 안에 많은 질문에 대답 할 것입니다.
whuber

7

지리 변환은 https://gdal.org/user/raster_data_model.html에 문서화되어 있습니다 . 아이디어는 데이터 세트에서 (x, y) 좌표를 직선으로 가져 와서 선형 변환을 적용하여 (u, v)를 얻는 것입니다.

u = a*x + b*y
v = c*x + d*y

( 이를 선형 변환 의 정의 로 사용할 수 있습니다 ) 그런 다음 geotransform [0]을 u에 추가하고 geotransform [3]을 v에 추가하여 원점을 이동하십시오. 그러면 (x, y)의 "병렬 변환"이 제공됩니다. 실제로 회전, 스케일 변경, 약간의 오차에 대해 약간 수정하고 알려진 좌표계와 일치하도록 데이터 특정 좌표 (x, y)를 다시 배치하려고합니다. 결과적으로 투영 된 좌표 가 생성 됩니다. 이것은 단순히 수학적 절차 (경도, 위도)를 알려진 좌표로 바꾸는 것을 의미합니다. 이것을 "투영"이라고합니다. "투영"은 그 반대입니다. 따라서 어떤 투영이 필요한지 아는 경우 아핀 변환 된 (x, y) 좌표에 적용합니다 위도와 경도를 얻을 수 있습니다.

그런데 상수 a, b, c, d의 값은 지오 변환 배열의 1, 2, 4 및 5 항목으로 제공됩니다.


1
귀하가 제공 한 링크의 지리 변환 섹션을 읽었지만 이것이 내가 추구하는 것이라고 생각하지 않습니다. 내가 애매한 경우 죄송하지만 x 및 y 인덱스 (0-XSize 또는 YSize)를 투영 된 좌표에 투영하는 방법을 설명하지 않습니까? 투영 좌표를 위도와 경도로 어떻게 변환하는지 궁금합니다. 간단한 예로서 지리 변환은 투영 된 좌표 (447466.693808, 4952570.40529)로 래스터 왼쪽 상단의 x / y 원점을 정의합니다. 이 좌표를 lat / lng (lat : 44, lng : -122와 같은)로 다시 되돌리려면 어떻게해야합니까?
Rich

@Rich 아니요. 해당 링크는 투영을 설명하지 않습니다. 세계와지도가 아닌 두지도 간의 좌표 변경 만 설명합니다. 비 투영 은 좌표의 아핀 변환을 (lat, lon)으로 바꿉니다. 당신은 할 수 없습니다 당신이 그것을 도울 수 있다면 그에 대한 코드를 쓰고 싶어요! 프로젝션 해제는 거의 항상 프로젝션이 필요한지 식별하고 작업을 수행 할 올바른 소프트웨어를 호출하는 것입니다 (@iant의 답변에서 제안 된대로).
whuber

링크가 끊어졌습니다. @ whuber GDAL의 GetGeoTransform에서 얻은 아핀 변환이 픽셀과 CRS 좌표 간의 변환이라는 것이 맞습니까? 예를 들어 데이터가 GDA 프로젝션에있는 경우 점은 CoordianteTransform을 사용하여 WGS84 / lat / lon에서 GDAXX로 변환 한 다음 아핀 GeoTransform을 사용하여 픽셀로 변환해야합니까? 이 2 단계 프로세스는 상당히 많은 문제를 일으켰으며 OP 문제를 일으키는 것으로 의심됩니다. xarray / rasterio가 GeoTransform 값을 고정시키는 버그가있는 것으로 보지 못했습니다 : github.com/pydata/xarray/issues/3185
naught101

@naught 새 URL을 발견하고 내 게시물을 업데이트했습니다.
whuber

0

다음을 사용할 수 있습니다.

import gdal, numpy as n
def coord(file):
    padfTransform = file.GetGeoTransform()
    indices = n.indices(file.ReadAsArray().shape)
    xp = padfTransform[0] + indices[1]*padfTransform[1] + indices[1]*padfTransform[2]   
    yp = padfTransform[3] + indices[0]*padfTransform[4] + indices[0]*padfTransform[5]  
    return xp,yp
file = gdal.Open('Yourfile.tif') # A GeoTiff file
x,y = coord(file)

coord는 모든 픽셀의 경도 (x)와 위도 (y)를 반환합니다. 좌표는 픽셀의 왼쪽 모서리에 있습니다.


yp에 대해 색인 [1] * padfTransform [1] + 색인 [0] * padfTransform [2]이 아니어야합니까?
CMCDragonkai
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.