我正在尝试制作一个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)
此脚本将在名为“ testws”的工作区中成功创建一个名为“ myshapefile”的图层,并使用一个名为“ e477fb5b4d5748b9aabb617475e47b01”的存储区。
问题是我将创建大量图层,因此我需要图层名称作为资源ID,而不是文件名,并且我将无法在数据目录。我的理解是,使用REST API创建图层后,我无法重命名图层,因此我需要能够在初始PUT请求中指定图层的名称。有没有办法通过API做到这一点?
我用于此过程的文档在这里:http://docs.geoserver.org/stable/en/user/rest/api/datastores.html#rest-api-datastores-extension
答案 0 :(得分: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)
答案 1 :(得分:0)
您正在使用的请求将创建一个数据存储并自动配置功能类型。 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)