mongodb 建议实现一个简单的RESTFul微服务来从GeoTiff中检索像素值

46qrfjad  于 2023-06-29  发布在  Go
关注(0)|答案(1)|浏览(103)

我是一名计算机科学专业的学生(硕士学位),我正在制作一个基于GeoTIFF图像和Sping Boot (Java)的“简单”微服务。
我想做的是:
1.下载高分辨率(10-m像素)DEM意大利(即TINITALY/01),分为图块,其中每个图块是一个GeoTiff图像。

  • “本DEM是从意大利单个行政区的单独DEM开始获得的。DEM可在UTM WGS 84 zone 32投影系统中以10 m单元格大小的网格(GeoTIFF格式)免费提供(请参阅下载链接)。

http://tinitaly.pi.ingv.it/Download_Area1_1.html
1.将图像保存在数据库中(?)
1.在Sping Boot 中开发一个REST服务,其中,给定坐标点(lat/long)和(像素的)周围,返回DEM值的数组
提问(谢谢):
1.我读到有几种方法可以保存GeoTiff图像,例如Postgresql的PostGIS,mongoDB,GeoServer等。老实说,对于我需要制作的应用程序,我还没有弄清楚哪个组件最适合商店GeoTiff。
1.我读到一些开发人员建议,为了在云中工作,将GeoTIFF转换为云优化的GeoTIFF(COG)。我仍在研究文档,但您认为这是我想要实现的服务所必需的步骤吗?

bis0qfac

bis0qfac1#

我曾使用Postgres+POSTGIS,我认为如果你只是想获取单元格的值,它的效果会很好-即使是空间分析也会很好,但对于非常大的光栅数据集可能有点慢。
这里,您可以使用ST_Value轻松获取单元格的值:https://postgis.net/docs/RT_ST_Value.html正如你在这里看到的,你可以使用位置或图像空间行,列来获取数据。ST_Neighbourhood也可以用于从附近的像素获取值:https://postgis.net/docs/RT_ST_Neighborhood.html
在性能方面,我曾使用过澳大利亚维多利亚州的30 m * 30 m DEM,使用PostGIS效果非常好-即使对于需要空间连接的更高级查询,性能也是可以接受的。
我会推荐使用PostGIS,因为我很确定它会工作得很好。但我不确定第二个问题-我没有COG的经验。
以下是一些可能有用的示例查询。这里,我使用WGS 84(SRID:4326)中的一个点从SRID 7855中的光栅数据中获取数据(因此我需要转换坐标)。我的光栅表是victoria_raster,点坐标在(纬度:-37.8136经度:144.9631)。
获取像素值(由几何体定义):

select rid, ST_WorldToRasterCoordX(raster.rast,
                ST_Transform(
                    ST_Point(144.9631, -37.8136, 4326),
                    7855
                )) as pix_value
from victoria_raster as raster
WHERE ST_Intersects(raster.rast,ST_Transform(
                    ST_Point(144.9631, -37.8136, 4326),
                    7855));

得到像素周围的值(由几何定义)-3乘3,因为我们只考虑ST_Neighbourhood函数中的cols +- 1和rows +-1:

-- 3 by 3 pixels - around the point
with input_point as (
    select ST_Transform(
                    ST_Point(144.9631, -37.8136, 4326),
                    7855) as geom
),
row_col as (
    select ST_WorldToRasterCoordX(raster.rast,
                input_point.geom) as c_number,
            ST_WorldToRasterCoordY(raster.rast,
                input_point.geom) as r_number,
            input_point.geom as geom
    from victoria_raster as raster, input_point
    WHERE ST_Intersects(raster.rast,input_point.geom)
)
select ST_Neighborhood(raster.rast, row_col.c_number, row_col.r_number, 1,1)
from row_col, victoria_raster as raster
WHERE ST_Intersects(raster.rast,row_col.geom)

因此,我建议使用数据库来处理栅格数据集- Postgres+PostGIS。并在REST Web服务中使用查询来获取值。

相关问题