如何使用 Python 从 GeoServer 下载 GeoTiff 文件

How to download GeoTiff files from GeoServer using Python

我正在尝试使用 Python 从 GeoServer 下载 GeoTiff 文件。我在网上找到了一些关于这类事情的资源,但我一直无法完成这项任务。

比如这里:https://gis.stackexchange.com/questions/181560/download-geotiff-from-geoserver好像人家已经可以做我想做的了,但是他们没有说明他们的过程。

同样,此处接受的答案: works for downloading GeoTiffs like the one at http://imgsrc.hubblesite.org/hu/db/images/hs-2006-01-a-hires_tif.tif,但 GeoServer 上没有下载 link GeoTiffs。

如有任何帮助,我们将不胜感激!

编辑:这里有一些关于我迄今为止所尝试的更多细节。 GeoServer 在本地 http://localhost:8080/geoserver/rest 有一个休息 API 服务器,所以我最初尝试在 python 访问这个 url 然后在 "Layers" 下载我想要的 GeoTiff .但是,"Layers" 中的每个文件都是一个 html 文件;我想知道的是,是否有一个地方可以让我以编程方式实际访问 GeoTiff 文件。我认为这是问题的根源——虽然我不太确定如何以编程方式下载 GeoTiffs,但我必须首先能够在 GeoServer 中实际访问它们。

不过,就进展而言,我还没有取得太大进展。正如我上面提到的,我能够使用 处的代码下载 GeoTiff,但我无法为 GeoServer 上的 GeoTiff 执行此操作。我对 GeoServer 和 GeoTiff 格式都不熟悉,所以我不太确定如何解决这个问题。

作为您 linked question says you need to make a WCS request 到 GeoServer 获取 GeoTiff 的答案。

GeoServer manual provides a WCS reference 应该可以帮助您了解如何进行。您还可以转到 GeoServer 安装的演示页面并使用 WCS 请求构建器创建一个 XML 文件,您可以将其用作 python 程序中的模板。

我的同事找到了解决这个问题的方法。使用下面的示例代码,我们可以从 GeoServer 下载 GeoTiff 文件。

from owslib.csw import CatalogueServiceWeb
import urllib

def getLinkByIDCWS(url, id, user, pwd):
    csw = CatalogueServiceWeb(url, username=user, password=pwd)

    csw.getrecordbyid(id=[id])
    csw.records[id].references

    link = csw.records[id].references[2]['url']

    return link

def downloadImage(url, fileName):
    urllib.request.urlretrieve(url, fileName)

url = "http://localhost:8080/geoserver/csw?service=CSW&version=2.0.2&request=GetRecords&typeNames=gmd:MD_Metadata&resultType=results&elementSetName=full&outputSchema=http://www.isotc211.org/2005/gmd"
record = "nurc:Arc_Sample"
name = "<user>"
pwd = "<pwd>"

link = getLinkByIDCWS(url, record, name, pwd)
print(link)

downloadImage(link, "test.arc")