【问题标题】:GeoServer REST API - How can I specify a layer name different from the name of my file when creating a layer via a PUT request?GeoServer REST API - 通过 PUT 请求创建图层时,如何指定与文件名称不同的图层名称?
【发布时间】:2019-01-23 22:41:23
【问题描述】:

我正在尝试制作一个 Python 脚本,该脚本可以从安装到 GeoServer 数据目录的数据创建 GeoServer 图层。到目前为止,我的脚本看起来是这样的:

import requests


resource_id = "e477fb5b4d5748b9aabb617475e47b01"
url = "http://127.0.0.1:8181/geoserver/rest/workspaces/testws/datastores/" + resource_id + "/external.shp"
data = "file:///data_vault/" + resource_id + "/data/myshapefile.shp"
auth = ("admin", "geoserver")

response = requests.put(url, data=data, auth=auth)

此脚本将成功创建一个名为“myshapefile”的层,并在名为“testws”的工作区中创建一个名为“e477fb5b4d5748b9aabb617475e47b01”的存储。

问题是我将创建大量图层,所以我需要图层名称是资源 ID,而不是文件名,我将无法重命名数据目录。这也是我的理解,使用 REST API 创建图层后我无法重命名图层,因此我需要能够在初始 PUT 请求中指定图层的名称。有没有办法通过 API 做到这一点?

我用于此过程的文档在这里:http://docs.geoserver.org/stable/en/user/rest/api/datastores.html#rest-api-datastores-extension

【问题讨论】:

    标签: python rest put geoserver


    【解决方案1】:

    你可以试试geoserver-rest(pip install geoserver-rest) 库。只需传递overwrite=True,

    
    #import and initialize library
    from geo.Geoserver import Geoserver
    geo = Geoserver('http://localhost:8080/geoserver', username='admin', password='geoserver')
    
    # upload raster file
    geo.create_coveragestore(lyr_name='layer1' path=r'path\to\raster\file.tif', workspace='demo', overwrite=True)
    

    【讨论】:

    • 仅供参考:在较新版本的geoserver-rest 中,create_coveragestore() 函数的相应参数名称已更改:现在改为 lyr_name=,而不是 layer_name=...
    【解决方案2】:

    您使用的请求将创建数据存储并自动配置要素类型。 AFAIK 您无法在创建特征类型时控制它的名称。在请求中,您可以指定此时不配置功能类型,参数configure 设置为none。

    第二步是使用/workspaces/<ws>/datastores/<ds>/featuretypes URL(请参阅:http://docs.geoserver.org/stable/en/user/rest/api/featuretypes.html)从数据中创建新的要素类型。在这里您要设置name 参数,但您还需要指定nativeName,让Geoserver 知道要使用哪个功能。 nativeName 在您的情况下应该是“myshapefile”。我没有找到有关此的文档,但经过一些试验和错误后它起作用了(有关如何使用 REST API 的一般建议,请参阅此链接:https://gis.stackexchange.com/questions/12970/create-a-layer-in-geoserver-using-rest - 基本思想是浏览 http://your-server/geoserver/rest 并找到您的功能类型,获取 XML 表示以查看可以通过 POST 请求更改哪些参数)。

    最终代码:

    import requests
    
    resource_id = "e477fb5b4d5748b9aabb617475e47b01"
    url = "http://127.0.0.1:8181/geoserver/rest/workspaces/testws/datastores/" + resource_id + "/external.shp?configure=none"
    data = "file:///xxx/myshapefile.shp"
    auth = ("admin", "geoserver")    
    response = requests.put(url, data=data, auth=auth)
    
    url = "http://127.0.0.1:8181/geoserver/rest/workspaces/testws/datastores/" + resource_id + "/featuretypes"
    data = "<featureType><name>" + resource_id + "</name><nativeName>myshapefile</nativeName></featureType>"
    headers = {'Content-type': 'text/xml'}
    response = requests.post(url, data=data, auth=auth, headers=headers)
    

    【讨论】:

    • 当我这样做时,它可以工作,但是会创建一个新图层而不是更新现有图层名称......我想知道我做错了什么......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多