基本信息
源码名称:python通过geoserver将tiff影像发布到wms服务
源码大小:4.87KB
文件格式:.py
开发语言:Python
更新时间:2025-07-15
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍
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}"
    }