如何将仿射坐标转换为经/纬度?


14

我对GIS非常陌生。

我正在gdal阅读土地利用/土地覆盖图,我需要选择某些土地覆盖类型的经/纬度以索引到仅以经/纬度表示的不同数据集。不幸的是,我不了解从geotransform给我的x和y坐标的形式,特别是originXand originY以下:

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

打印这些值会给我类似的坐标(447466.693808, 4952570.40529)。这些与原始纬度和经度有何关系?

编辑:

这是一个简单的python示例,为我提供了我想要的东西:

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

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

从以下地方窃取tolatlong.py


看来您的数据已经投影(例如UTM),并且您将需要知道投影的内容才能“取消投影”到长/纬度坐标。

@Dan谢谢,所以我知道我可以通过获取投影dataset.GetProjectionRef()并发现我正在使用“ UTM Zone 10”,但是那又是什么呢?我正在四处寻找“ unproject”之类的方法,但结果为null。
Rich

很抱歉使用术语unproject(用引号引起来),因为没有投影十进制度的数据,但是如果您想将投影数据从任何给定的投影返回到十进制度,则必须(请注意用引号)“ project”它返回到地理坐标系,也就是十进制度数据。

2
这个(较新的)线程提供了一个明确的示例和另一个解决方案:gis.stackexchange.com/questions/8430/…–
whuber

Answers:


10

gdal_translate会将您的数据从任何投影重新投影到任何其他投影(在这种情况下,您需要EPSG:4326),方法是:

gdal_translate -a_srs epsg:4326 srcfile new_file 

或者,您也可以使用gdaltrasform转换点(我确定您也可以从Python(?)访问该点)


(+1)我不知道为什么要拒​​绝投票,伊恩(Ian),因为对我来说,它看起来像是某种操作,就像在应用仿射变换后将需要它一样。
whuber

gdal_translate无法按照您的方式工作(或者只是将EPSG:4326分配给数据),您需要使用以下方式扭曲数据:gdalwarp -s_srs EPSG:32610 -t_srs EPSG:4326 src dest如果数据已经具有项目元数据,您可以放弃-s_srs参数。
MerseyViking 2011年

也许这就是我的追求。“ epsg:4326”是对全球经纬度的转换吗?我想我看到了一些可以提供投影的类,当时我在想“ WGS:84”,但我不知道它们之间的区别。
Rich

1
@Rich单击问题中的“坐标系”标记,按投票对结果页面进行排序,然后开始阅读。您的许多问题都将在几分钟之内得到解答。
whuber

7

地理转换记录在https://gdal.org/user/raster_data_model.html。这个想法是,您直接从数据集中获取(x,y)坐标,应用线性变换来获得(u,v)

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

(您可以将其作为线性变换的定义),然后通过在u上添加geotransform [0]和在v上添加geotransform [3]来移动原点。这给出了(x,y)的“仿射变换”。它的真正目的是旋转,更改比例,也许针对一些偏斜误差进行一些校正,然后重新放置数据专用坐标(x,y)以匹配已知的坐标系。结果应该产生投影坐标。 这仅表示存在一种数学程序(经度,纬度)并将其转换为已知坐标:这称为“投影”。“未投射”则相反。因此,如果您知道需要哪种投影,可以将其应用于仿射变换的(x,y)坐标 得到经度和纬度。

顺便说一下,常数a,b,c,d的值由geotransform数组中的1、2、4和5项给出。


1
我阅读了您提供的链接的geotransform部分,但我认为这不是我想要的。抱歉,如果我很钝,但这不是说明如何将x和y索引(0到XSize或YSize)投影到投影坐标上吗?我很好奇您如何将投影坐标转换​​为纬度和经度。作为一个简单的示例,地理变换在投影坐标中定义了栅格左上角的x / y原点(447466.693808,4952570.40529)。我如何将这些坐标转换回lat / lng(类似于lat:44,lng:-122)。
Rich

@Rich不,该链接未描述投影。它仅描述了两个地图之间的坐标变化,而不是世界和地图之间的坐标变化。非投影将坐标的仿射变换变成(lat,lon)。你想要写的代码,如果你能帮助它!取消投影几乎总是要确定需要什么投影并调用合适的软件来为您完成工作(如@iant的回复中所建议)。
whuber

链接断开。@whuber,对吗?仿射变换(来自GDAL的GetGeoTransform)是像素和CRS坐标之间的变换吗?因此,例如,如果数据在GDA投影中,则需要使用CoordianteTransform将点从WGS84 / lat / lon转换为GDAXX,然后使用仿射GeoTransform转换为像素?这个分为两个步骤的过程使我非常烦恼,我怀疑这也会引起OP麻烦。并没有帮助xarray / rasterio似乎存在一个错误,它会破坏
GeoTransform的

@naught我找到了新的URL并更新了我的帖子。
ub

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,它不应该是indixes [1] * padfTransform [1] + indexs [0] * padfTransform [2]吗?
CMCDragonkai
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.