使用Landsat和PostGIS按地理位置检索栅格数据

时间:2018-03-18 20:40:50

标签: postgis qgis epsg landsat

我正在处理的项目要求我在特定的地理(lon / lat)位置检索Landsat栅格数据。在筛选了一些教程并尝试使用GDAL,PostGIS和QGIS之后,我成功地将GeoTIFF Landsat图像导入到PostGIS栅格表中,并按该表中的地理位置访问了值。但是,结果中存在一些问题:

  • 我不了解QGIS在其界面中使用的坐标系,因为它们的范围在十万
  • 将光栅加载到西班牙海岸的QGIS中,而不是像美国本土那样在美国缅因州之上。

以下是有关我的流程的一些信息。我对GIS一般都很陌生,所以我几乎可以肯定这里有一个明显的错误:

  • 从USGS GloVis下载Landsat 8 GeoTIFF文件
  • 将乐队5图像重命名为更友好的命令ninja with。
  • 为栅格表创建postgres数据库并运行CREATE EXTENSION postgis;
  • 运行gdalinfo LSSampleB5.TIF,打印以下输出:

    Driver: GTiff/GeoTIFF Files: LSSampleB5Test2.TIF Size is 7871, 7971 Coordinate System is: PROJCS["WGS 84 / UTM zone 19N", 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.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4326"]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",-69], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AXIS["Easting",EAST], AXIS["Northing",NORTH], AUTHORITY["EPSG","32619"]] Origin = (318285.000000000000000,5216715.000000000000000) Pixel Size = (30.000000000000000,-30.000000000000000) Metadata: AREA_OR_POINT=Point Image Structure Metadata: INTERLEAVE=BAND Corner Coordinates: Upper Left ( 318285.000, 5216715.000) ( 71d23'37.53"W, 47d 4'44.12"N) Lower Left ( 318285.000, 4977585.000) ( 71d18' 9.77"W, 44d55'42.53"N) Upper Right ( 554415.000, 5216715.000) ( 68d16'58.41"W, 47d 6' 6.11"N) Lower Right ( 554415.000, 4977585.000) ( 68d18'36.69"W, 44d56'58.62"N) Center ( 436350.000, 5097150.000) ( 69d49'20.56"W, 46d 1'29.87"N) Band 1 Block=7871x1 Type=UInt16, ColorInterp=Gray

  • 我将此输出解释为EPSG 4326格式(这可能是我的罪行),因此我运行以下命令将GeoTIFF作为PostGIS栅格导入:

    raster2pgsql -s 4326 -I LSSampleB5.TIF -F -t 50x50 -d | psql -U postgres rastertest

  • 这成功导入了一个新表。然后我使用QGIS来直观地了解发生了什么。

  • Database -> DB Manager -> PostGIS -> rastertest -> public下,我将lssampleb5添加到画布中。

  • 我在QGIS中创建了一个新的XYZ Connection,以添加Google satillite混合图像以供参考。我使用的网址是https://mt1.google.com/vt/lyrs=y&x={x}&y={y}&z={z},最小和最大缩放分别为0和19。

  • 以下是我注意到lssample图层在Google混合地图上落在西班牙海岸的事实。

  • 我确保两个图层都在EPSG 4326投影上,没有变化。

  • 不太沮丧继续前进,我尝试了数据库查询来获取单个像素值。由于我的样本数据落在西班牙附近,我使用QGIS对附近的有效坐标对进行采样以进行查询。查询是:

    SELECT rid, ST_Value(rast, 1, ST_SetSRID(ST_Point(448956,5041439), 4326)) as b5 FROM lssampleb5 WHERE ST_Intersects(rast, ST_SetSRID(ST_Point(448956,5041439), 4326)::geometry, 1);

  • 这返回了一个有效的行ID和ST_VALUE为5776.在QGIS显示的范围之外尝试坐标导致没有返回的条目,这不是意料之外的。

所以,首先,我不知道QGIS的坐标系使用了什么。它绝对不是原始形式的经度和纬度,但根据我的理解,EPSG 4326应该是一个地理投影。

其次,我不知道为什么QGIS错误地放置了Landsat场景,或者在这个过程中场景没有被正确转换。

1 个答案:

答案 0 :(得分:0)

加入我们GIS SE,这就是GIS相关Q / A的地方!

为了帮助你:

  • 的确,你的罪行是CRS。顶级PROJCRS标记是 键在这里,它从数据中读出"WGS 84 / UTM zone 19N" 底部的EPSG参考(AUTHORITY["EPSG","32619"]])。EPSG:32619是基于WGS84大地水准面(基准面)的UTM projected CRS,单位为米,定义为投影距离相应的参考经络(东方)和赤道(北方)。由于您在导入期间定义了错误的CRS(即EPSG:4326),因此栅格的固有坐标值被视为度数,整个事物被放置在世界的另一端。运行UpdateRasterSRIDSELECT UpdateRasterSRID(<shema_name>, <your_raster_table>, rast, 32619);)将栅格的元数据设置为正确的CRS并重新加载图层。
  • 对于QGIS:它使用您告诉它使用的CRS。 QGIS附带了一个非常方便的动态重投影功能( OTF ,查看有关'使用投影'here的一般手册页)您为要投影和显示的数据定义了一个任意CRS(即它将数据的CRS重新投影到内存中已定义的CRS中,数据的元数据保持不变)。
    您可以找到的快速链接按钮GUI右下角的OTF 设置;将其设置为您想要的SRID(例如4326)(您会注意到数据的可视化表示如何根据所选投影而变化。显示的坐标也将使用CRS单位,例如WGS84的十进制度数。)