python - GeoTIFF 元数据文件中的纬度/经度(公里)与计算的距离不匹配

标签 python geolocation tiff gdal geotiff

我正在使用基于 THISgdalinfo 从 GeoTIFF 文件中提取信息,并得到以下信息:

Driver: GTiff/GeoTIFF
Files: myfile.tif
       myfile.tif.aux.xml
Size is 953, 2824
Coordinate System is:
PROJCS["Lambert_Conformal_Conic_2SP_World_Geodetic_System_1984",
    GEOGCS["GCS_World_Geodetic_System_1984",
        DATUM["D_World_Geodetic_System_1984",
            SPHEROID["WGS_1984",6378137,298.257223563,
                AUTHORITY["EPSG","7030"]]],
        PRIMEM["Greenwich",0],
        UNIT["degree",0.0174532925199433]],
    PROJECTION["Lambert_Conformal_Conic_2SP"],
    PARAMETER["standard_parallel_1",66],
    PARAMETER["standard_parallel_2",78],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",-42],
    PARAMETER["false_easting",0],
    PARAMETER["false_northing",0],
    UNIT["metre",1,
        AUTHORITY["EPSG","9001"]]]
Origin = (-432678.541899999952875,9726108.134099999442697)
Pixel Size = (300.000000000000000,-300.000000000000000)
Metadata:
  AREA_OR_POINT=Area
Image Structure Metadata:
  INTERLEAVE=BAND
Corner Coordinates:
Upper Left  ( -432678.542, 9726108.134) ( 53d58'12.29"W, 70d52'36.63"N)
Lower Left  ( -432678.542, 8878908.134) ( 50d38' 9.28"W, 63d22'47.25"N)
Upper Right ( -146778.542, 9726108.134) ( 46d 6'31.44"W, 71d13'15.48"N)
Lower Right ( -146778.542, 8878908.134) ( 44d56'51.10"W, 63d37'31.84"N)
Center      ( -289728.542, 9302508.134) ( 48d45'16.75"W, 67d18'24.75"N)
Band 1 Block=128x128 Type=Float32, ColorInterp=Gray
  Min=0.900 Max=1.100 
  Minimum=0.900, Maximum=1.100, Mean=0.993, StdDev=0.025
  NoData Value=-3.4028234663852886e+38
  Metadata:
    RepresentationType=ATHEMATIC
    STATISTICS_MAXIMUM=1.1000000238419
    STATISTICS_MEAN=0.99293445610505
    STATISTICS_MINIMUM=0.89999997615814
    STATISTICS_SKIPFACTORX=1
    STATISTICS_SKIPFACTORY=1
    STATISTICS_STDDEV=0.025099979310242

我正在尝试根据纬度/经度引用重现 4 个角的公里距离。我可以获得经度,但不知怎的,我的纬度相差很远......这是我的做法:

import geopy
from geopy import distance
from geopy.location import Point
p1 = Point('''70 52'36.63" N 53 58'12.29" W''')
p2 = Point('''0 N 53 58'12.29" W''') #Same longitude, but latitude set to 0
distance.distance(p1,p2).m # WGS84 distance in m  

基于gdalinfo输出,我希望返回9726108.134,但是,我得到了7866807.760742959。我认为这偏差太大了,不可能是一个预测错误。关于我做错了什么还有其他建议吗?

请注意,当我在 THIS EXAMPLE 中复制 km 时,我可以使用我的方法正确获取以 km 为单位的纬度...

最佳答案

您的距离检查做了两个假设:

  1. 重投影中 0° N、0° E 点也在 0, 0 处。
  2. x 轴和 y 轴在两个投影中具有相同的对齐方式

但是,这两种说法都不成立。这是一个图来说明两个投影之间的差异:

enter image description here

左图显示了在 GeoTiff 中描绘为 WGS84 中的绿色多边形的区域,右图显示了重投影中的相同内容。正如您所看到的,点 0° N、0° E 现在位于 7633606.089886177、2779916.995372205(而在 WGS84 中,重新投影的点 0、0 将位于 0° N、-42° E)。此外,在 WGS84 中,右侧形成完美矩形的图像区域发生了扭曲。

长话短说:由于预测固有的差异,您执行的检查不会得出您的预期结果。作为近似值,您可以使用四个角的坐标进行检查,结果将(大致)正确。下面是使用左上角和左下角的示例:

p1 = geopy_Point('''70 52'36.63" N 53 58'12.29" W''')
p2 = geopy_Point('''63 22'47.25" N 50 38' 9.28" W''')

distance.distance(p1,p2).m

返回结果:

848195.724897564

这非常接近预期距离 (9726108.134 - 8878908.134 = 847200),并且由于给定 WGS84 坐标的舍入而略有偏差。

希望这有帮助!

编辑:

以下是如何从 WGS84 转换为重投影的建议:

import osr
from pyproj import Proj, transform

def reproject(x_in, y_in):
    proj_in = Proj(init='epsg:4326')
    osr_spat_ref = osr.SpatialReference()
    osr_spat_ref.ImportFromWkt('''PROJCS["Lambert_Conformal_Conic_2SP_World_Geodetic_System_1984",
    GEOGCS["GCS_World_Geodetic_System_1984",
        DATUM["D_World_Geodetic_System_1984",
            SPHEROID["WGS_1984",6378137,298.257223563,
                AUTHORITY["EPSG","7030"]]],
        PRIMEM["Greenwich",0],
        UNIT["degree",0.0174532925199433]],
    PROJECTION["Lambert_Conformal_Conic_2SP"],
    PARAMETER["standard_parallel_1",66],
    PARAMETER["standard_parallel_2",78],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",-42],
    PARAMETER["false_easting",0],
    PARAMETER["false_northing",0],
    UNIT["metre",1,
        AUTHORITY["EPSG","9001"]]]''')
    spat_ref_pyproj = osr_spat_ref.ExportToProj4()
    proj_out = Proj(spat_ref_pyproj)
    out = transform(proj_in, proj_out, x_in, y_in)
    return out

只需分别输入经度和纬度坐标x_iny_in即可获得重投影坐标。然后,您可以通过扣除角点的坐标来找出您感兴趣的图像的哪个图 block 。

关于python - GeoTIFF 元数据文件中的纬度/经度(公里)与计算的距离不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58703796/

相关文章:

javascript - Python2.7 : get html of website, href 变为 "javascript:void(0)"

c# geocoordinate watcher 不返回正确的坐标

python - 如何使用 Python 以编程方式从许多单页 TIFF 中构建多页 TIFF?

c# - Bitmap.Save 参数无效

python - Cron 作业无法运行

python - scipy.optimize linprog 不会返回我期望的最小解决方案

对 error() 的 Python C API 调用绑定(bind)到 libc 实现而不是本地实现

php - 在 Woocommerce 中添加除特定国家/地区以外的内联 CSS

jquery - 如何使用延迟对象通过 HTML5 Geolocation API 检索经度和纬度?

image-processing - 在 ImageJ 或等效文件中裁剪自定义形状(TIFF 视频文件)