Python GeoServer服务发布

在进行GeoServer图层自动发布时,发现大多数是基于Java和curl等方式实现的,而基于Python requests的相对较少,故尝试通过Python实现后进行分享交流。

创作不易,转载请注明来源。

本文链接:https://blog.csdn.net/qq_43482195/article/details/130593555

本文主要介绍 shp 数据和 tif 数据的图层服务发布。

GeoServer REST API

官方文档

GeoServer提供了REST接口,用户通过HTTP调用该接口,无需操作Web界面即可配置GeoServer,实现大多数功能。

服务发布

1.通过操作界面发布

我们在用户操作界面进行服务发布时,一般是以下的步骤:

(1)新建工作空间

(2)新建存储仓库

(3)发布图层

2.通过REST API发布

启动GeoServer后,即可访问API,以本地启动为例。

http://localhost:8080/geoserver/rest/

所需Python库:

import requests
import json
from pprint import pprint

1.创建工作空间

# 新建工作空间
work_name = "work_name"
Url = 'http://localhost:8080/geoserver/rest/namespaces'
headers = {'Content-type': 'text/xml'}
parameter = f'<namespace><prefix>{work_name}</prefix><uri>http://geoserver.org/{work_name}</uri></namespace>'
resp = requests.post(Url, auth=('admin', 'geoserver'), data=parameter, headers=headers)
print(resp.status_code) # 输出状态码

2.1 Shpfile发布

#发布Shpfile
file = './shp/example.zip' # shpfile以压缩包的形式上传
work_name = "work_name"
store_name = "shp_name"
Url = f'http://localhost:8080/geoserver/rest/workspaces/{work_name}/datastores/{store_name}/file.shp'
shp_file = open(file, 'rb')
parameter = shp_file.read()
headers = {'Content-type': 'application/zip'}
resp = requests.put(Url, auth=('admin', 'geoserver'), data=parameter, headers=headers)
print(resp.status_code)

2.2 GeoTIFF发布

#发布GeoTIFF
file = './tif/example.tif'
work_name = "work_name"
store_name = "tif_name"
Url = f'http://localhost:8080/geoserver/rest/workspaces/{work_name}/coveragestores/{store_name}/file.geotiff'
tif_file = open(file, 'rb')
parameter = tif_file.read()
headers = {'Content-type': 'image/tiff'}
resp = requests.put(Url, auth=('admin', 'geoserver'), data=parameter, headers=headers)
print(resp.status_code)

3 其他相关操作

3.1 检索工作空间

# 检索工作空间
Url= "http://localhost:8080/geoserver/rest/workspaces"
# headers = {'Accept': 'text/xml'}
# resp = requests.get(myUrl, auth=('admin','geoserver'), headers=headers)
resp = requests.get(Url, auth=('admin','geoserver'))
print(resp.status_code)
info = json.loads(resp.text)
pprint(info)

3.2 检索存储仓库

# 检索存储仓库"DataStores"(shp)
work_name = "work_name"
Url=f'http://localhost:8080/geoserver/rest/workspaces/{work_name}/datastores'
# headers = {'Accept': 'text/xml'}
# resp = requests.get(myUrl, auth=('admin','geoserver'), headers=headers)
resp=requests.get(Url,auth=('admin','geoserver'))
print(resp.status_code)
info = json.loads(resp.text)
pprint(info)

# 检索存储仓库"CoverageStores"(tif)
work_name = "work_name"
Url=f'http://localhost:8080/geoserver/rest/workspaces/{work_name}/coveragestores'
resp=requests.get(Url,auth=('admin','geoserver'))
print(resp.status_code)
info = json.loads(resp.text)
pprint(info)

3.3 检索图层

# 检索图层
work_name = "work_name"
Url = f'http://localhost:8080/geoserver/rest/workspaces/{work_name}/layers'
# headers = {'Accept': 'text/xml'}
# resp = requests.get(myUrl, auth=('admin','geoserver'), headers=headers)
resp = requests.get(url, auth=('admin', 'geoserver'))
info = json.loads(resp.text)
pprint(cnt)

3.4 删除操作

# 删除顺序:
# 1.删除图层
# 2.删除featuretypes/删除coverages
# 3.删除仓库"DataStores"/删除仓库"CoverageStores"
# 4.删除工作空间

3.4.1 删除图层

# 删除图层
work_name = "work_name"
layer_name = "file_name"
Url = f'http://localhost:8080/geoserver/rest/workspaces/{work_name}/layers/{layer_name}'
# headers = {'Accept': 'text/xml'}
headers = {'content-type': 'application/json'}
resp = requests.delete(Url, auth=('admin', 'geoserver'), headers=headers)
print(resp.status_code)

3.4.2 删除featuretypes/删除coverages

# 删除featuretypes(shp)
work_name = 'work_name'
store_name = 'store_name'
layer_name = 'layer_name'
url = f'http://localhost:8080/geoserver/rest/workspaces/{work_name}/datastores/{store_name}/featuretypes/{layer_name}'
headers = {'content-type': 'application/json'}
response = requests.delete(url, auth=('admin', 'geoserver'), headers=headers)
print(response.status_code)

# 删除coverages(tif)
work_name = 'work_name'
store_name = 'store_name'
layer_name = 'layer_name'
url = f'http://localhost:8080/geoserver/rest/workspaces/{work_name}/datastores/{store_name}/coverages/{layer_name}'
headers = {'content-type': 'application/json'}
response = requests.delete(url, auth=('admin', 'geoserver'), headers=headers)
print(response.status_code)

3.4.3 删除存储仓库

# 删除存储仓库"DataStores"(shp)
work_name = "work_name"
store_name = "store_name"
Url = f'http://localhost:8080/geoserver/rest/workspaces/{work_name}/datastores/{store_name}'
headers = {'Accept': 'text/xml'}
resp = requests.delete(Url, auth=('admin', 'geoserver'), headers=headers)
print(resp.status_code)

# 删除存储仓库"CoverageStores"(tif)
work_name = "work_name"
store_name = "store_name"
Url = f'http://localhost:8080/geoserver/rest/workspaces/{work_name}/coveragestores/{store_name}'
headers = {'Accept': 'text/xml'}
resp = requests.delete(Url, auth=('admin', 'geoserver'), headers=headers)
print(resp.status_code)

3.4.4 删除工作空间

# 删除工作空间
work_name = "work_name"
Url = f'http://localhost:8080/geoserver/rest/workspaces/{work_name}'
headers = {'Content-type':'text/xml'}
resp = requests.delete(Url, auth=('admin','geoserver'),headers=headers)
print(resp.status_code)

官方API文档还介绍了其他的配置操作,感兴趣的网友可以进行查阅。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要实现 Python 自动发布 Geoserver 的功能,可以使用 Geoserver REST API。以下是一个基本的 Python 脚本,可以通过 REST API 发布一个 GeoTIFF 文件: ```python import requests # 设置 Geoserver 的地址和用户名密码 geoserver_url = "http://localhost:8080/geoserver" username = "admin" password = "geoserver" # 发布的图层名和工作区 workspace = "myworkspace" layer_name = "mylayer" # GeoTIFF 文件的路径 file_path = "/path/to/myfile.tif" # 构建 REST API 的请求 URL url = f"{geoserver_url}/rest/workspaces/{workspace}/coveragestores/{layer_name}/file.geotiff" # 发送 POST 请求并上传 GeoTIFF 文件 with open(file_path, "rb") as f: headers = {"Content-type": "image/tiff"} r = requests.post(url, auth=(username, password), headers=headers, data=f) # 如果上传成功,会返回 201 状态码 if r.status_code == 201: print("Layer published successfully.") else: print("Failed to publish layer.") ``` 上述代码中,我们首先设置了 Geoserver 的地址和用户名密码,然后指定了发布的图层名、工作区和 GeoTIFF 文件的路径。接下来,我们使用 requests 库发送一个 POST 请求,并在请求头中指定上传的文件类型为 image/tiff。最后,根据响应的状态码来判断发布是否成功。 需要注意的是,如果你的 GeoTIFF 文件包含了地理信息,那么你需要在上传之前先设置该图层的坐标参考系和范围。你可以使用 Geoserver 的 REST API 来完成这项工作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值