基本思路
可以考虑
1、判断工作区是否已存在,有就跳过,没有就创建
2、根据传入的文件地址和文件名创建存储仓库,但是文件地址在geoserver的数据文件夹里面,所以在安装geoserver的时候记得做好文件夹映射
3、发布图层,将这个存储仓库进行图层发布,边框值从数据中获取,样式选择已存在的样式,例如line,raster等,这个时候如果你需要新的样式,可以提前预设
自动发布Shapefile
import requests
from requests.auth import HTTPBasicAuth
geoserver_url = "http://localhost:38080/geoserver"
workspace_name = "test"
datastore_name = "clipped_shapefile"
file_path = "/data_dir/clipped_shapefile.shp"
layer_name = "clipped_shapefile"
style_name = "line"
auth = HTTPBasicAuth('admin', 'geoserver')
def workspace_exists(workspace_name):
url = f"{geoserver_url}/rest/workspaces/{workspace_name}.json"
response = requests.get(url, auth=auth)
return response.status_code == 200
if not workspace_exists(workspace_name):
url = f"{geoserver_url}/rest/workspaces"
headers = {'Content-type': 'application/json'}
data = {"workspace": {"name": workspace_name}}
response = requests.post(url, json=data, headers=headers, auth=auth)
if response.status_code == 201:
print(f"Workspace '{workspace_name}' created successfully.")
else:
print(f"Failed to create workspace '{workspace_name}'. Status code: {response.status_code}")
def create_datastore(workspace_name, datastore_name, file_path):
url = f"{geoserver_url}/rest/workspaces/{workspace_name}/datastores"
headers = {'Content-type': 'application/json'}
data = {
"dataStore": {
"name": datastore_name,
"connectionParameters": {
"url": f"file:{file_path}"
}
}
}
response = requests.post(url, json=data, headers=headers, auth=auth)
if response.status_code == 201:
print(f"Datastore '{datastore_name}' created successfully.")
else:
print(f"Failed to create datastore '{datastore_name}'. Status code: {response.status_code}")
create_datastore(workspace_name, datastore_name, file_path)
def publish_layer(workspace_name, datastore_name, layer_name, style_name):
url = f"{geoserver_url}/rest/workspaces/{workspace_name}/datastores/{datastore_name}/featuretypes"
headers = {'Content-type': 'application/json'}
data = {
"featureType": {
"name": layer_name,
"nativeName": layer_name,
"srs": "EPSG:4326",
"title": layer_name,
"enabled": True
}
}
response = requests.post(url, json=data, headers=headers, auth=auth)
if response.status_code == 201:
print(f"Layer '{layer_name}' published successfully.")
# 设置样式
style_url = f"{geoserver_url}/rest/layers/{workspace_name}:{layer_name}"
style_data = {"layer": {"defaultStyle": {"name": style_name}}}
style_response = requests.put(style_url, json=style_data, headers=headers, auth=auth)
if style_response.status_code == 200:
print(f"Style '{style_name}' applied to layer '{layer_name}' successfully.")
else:
print(
f"Failed to apply style '{style_name}' to layer '{layer_name}'. Status code: {style_response.status_code}")
else:
print(f"Failed to publish layer '{layer_name}'. Status code: {response.status_code}")
publish_layer(workspace_name, datastore_name, layer_name, style_name)
自动发布GeoTIFF
import os
import requests
# GeoServer URL, username, and password
GEOSERVER_URL = 'http://localhost:38080/geoserver/rest'
USERNAME = 'admin'
PASSWORD = 'geoserver'
def create_workspace(workspace):
url = f"{GEOSERVER_URL}/workspaces/{workspace}"
response = requests.get(url, auth=(USERNAME, PASSWORD))
if response.status_code == 404:
# Workspace does not exist, create it
headers = {'Content-Type': 'application/xml'}
data = f'<workspace><name>{workspace}</name></workspace>'
response = requests.post(url, headers=headers, data=data, auth=(USERNAME, PASSWORD))
if response.status_code == 201:
print(f"Workspace '{workspace}' created successfully.")
else:
print(f"Failed to create workspace '{workspace}'.")
elif response.status_code == 200:
print(f"Workspace '{workspace}' already exists.")
else:
print(f"Failed to check workspace '{workspace}'.")
def create_coveragestore(workspace, store_name, file_path, file_name):
url = f"{GEOSERVER_URL}/workspaces/{workspace}/coveragestores"
data = f"""
<coverageStore>
<name>{store_name}</name>
<workspace>{workspace}</workspace>
<enabled>true</enabled>
<type>GeoTIFF</type>
<url>file://{file_path}/{file_name}</url>
</coverageStore>
"""
headers = {'Content-Type': 'application/xml'}
response = requests.post(url, headers=headers, data=data, auth=(USERNAME, PASSWORD))
if response.status_code == 201:
print(f"Coverage store '{store_name}' created successfully.")
else:
print(f"Failed to create coverage store '{store_name}'.")
def publish_layer(workspace, store_name, layer_name, style_name='raster'):
url = f"{GEOSERVER_URL}/workspaces/{workspace}/coveragestores/{store_name}/coverages"
data = f"""
<coverage>
<name>{layer_name}</name>
<nativeName>{layer_name}</nativeName>
<namespace>
<name>{workspace}</name>
</namespace>
</coverage>
"""
headers = {'Content-Type': 'application/xml'}
response = requests.post(url, headers=headers, data=data, auth=(USERNAME, PASSWORD))
if response.status_code == 201:
print(f"Layer '{layer_name}' published successfully.")
# Apply style to the layer
style_url = f"{GEOSERVER_URL}/layers/{workspace}:{layer_name}"
style_data = f"""
<layer>
<defaultStyle>
<name>{style_name}</name>
</defaultStyle>
</layer>
"""
response = requests.put(style_url, headers=headers, data=style_data, auth=(USERNAME, PASSWORD))
if response.status_code == 200:
print(f"Style '{style_name}' applied to layer '{layer_name}'.")
else:
print(f"Failed to apply style '{style_name}' to layer '{layer_name}'.")
else:
print(f"Failed to publish layer '{layer_name}'.")
if __name__ == "__main__":
workspace = 'test'
store_name = 'TIFF1209'
layer_name = 'TIFF1209'
file_path = '/data_dir/'
file_name = 'TIFF1209.tif'
create_workspace(workspace)
create_coveragestore(workspace, store_name, file_path, file_name)
publish_layer(workspace, store_name, layer_name)
获取发布好的Shapefile的BBOX
def get_layer_bounds(GEOSERVER_URL, USERNAME, PASSWORD, workspace, layer_name):
url = f"{GEOSERVER_URL}/rest/workspaces/{workspace}/datastores/{layer_name}/featuretypes/{layer_name}.json"
response = requests.get(url, auth=(USERNAME, PASSWORD))
if response.status_code == 200:
data = response.json()
bbox = data['featureType']['latLonBoundingBox']
minx = bbox['minx']
miny = bbox['miny']
maxx = bbox['maxx']
maxy = bbox['maxy']
return (minx, miny, maxx, maxy)
else:
print(f"Failed to get bounds for shapefile '{layer_name}'.")
print("Response:", response.text)
return None
获取发布好的GeoTIFF的BBOX
def get_layer_bounds(GEOSERVER_URL, USERNAME, PASSWORD, workspace, layer_name):
url = f"{GEOSERVER_URL}/rest/workspaces/{workspace}/coveragestores/{layer_name}/coverages/{layer_name}.json"
response = requests.get(url, auth=(USERNAME, PASSWORD))
if response.status_code == 200:
data = response.json()
bbox = data['coverage']['latLonBoundingBox']
minx = bbox['minx']
miny = bbox['miny']
maxx = bbox['maxx']
maxy = bbox['maxy']
return (minx, miny, maxx, maxy)
else:
print(f"Failed to get bounds for layer '{layer_name}'.")
return None