当前位置: 首页 > 面试题库 >

从GeoTIFF文件中获取经度和纬度

邰英毅
2023-03-14
问题内容

在Python中使用GDAL,如何获取GeoTIFF文件的纬度和经度?

GeoTIFF似乎没有存储任何坐标信息。而是存储XY原点坐标。但是,XY坐标不提供左上角和左下角的纬度和经度。

看来我需要做一些数学运算才能解决这个问题,但是我不知道从哪里开始。

执行此操作需要什么程序?

我知道该GetGeoTransform()方法对此很重要,但是,我不知道该怎么做。


问题答案:

要获取您的Geotiff角的坐标,请执行以下操作:

from osgeo import gdal
ds = gdal.Open('path/to/file')
width = ds.RasterXSize
height = ds.RasterYSize
gt = ds.GetGeoTransform()
minx = gt[0]
miny = gt[3] + width*gt[4] + height*gt[5] 
maxx = gt[0] + width*gt[1] + height*gt[2]
maxy = gt[3]

但是,它们可能不是纬度/经度格式。正如Justin指出的那样,您的Geotiff将使用某种坐标系进行存储。如果您不知道它是什么坐标系,可以通过运行gdalinfo以下命令进行查找:

gdalinfo ~/somedir/somefile.tif

哪个输出:

Driver: GTiff/GeoTIFF
Size is 512, 512
Coordinate System is:
PROJCS["NAD27 / UTM zone 11N",
    GEOGCS["NAD27",
        DATUM["North_American_Datum_1927",
            SPHEROID["Clarke 1866",6378206.4,294.978698213901]],
        PRIMEM["Greenwich",0],
        UNIT["degree",0.0174532925199433]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",-117],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",0],
    UNIT["metre",1]]
Origin = (440720.000000,3751320.000000)
Pixel Size = (60.000000,-60.000000)
Corner Coordinates:
Upper Left  (  440720.000, 3751320.000) (117d38'28.21"W, 33d54'8.47"N)
Lower Left  (  440720.000, 3720600.000) (117d38'20.79"W, 33d37'31.04"N)
Upper Right (  471440.000, 3751320.000) (117d18'32.07"W, 33d54'13.08"N)
Lower Right (  471440.000, 3720600.000) (117d18'28.50"W, 33d37'35.61"N)
Center      (  456080.000, 3735960.000) (117d28'27.39"W, 33d45'52.46"N)
Band 1 Block=512x16 Type=Byte, ColorInterp=Gray

此输出可能就是您所需要的。但是,如果要在python中以编程方式执行此操作,则可以通过此方法获取相同的信息。

如果坐标系PROJCS类似于上面的示例,则说明您正在处理投影坐标系。投影的Coordiante系统是球形地球表面的表示,但被展平并扭曲到一个平面上。如果需要纬度和经度,则需要将坐标转换为所需的地理坐标系。

遗憾的是,并非所有的纬度/经度对都是基于地球的不同球体模型而创建的。在此示例中,我将转换为WGS84,这是GPS偏爱的地理坐标系,并且所有流行的Web制图站点都使用该地理坐标系。坐标系由定义明确的字符串定义。它们的目录可从空间参考中获得,例如参见WGS84。

from osgeo import osr, gdal

# get the existing coordinate system
ds = gdal.Open('path/to/file')
old_cs= osr.SpatialReference()
old_cs.ImportFromWkt(ds.GetProjectionRef())

# create the new coordinate system
wgs84_wkt = """
GEOGCS["WGS 84",
    DATUM["WGS_1984",
        SPHEROID["WGS 84",6378137,298.257223563,
            AUTHORITY["EPSG","7030"]],
        AUTHORITY["EPSG","6326"]],
    PRIMEM["Greenwich",0,
        AUTHORITY["EPSG","8901"]],
    UNIT["degree",0.01745329251994328,
        AUTHORITY["EPSG","9122"]],
    AUTHORITY["EPSG","4326"]]"""
new_cs = osr.SpatialReference()
new_cs .ImportFromWkt(wgs84_wkt)

# create a transform object to convert between coordinate systems
transform = osr.CoordinateTransformation(old_cs,new_cs)

#get the point to transform, pixel (0,0) in this case
width = ds.RasterXSize
height = ds.RasterYSize
gt = ds.GetGeoTransform()
minx = gt[0]
miny = gt[3] + width*gt[4] + height*gt[5]

#get the coordinates in lat long
latlong = transform.TransformPoint(minx,miny)

希望这会做您想要的。



 类似资料:
  • 我有一个onCreate的活动,它计算您的位置和附近的事件之间的距离,我使用lastNotnloceto获取当前设备位置并在谷歌地图上标记它,但我需要它来写经度和纬度它的方法之外用于计算距离。 我已经使用LocationManager来获取粗略的坐标,但这些坐标不够准确,对于距离不到半英里的东西来说,距离为50英里。我目前拥有它,因此将覆盖从LocationManager获得的经度和纬度,但它没有

  • 我想在不同的郊区使用下面的API和pss来获得郊区或地址的纬度和经度。 http://en.wikipedia.org/w/api.php?format=json 此外,郊区列表将约为16,000个,那么如何使用此API提取地理坐标?

  • 我试图从这个结果页面的“Show Map”按钮中刮出纬度和经度数据:https://www.psychologytoday.com/us/therapists/60148/374863?sid=5d01e84909804&ref=2&tr=resultsName:https://www.psychologytoday.com/us/therapists/60148/374863?sid=5d01e

  • 我有一个 netCDF 文件,我希望使用 R 中的“ncdf”包从由纬度/经度边界定义的子集(即经纬度/经度定义的框)中提取子集。 下面是我的netCDF文件的摘要。它有两个维度(纬度和经度)和一个变量(10U_GDS4_SFC)。它本质上是一个包含风值的平面/长网格: 纬度变量从 90 到 -90,经度变量从 0 到 360。 我希望使用以下地理角边界提取整个网格的子集: 左下角:纬度:34.5

  • 问题内容: 我在SQLite数据库中存储了经度和纬度数据,我想获取与所输入参数最接近的位置(例如,我当前的位置-纬度/经度等)。 我知道这在MySQL中是可能的,并且我已经做了大量的研究,认为SQLite需要Haversine公式的自定义外部函数(计算球体上的距离),但是我还没有发现任何用Java编写并且可以工作的东西。 另外,如果要添加自定义功能,则需要org.sqlite.jar(用于org.

  • 问题内容: 在我的一个php应用程序中,我必须从地址中找出该位置的纬度和经度。 我尝试了这段代码: 但是它显示以下错误: 警告:file_get_contents(http://maps.google.com/maps/api/geocode/json?address=technopark、Trivandrun,喀拉拉邦,印度&sensor = false&region = IND)[functi