RFS_Server_06 上传并发布数据

news/2025/3/16 14:42:12/文章来源:https://www.cnblogs.com/preyer/p/18233877

操作描述:云服务器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 commandogr2ogr_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 commandtry: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 commandogr2ogr_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 failureslayer_name  # Specify the layer name in the GeoPackage]# Run the commandtry: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 layersgpkg = ogr.Open(geopackage_path)if gpkg is None:print(f"Failed to open GeoPackage: {geopackage_path}")return# Iterate over each layer in the GeoPackagefor 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 commandogr2ogr_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 failureslayer_name  # Specify the layer name in the GeoPackage]# Run the commandtry: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

预览效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/720562.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vivado与modelsim联合仿真

写在前面:联合仿真需要版本对应,我的2020的modelsim和2020的vivado是可以用的。如果不对应,下边会编译报错。 第一步,编译仿真库文件。点击菜单栏Tools-->Compile Sim Libary,第一行Simulator选择Modelsim接下来Family选择你需要的器件对应的Family。Compiled library …

深度学习--风格迁移 原理以及实现--84

目录1. 简介4. 损失函数 参考链接:https://blog.csdn.net/ssshyeong/article/details/127092354 1. 简介 Image Style Transfer Using Convolutional Neural Networks:Gram矩阵(CVPR2016) 链接 Texture Synthesis Using Convolutional Neural Networks 图像经过卷积层后得到的…

Body AdvancedBrep Geometry

Body AdvancedBrep Geometry Body Brep Geometry是通过边界表示模型(包括NURBS)表示产品的三维形状。应使用保持该几何表示的IfcShapeResentation的以下属性值:IfcShapeRepresentation.RepresentationIdentifier = Body IfcShapeRepresentation.RepresentationType = Advanc…

node.js + mysql实现基本的增删改查功能(保姆级教程---2优化版)

node.js + mysql实现基本的增删改查(保姆级教程---2优化版)上一个实现对增删改查功能都写在同一个文件里,代码过于冗余,我认为可以优化,分开写在不同文件里面,使得更加直观。废话不多说,直接进入主题:对之前的代码进行抽离:db.js文件(用于数据库的连接,并导出连接供…

虚幻中实现本地双人的输入设备分别控制需要的Pawn

想要实现双人成行游戏中的双输入设备(双输入设备指的是一个键鼠和一个手柄,或者两个手柄)分别控制玩家1和玩家2,同时可以动态插拔设备切换对应的Pawn的控制权;本文是对探索并实现此功能的一个解决思路记录。1、前期准备和知识点梳理 1.1 本地多玩家 LocalPlayer 平常我们运…

HiPPO: Recurrent Memory with Optimal Polynomial Projections

目录概Motivation代码Gu A., Dao T., Ermon S., Rudra A. and Re C. HiPPO: Recurrent memory with optimal polynomial projections. NIPS, 2021.概 看下最近很火的 Mamba 的前身. 本文其实主要介绍的是一个如何建模历史信息在正交基上的稀疏的变化情况.Motivation对于一个函数…

存储引擎及特点、约束条件、严格模式、基本字段类型(整型、浮点型、字符串、日期时间、枚举和集合)

【一】存储引擎在平常我们处理的文件格式有很多,并且针对不同的文件格式会有对应不同的存储方式和处理机制 针对不同的数据应该有对应不同的处理机制 存储引擎就是不同的处理机制。# 查看所有引擎 show engines;四种主要的存储引擎 (1)Innodb引擎是MySQL5.5版本之后的默认存…

sickos1.1-cms

sickos1.1-cms主机发现和nmap扫描 nmap -sn 192.68.56.0/24靶机ip:192.168.56.105 nmap -sT --min-rate 10000 192.168.56.105PORT STATE SERVICE 22/tcp open ssh 3128/tcp open squid-http 8080/tcp closed http-proxynmap -sT -sV -sC -O -p22,3128,8080 192.16…

自动化类级别前后置和函数级别前后置的区别

一、函数级别的前后置,格式如下: 二、类函数级别的前后置如下: 三、总结: 1、函数级别的用例执行一个用例时,都会执行一遍;类级别的前后置不管用例是多少个,只在执行用例时执行一次。 2、所以根据用例的需要,适当的选择是类级别的前后置还是函数级别的前置后。

Linux容器架构

1.Iaas:基础设施即服务 Infrastructure-as-a-Service Paas:平台即服务 Platform-as-a-Service Saas:软件即服务 Software-as-a-Service Caas:容器即服务 介于IAAS和PAAS IAAS,PAAS,SAAS这些服务,用于帮助人们更快实现目标(搭建环境,使用产品) 从左到右,人们需要管理与维护的地方…

内网穿透教程

内网穿透教程 本文介绍如何使用 FRP(Fast Reverse Proxy)工具实现内网穿透,包括配置 Azure 公网 IP、安装 Docker 和 FRP,以及在内网服务器上配置和运行 FRP 客户端。 一、配置公网 IP 1. 申请 Azure 公网 IP登录到 Azure 门户。 创建一个新的虚拟机实例,建议使用1G内存的…