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 gdal
l或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
预览效果如下: