RFS_Server_06 上传并发布数据

操作描述:云服务器Ubuntu20.04系统Docker中有两个容器:Postgres容器和GeoServer容器。将数据存储至Postgres数据库容器中,并通过GeoServer连接,发布地图服务。

此文档中使用的Postgres数据库名称为pg01,GeoServer服务器名称为geoserver01

1    基础操作:使用工具连接云服务器Docker中Postgres数据库容器

1-1    通过QGIS连接

QGIS用于测试数据库连接、浏览postgres中的空间数据。

右侧“浏览器”部分中,找到PostgreSQL选项,右键新建链接,输入以下几项:

  • 名称:自定义的

  • 主机:服务器IP,如果是本地服务器,应为localhost。

  • 端口:前期已将pg01容器5432端口与云服务器8432端口匹配,所以现在应该连接服务器的8432端口。

  • 数据库:前期操作中,已在pg01容器中新建名称为postgres的数据库。或者自己新建其他数据库,填写数据库的名称。

  • 用户名和密码:pg01账户名称为postgres,密码前期已自定义。

点击下方“测试连接”按钮,失败或成功会有消息提示。

QGIS有往数据库上传数据的功能,但多次测试并没有成功,所以一般QGIS仅用于浏览postgres中的空间数据。![](file://G:\04%20开发\01%20博客存档\RFS_Server_06%20上传并发布数据\Snipaste_2024-06-05_13-00-01.png?msec=1717591837770)

1-2    通过DataGrip连接

DataGrip和PyCharm不同,没有社区版和正式版之分,必须购买正版或破解。DataGrip主要用于连接数据库,查看数据表、执行数据库命令等操作。

连接云服务器的Postgres数据库:

先连接已有数据库postgres,成功连接后再新建名为bellotergis的数据库。在数据库中引入PostGIS插件,才能在Postgres数据库中使用空间数据,否则导入的只有属性表。

在控制台运行如下代码:

create extension postgis; -- PostGIS的矢量数据扩展
create extension postgis_raster; -- PostGIS的栅格数据扩展

验证是否扩展成功,执行下面语句不报错即可。

select ST_SetSRID(ST_Point(-108,30.741),4326),ST_GeomFromText('POINT(-106.51 29.741)',4326)

或是运行如下语句:

SELECT postgis_lib_version();

参考文档:PostgreSQL扩展PostGIS - lqqgis - 博客园

现在可以通过Datagrip查看数据表,若数据为空间要素,则会带有geom字段。

1-3    通过GDAL连接

1-3-1    安装GDAL

GDAL是Python包,主要用于读取电脑上的空间数据并上传到服务器中。

环境:miniconda3 24.40 + Python3.11

安装GDAL经常会出现报错,base环境下似乎可以pip install gdall或conda install gdal成功安装,但虚拟环境下唯一成功的方式是通过Anaconda Prompt (miniconda3) 安装,运行如下命令:

# 记得进入虚拟环境,如果安装不上可以通过Anaconda Prompt进入cmd安装。pip无法使用的话使用conda install
conda install gdal
conda install psycopg2

有可能会遇到miniconda或python版本较老,上述方法仍旧无法安装的情况,最后重建了虚拟环境,安装成功。

1-3-2    GDAL上传shapefile文件

设置好参数,运行如下python代码:

# 定义参数
shapefile_path = 'C:/Users/****/Desktop/Database/TOWN_POINT.shp'
db_name = 'bellotergis'
db_user = 'postgres'
db_password = '12345678'
db_host = '47.113.***.***'
db_port = '8432'
table_name = 'TOWN_POINT_TEST'
# 上传shapefile的函数

import subprocess
def upload_shapefile_to_postgis(shapefile_path, db_name, db_user, db_password, db_host, db_port, table_name):
    # Construct the ogr2ogr command
    ogr2ogr_command = [
        'ogr2ogr',
        '-f', 'PostgreSQL',
        f'PG:dbname={db_name} user={db_user} password={db_password} host={db_host} port={db_port}',
        shapefile_path,
        '-nln', table_name,  # Set the table name
        '-overwrite',  # Overwrite the table if it exists
        '-lco', 'GEOMETRY_NAME=geom',  # Specify geometry column name
        '-lco', 'FID=gid',  # Specify FID column name
        '-lco', 'SPATIAL_INDEX=GIST',  # Create a spatial index
        # '-progress',  # Show progress
        # '-skipfailures'  # Skip failures
    ]

    # Run the command
    try:
        subprocess.check_call(ogr2ogr_command)
        print("Shapefile successfully uploaded to PostGIS.")
    except subprocess.CalledProcessError as e:
        print(f"Error occurred: {e}")
# 运行函数
upload_shapefile_to_postgis(shapefile_path, db_name, db_user, db_password, db_host, db_port, table_name)

1-3-3    GDAL上传gpkg中的单个要素

设置好参数,运行如下python代码:

# 设置参数
geopackage_path = 'C:/Users/****/Desktop/Database/TEST_GEOPACKAGE.gpkg'
layer_name = 'TEST_LAYER'  # Specify the layer name inside the GeoPackage
db_name = 'bellotergis'
db_user = 'postgres'
db_password = '12345678'
db_host = '47.113.***.***'
db_port = '8432'
table_name = 'TEST_GPKG'
# 上传GeoPackage的函数

import subprocess
def upload_geopackage_to_postgis(geopackage_path, layer_name, db_name, db_user, db_password, db_host, db_port, table_name):
    # Construct the ogr2ogr command
    ogr2ogr_command = [
        'ogr2ogr',
        '-f', 'PostgreSQL',
        f'PG:dbname={db_name} user={db_user} password={db_password} host={db_host} port={db_port}',
        geopackage_path,
        '-nln', table_name,  # Set the table name
        '-overwrite',  # Overwrite the table if it exists
        '-lco', 'GEOMETRY_NAME=geom',  # Specify geometry column name
        '-lco', 'FID=gid',  # Specify FID column name
        '-lco', 'SPATIAL_INDEX=GIST',  # Create a spatial index
        '-progress',  # Show progress
        # '-skipfailures',  # Skip failures
        layer_name  # Specify the layer name in the GeoPackage
    ]

    # Run the command
    try:
        subprocess.check_call(ogr2ogr_command)
        print("GeoPackage successfully uploaded to PostGIS.")
    except subprocess.CalledProcessError as e:
        print(f"Error occurred: {e}")
# 运行函数
upload_geopackage_to_postgis(geopackage_path, layer_name, db_name, db_user, db_password, db_host, db_port, table_name)

1-3-4    批量上传gpkg中的所有要素

# 设置参数
geopackage_path = 'C:/Users/****/Desktop/Database/TEST_GEOPACKAGE.gpkg'
db_name = 'bellotergis'
db_user = 'postgres'
db_password = '12345678'
db_host = '47.113.***.***'
db_port = '8432'
# 未测试,批量导入gpkg中所有文件
import subprocess
import os
from osgeo import ogr

# Enable or disable exceptions,没有这一句的话会有warning,不影响程序运行
ogr.UseExceptions()

def upload_geopackage_to_postgis(geopackage_path, db_name, db_user, db_password, db_host, db_port):
    # Open the GeoPackage to list layers
    gpkg = ogr.Open(geopackage_path)
    if gpkg is None:
        print(f"Failed to open GeoPackage: {geopackage_path}")
        return

    # Iterate over each layer in the GeoPackage
    for i in range(gpkg.GetLayerCount()):
        layer = gpkg.GetLayerByIndex(i)
        layer_name = layer.GetName()
        table_name = layer_name  # You can customize the table name if needed

        # Construct the ogr2ogr command
        ogr2ogr_command = [
            'ogr2ogr',
            '-f', 'PostgreSQL',
            f'PG:dbname={db_name} user={db_user} password={db_password} host={db_host} port={db_port}',
            geopackage_path,
            '-nln', table_name,  # Set the table name
            '-overwrite',  # Overwrite the table if it exists
            '-lco', 'GEOMETRY_NAME=geom',  # Specify geometry column name
            '-lco', 'FID=gid',  # Specify FID column name
            '-lco', 'SPATIAL_INDEX=GIST',  # Create a spatial index
            '-progress',  # Show progress
            '-skipfailures',  # Skip failures
            layer_name  # Specify the layer name in the GeoPackage
        ]

        # Run the command
        try:
            subprocess.check_call(ogr2ogr_command)
            print(f"Layer '{layer_name}' successfully uploaded to PostGIS as table '{table_name}'.")
        except subprocess.CalledProcessError as e:
            print(f"Error occurred while uploading layer '{layer_name}': {e}")
# 运行函数
upload_geopackage_to_postgis(geopackage_path, db_name, db_user, db_password, db_host, db_port)

1-4    通过GeoServer连接

通过域名:接口的方式访问GeoServer,输入账户名、密码登录。

  • 新建工作空间:数据->工作空间->添加新的工作空间,名称为GeoTest

  • 新建存储仓库:数据->存储仓库->添加新的存储仓库->选择矢量数据源PostGIS - PostGIS Database

如能成功保存,则是连接成功。

2    发布服务

2-1    数据预处理要求

  • 数据文件名称、路径、字段名称均不含中文

  • 统一使用WGS 1984地理坐标系

2-3    设置默认配置

矢量数据发布缓存的默认设置,更改后不用每次发布都去勾选

Tile Caching -> Caching Defaults -> Vector Layers

勾选如下几个:
application/json;type=geojson

application/json;type=topojson

application/json;type=utfgrid

application/vnd.mapbox-vector-tile

取消勾选:

image/jpeg

image/png

2-4    将矢量数据发布为地图服务

数据 -> 图层 -> 添加新的资源 -> 选择存储仓库 -> 找到要发布的数据,点击发布 ->进入编辑图层界面

“数据”菜单的“边框”中,点击如下两个按钮,计算XY范围

Tile Caching菜单的“Tile cache configuration”中,确定红框中的勾选如下图。(可以通过2-3设置默认配置 一劳永逸 )

点击保存,完成发布。

2-5    预览矢量数据

方法1 Tile Caching ->找到要预览的图层,在预览中选择EPSG:4326/pbf

预览效果如下:

方法2:数据 -> 图层预览 -> 找到要预览的图层,点击“常用格式”下的OpenLayers

预览效果如下:

2-6    矢量数据调用

暂无

3    上传.tif遥感影像并发布服务

3-1    将数据上传至服务器中

将数据上传至GeoServer容器映射的服务器路径中。按照以前创建GeoServer容器时选择的路径,应为:/root/projects/geoserver_data/。将数据上传至此路径即可。

3-2    将遥感影像发布为地图服务

在GeoServer界面中:数据 -> 存储仓库 -> 添加新的存储仓库 -> 栅格数据源  GeoTIFF - Tagged Image File Format with Geographic information 进入添加栅格数据源的界面。

填写数据源名称,点击 URL右侧的浏览,选择要发布的数据,保存即可,现在已经为.tif数据新增了存储仓库,还需要发布图层。

数据 -> 图层 -> 添加新的资源 -> 选择存储.tif的存储仓库 -> 点击发布 -> 保存,.tif 遥感影像发布完成。

3-3    预览遥感影像

方法1:Tile Caching -> 切片图层 -> 找到要发布的数据,在预览 下选择一个方式即可预览。

方法2:数据 -> 图层预览 -> 找到要预览的图层,点击“常用格式”下的OpenLayers

预览效果如下:

posted @ 2024-06-05 21:31  Preyer  阅读(12)  评论(0编辑  收藏  举报