在进行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文档还介绍了其他的配置操作,感兴趣的网友可以进行查阅。