Python通过Rest Api自动发布GeoServer(含样式),获取BBOX

基本思路

可以考虑

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值