实例介绍
【实例简介】python通过geoserver将tiff影像发布到wms服务
【实例截图】
【核心代码】def publish_tif_to_geoserver(geoserver_url, username, password, workspace, store_name, tif_file_path, layer_name):
"""
将TIF文件发布到GeoServer
参数:
geoserver_url: GeoServer基础URL (例如: http://localhost:8080/geoserver)
username: GeoServer用户名
password: GeoServer密码
workspace: 工作区名称
store_name: 数据存储名称
tif_file_path: TIF文件路径
layer_name: 图层名称
返回:
发布的服务URL
"""
auth = HTTPBasicAuth(username, password)
headers = {"Content-type": "application/json"}
# 1. 检查工作区是否存在,若不存在则创建
workspace_url = f"{geoserver_url}/rest/workspaces/{workspace}"
try:
check_response = requests.get(workspace_url, auth=auth)
if check_response.status_code == 404: # 工作区不存在,进行创建
create_workspace_url = f"{geoserver_url}/rest/workspaces"
response = requests.post(
create_workspace_url,
auth=auth,
headers=headers,
json={"workspace": {"name": workspace}}
)
if response.status_code not in (200, 201):
print(f"创建工作区失败 (状态码 {response.status_code}): {response.text}")
return None
except Exception as e:
print(f"检查或创建工作区时出错: {str(e)}")
return None
# 2. 创建数据存储并上传TIF文件
store_url = f"{geoserver_url}/rest/workspaces/{workspace}/coveragestores/{store_name}/file.geotiff"
with open(tif_file_path, 'rb') as f:
try:
response = requests.put(
store_url,
auth=auth,
headers={"Content-type": "image/tiff"},
data=f
)
if response.status_code != 201:
print(f"创建数据存储失败 (状态码 {response.status_code}): {response.text}")
return None
else:
print("数据存储创建成功")
except Exception as e:
print(f"上传TIF文件时出错: {str(e)}")
return None
# 获取自动生成的图层名称
coverage_url = f"{geoserver_url}/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages.json"
try:
coverage_response = requests.get(coverage_url, auth=auth)
if coverage_response.status_code == 200:
coverages = coverage_response.json().get('coverages', {}).get('coverage', [])
if coverages:
layer_name = coverages[0].get('name', layer_name)
except Exception as e:
print(f"获取图层名称时出错: {str(e)}")
# 3. 发布图层
layer_url = f"{geoserver_url}/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages/{layer_name}"
layer_xml = f"""
<coverage>
<name>{layer_name}</name>
<title>{layer_name}</title>
<enabled>true</enabled>
</coverage>
"""
try:
response = requests.put(
layer_url,
auth=auth,
headers={"Content-type": "text/xml"},
data=layer_xml
)
if response.status_code not in (200, 201):
print(f"发布图层失败 (状态码 {response.status_code}): {response.text}")
return None
except Exception as e:
print(f"发布图层时出错: {str(e)}")
return None
# 4. 返回服务URL
wms_url = f"{geoserver_url}/{workspace}/wms?service=WMS&version=1.1.0&request=GetMap&layers={workspace}:{layer_name}&styles=&bbox={{bbox}}&width=768&height=330&srs=EPSG:4326&format=image/png"
wfs_url = f"{geoserver_url}/{workspace}/ows?service=WFS&version=1.0.0&request=GetFeature&typeName={workspace}:{layer_name}&maxFeatures=50&outputFormat=application/json"
return {
"wms_url": wms_url,
"wfs_url": wfs_url,
"layer_url": f"{geoserver_url}/{workspace}/wms?layers={workspace}:{layer_name}"
}
【实例截图】
【核心代码】def publish_tif_to_geoserver(geoserver_url, username, password, workspace, store_name, tif_file_path, layer_name):
"""
将TIF文件发布到GeoServer
参数:
geoserver_url: GeoServer基础URL (例如: http://localhost:8080/geoserver)
username: GeoServer用户名
password: GeoServer密码
workspace: 工作区名称
store_name: 数据存储名称
tif_file_path: TIF文件路径
layer_name: 图层名称
返回:
发布的服务URL
"""
auth = HTTPBasicAuth(username, password)
headers = {"Content-type": "application/json"}
# 1. 检查工作区是否存在,若不存在则创建
workspace_url = f"{geoserver_url}/rest/workspaces/{workspace}"
try:
check_response = requests.get(workspace_url, auth=auth)
if check_response.status_code == 404: # 工作区不存在,进行创建
create_workspace_url = f"{geoserver_url}/rest/workspaces"
response = requests.post(
create_workspace_url,
auth=auth,
headers=headers,
json={"workspace": {"name": workspace}}
)
if response.status_code not in (200, 201):
print(f"创建工作区失败 (状态码 {response.status_code}): {response.text}")
return None
except Exception as e:
print(f"检查或创建工作区时出错: {str(e)}")
return None
# 2. 创建数据存储并上传TIF文件
store_url = f"{geoserver_url}/rest/workspaces/{workspace}/coveragestores/{store_name}/file.geotiff"
with open(tif_file_path, 'rb') as f:
try:
response = requests.put(
store_url,
auth=auth,
headers={"Content-type": "image/tiff"},
data=f
)
if response.status_code != 201:
print(f"创建数据存储失败 (状态码 {response.status_code}): {response.text}")
return None
else:
print("数据存储创建成功")
except Exception as e:
print(f"上传TIF文件时出错: {str(e)}")
return None
# 获取自动生成的图层名称
coverage_url = f"{geoserver_url}/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages.json"
try:
coverage_response = requests.get(coverage_url, auth=auth)
if coverage_response.status_code == 200:
coverages = coverage_response.json().get('coverages', {}).get('coverage', [])
if coverages:
layer_name = coverages[0].get('name', layer_name)
except Exception as e:
print(f"获取图层名称时出错: {str(e)}")
# 3. 发布图层
layer_url = f"{geoserver_url}/rest/workspaces/{workspace}/coveragestores/{store_name}/coverages/{layer_name}"
layer_xml = f"""
<coverage>
<name>{layer_name}</name>
<title>{layer_name}</title>
<enabled>true</enabled>
</coverage>
"""
try:
response = requests.put(
layer_url,
auth=auth,
headers={"Content-type": "text/xml"},
data=layer_xml
)
if response.status_code not in (200, 201):
print(f"发布图层失败 (状态码 {response.status_code}): {response.text}")
return None
except Exception as e:
print(f"发布图层时出错: {str(e)}")
return None
# 4. 返回服务URL
wms_url = f"{geoserver_url}/{workspace}/wms?service=WMS&version=1.1.0&request=GetMap&layers={workspace}:{layer_name}&styles=&bbox={{bbox}}&width=768&height=330&srs=EPSG:4326&format=image/png"
wfs_url = f"{geoserver_url}/{workspace}/ows?service=WFS&version=1.0.0&request=GetFeature&typeName={workspace}:{layer_name}&maxFeatures=50&outputFormat=application/json"
return {
"wms_url": wms_url,
"wfs_url": wfs_url,
"layer_url": f"{geoserver_url}/{workspace}/wms?layers={workspace}:{layer_name}"
}
好例子网口号:伸出你的我的手 — 分享!
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论