多源空间数据入库系统是一个基于Python开发的综合数据入库解决方案,支持矢量数据和栅格数据的入库处理。系统提供桌面GUI应用程序和命令行工具两种使用方式,具备坐标系转换、批量处理、元数据管理、实时日志监控等功能。采用现代化的数据库设计架构,提供完整的产品管理和数据治理能力。
- 现代化界面:基于PyQt6的图形界面,支持实时日志监控
- 矢量数据导入:支持多种矢量格式,图层选择,产品管理
- 栅格数据导入:支持多种栅格格式,元数据提取,MinIO存储
- 实时进度:导入过程实时监控,彩色日志显示
- 配置管理:目录选择,坐标系设置,产品配置
- 矢量数据处理:适合批量处理和自动化脚本调用
- 栅格数据处理:支持批量栅格数据入库
- Docker支持:提供容器化部署方案
- 多格式支持:ESRI Shapefile、GeoJSON、KML、GML、CSV、GPKG、OpenFileGDB等
- 坐标系转换:支持多种坐标系之间的自动转换(WGS84、CGCS2000、北京54等)
- 图层选择:支持多图层文件的图层级选择导入
- 批量处理:支持大批量矢量数据的高效入库
- 栅格入库:支持TIFF、GeoTIFF、JPEG2000等栅格格式
- 云存储集成:集成MinIO对象存储,支持栅格数据的分布式存储
- 元数据提取:自动提取栅格数据的地理元信息和统计信息
- 快速预览:支持栅格数据的快速预览图生成
- 元数据管理:自动提取和管理数据元信息,支持完整的数据生命周期管理
- 实时日志:彩色分级日志显示,支持字体大小调整
- 产品管理:完整的产品注册和管理体系
- 数据治理:内置数据质量检查、版本管理、安全控制
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 桌面GUI应用 │ │ 命令行工具 │ │ 配置文件 │
│ (PyQt6) │ │ (CLI) │ │ (JSON) │
│ desktop_app/ │ │ vector2db/ │ │ config/ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
└───────────────────────┼───────────────────────┘
│
┌───────────────────────┼───────────────────────┐
│ │ │
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 矢量数据处理 │ │ 栅格数据处理 │ │ 数据库存储 │
│ (vector2db) │ │ (raster2db) │ │ (PostgreSQL) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│
┌─────────────────┐
│ 对象存储 │
│ (MinIO) │
└─────────────────┘
oge-data-import/
├── desktop_app/ # 🖥️ 桌面GUI应用程序(主要界面)
│ ├── ui_components/ # UI组件
│ ├── config/ # 应用配置
│ ├── workers.py # 后台工作线程
│ ├── main_window.py # 主窗口
│ └── app_complete.py # 完整应用入口
├── vector2db/ # 🗺️ 矢量数据处理模块
│ ├── core/ # 核心功能
│ ├── config/ # 配置管理
│ ├── utils/ # 工具函数
│ └── import_cli.py # 命令行入口
├── raster2db/ # 📷 栅格数据处理模块
│ ├── raster2oge.py # 主要处理脚本
│ ├── raster2minio.py # MinIO存储
│ └── oge_config.json # 栅格配置
├── sql/ # 🗄️ 数据库脚本
├── Data/ # 📁 测试数据
├── docs/ # 📚 文档
└── tools/ # 🛠️ 辅助工具
- Python: 3.8+
- PostgreSQL: 12+ with PostGIS extension
- MinIO: Latest (用于栅格数据存储)
- 操作系统: Windows/Linux/macOS
- GUI依赖: PyQt6 (桌面应用需要)
-
克隆项目
git clone <repository-url> cd oge-data-import
-
安装依赖
# 桌面应用依赖(包含所有模块) pip install -r desktop_app/requirements_desktop.txt # 或分别安装各模块依赖 pip install -r vector2db/requirements.txt pip install -r raster2db/requirements.txt pip install -r desktop_app/requirements_desktop.txt
-
配置数据库
# 编辑矢量数据数据库配置 vim vector2db/config/config.json # 编辑栅格数据配置 vim raster2db/oge_config.json
-
初始化数据库
# 执行SQL脚本创建表结构 psql -d your_database -f sql/init_new_tables.sql psql -d your_database -f sql/oge_vector_fact.sql psql -d your_database -f sql/oge_vector_import_metadata.sql -
启动MinIO服务(栅格数据存储)
# 下载并启动MinIO docker run -p 9000:9000 -p 9001:9001 \ minio/minio server /data --console-address ":9001"
# 启动桌面应用程序
cd desktop_app
python app_complete.py
# 或使用调试模式
python run_debug.py
# 或使用conda环境
run_with_conda.bat矢量数据导入:
# 单文件导入
python -m vector2db.import_cli "Data/example.shp" --owner admin --layer-products "example:测试产品" --create-product
# 多图层文件导入
python -m vector2db.import_cli "Data/data.gdb" --owner admin --layer-products "图层1:产品1" "图层2:产品2" --create-product
# 指定坐标系
python -m vector2db.import_cli "Data/data.shp" --target_crs EPSG:4326 --owner admin --layer-products "data:产品" --create-product栅格数据导入:
# 栅格数据入库
cd raster2db
python raster2oge.py oge_config.json
# 或使用自定义配置
python raster2oge.py my_config.json系统包含两个核心配置文件,需要根据不同的部署环境进行相应修改:
文件位置: vector2db/config/config.json
配置内容:
{
"database": {
"host": "111.37.195.111",
"port": 7021,
"database": "oge",
"username": "oge",
"password": "ypfamily608"
}
}环境配置说明:
| 环境类型 | 配置示例 | 说明 |
|---|---|---|
| 本地开发 | "host": "localhost" |
本地PostgreSQL数据库 |
| 内网测试 | "host": "172.20.70.144" |
内网测试环境数据库 |
| 内网生产 | "host": "172.20.70.143" |
内网生产环境数据库 |
| 外网穿透 | "host": "111.37.195.111" |
通过内网穿透访问 |
文件位置: raster2db/oge_config.json
配置结构:
{
"postgre": {
"Jinan-public": {
"db_host": "111.37.195.111",
"db_port": 7011,
"db_user": "oge",
"db_password": "ypfamily608",
"describe": "济南内网穿透"
},
"Jinan": {
"db_host": "172.20.70.144",
"db_port": 30865,
"db_user": "oge",
"db_password": "ypfamily608",
"describe": "济南内网"
},
"Jinan-test": {
"db_host": "172.20.70.162",
"db_port": 30865,
"db_user": "oge",
"db_password": "ypfamily608",
"describe": "济南测试环境"
},
"local-test": {
"db_host": "localhost",
"db_port": 5432,
"db_user": "oge_user",
"db_password": "oge_password",
"db_name": "postgres",
"describe": "本地测试数据库"
}
},
"minio": {
"local": {
"server_host": "172.16.102.35:9000",
"access_key": "minioadmin",
"secret_key": "minioadmin",
"bucket_name": "remotesensing",
"describe": "海阳本地测试"
},
"Jinan": {
"server_host": "172.20.70.143:9006",
"access_key": "oge",
"secret_key": "ypfamily608",
"bucket_name": "ogebos",
"describe": "济南内网"
}
},
"basic": {
"root_dir": "D:/rsData/test",
"tmp_dir": "F:/temp/cog",
"postgre": "Jinan-test-2",
"minio": "local"
}
}环境配置说明:
| 环境名称 | 配置标识 | 适用场景 | 说明 |
|---|---|---|---|
| Jinan-public | "postgre": "Jinan-public" |
外网访问 | 通过内网穿透访问,端口7011 |
| Jinan | "postgre": "Jinan" |
内网生产 | 济南内网环境,端口30865 |
| Jinan-test | "postgre": "Jinan-test" |
内网测试 | 济南测试环境,端口30865 |
| Jinan-test-2 | "postgre": "Jinan-test-2" |
外网测试 | 外网测试环境,端口7021 |
| local-test | "postgre": "local-test" |
本地开发 | 本地PostgreSQL数据库 |
| 环境名称 | 配置标识 | 适用场景 | 说明 |
|---|---|---|---|
| local | "minio": "local" |
本地测试 | 海阳本地测试环境 |
| Jinan | "minio": "Jinan" |
内网生产 | 济南内网MinIO服务 |
| 配置项 | 说明 | 环境差异 |
|---|---|---|
| root_dir | 栅格数据根目录 | 根据实际数据存储位置调整 |
| tmp_dir | 临时文件目录 | 确保有足够磁盘空间 |
| postgre | 使用的数据库环境 | 根据上述环境配置选择 |
| minio | 使用的存储环境 | 根据上述环境配置选择 |
// vector2db/config/config.json
{
"database": {
"host": "localhost",
"port": 5432,
"database": "oge_dev",
"username": "oge_dev",
"password": "dev_password"
}
}
// raster2db/oge_config.json 的 basic 部分
{
"basic": {
"root_dir": "D:/dev/rsData",
"tmp_dir": "D:/dev/temp",
"postgre": "local-test",
"minio": "local"
}
}// vector2db/config/config.json
{
"database": {
"host": "172.20.70.162",
"port": 30865,
"database": "oge",
"username": "oge",
"password": "ypfamily608"
}
}
// raster2db/oge_config.json 的 basic 部分
{
"basic": {
"root_dir": "D:/test/rsData",
"tmp_dir": "D:/test/temp",
"postgre": "Jinan-test",
"minio": "local"
}
}// vector2db/config/config.json
{
"database": {
"host": "172.20.70.144",
"port": 30865,
"database": "oge",
"username": "oge",
"password": "ypfamily608"
}
}
// raster2db/oge_config.json 的 basic 部分
{
"basic": {
"root_dir": "D:/prod/rsData",
"tmp_dir": "D:/prod/temp",
"postgre": "Jinan",
"minio": "Jinan"
}
}# 测试PostgreSQL连接
psql -h <host> -p <port> -U <username> -d <database>
# 测试MinIO连接
python -c "
from minio import Minio
client = Minio('<server_host>', access_key='<access_key>', secret_key='<secret_key>')
buckets = client.list_buckets()
print('连接成功:', [b.name for b in buckets])
"# 检查JSON语法
python -m json.tool vector2db/config/config.json
python -m json.tool raster2db/oge_config.json桌面应用支持调试模式,编辑 desktop_app/config.py 进行配置:
# 调试模式配置
DEBUG_MODE = True
DEBUG_PORT = 5678
# 模块路径配置
VECTOR2DB_PATH = "../vector2db"系统采用现代化的数据库设计架构:
-
oge_data_product- 产品元数据表- 存储产品基本信息、空间范围、坐标系等
- 支持多语言描述、标签管理、发布控制
- 支持矢量和栅格两种数据类型
-
oge_vector_fact- 矢量数据关联表- 关联产品与具体数据表
- 记录数据存储位置和处理状态
-
oge_vector_import_metadata- 入库元数据表- 详细的文件元数据信息
- 包含文件编码、校验和、处理时间等
动态数据表采用统一命名格式:
oge_vec_{filename}_{layer}_{timestamp}_{uuid}
示例:oge_vec_s2_shandong_s2_shandong_20250731_083026_0f07d4
cd desktop_app
# 打包完整应用
pyinstaller oge_data_import.spec
# 打包矢量导入应用
pyinstaller oge_vector_import.spec
# 或使用快速构建脚本
quick_build_app_complete.bat
quick_build_vector2db.bat# 安装工具
pip install auto-py-to-exe
# 启动图形化打包工具
auto-py-to-exe# 构建镜像
docker build -t oge-vector-import .
# 运行容器
docker run -it --rm oge-vector-import
# 或使用构建脚本
build_vector2db.batcd raster2db
docker build -t oge-raster-import .
docker run -it --rm oge-raster-import-
环境准备
# 安装系统依赖 sudo apt-get install postgresql postgis python3-pip docker.io # 创建数据库用户 sudo -u postgres createuser oge sudo -u postgres createdb oge # 启动MinIO服务 docker run -d -p 9000:9000 -p 9001:9001 \ --name minio \ -e "MINIO_ROOT_USER=minioadmin" \ -e "MINIO_ROOT_PASSWORD=minioadmin" \ -v /data:/data \ minio/minio server /data --console-address ":9001"
-
应用部署
# 安装依赖 pip install -r desktop_app/requirements_desktop.txt # 配置环境变量 export OGE_DB_HOST=localhost export OGE_DB_PORT=5432 export OGE_DB_NAME=oge export OGE_DB_USER=oge export OGE_DB_PASSWORD=your_password export MINIO_HOST=localhost:9000 export MINIO_ACCESS_KEY=minioadmin export MINIO_SECRET_KEY=minioadmin
-
服务启动
# 启动桌面应用程序 cd desktop_app python app_complete.py
-
克隆项目
git clone <repository-url> cd oge-data-import
-
创建虚拟环境
# 使用conda conda env create -f environment.yml conda activate oge-data-import # 或使用venv python -m venv venv source venv/bin/activate # Linux/macOS venv\Scripts\activate # Windows
-
安装开发依赖
pip install -r requirements.txt pip install -r desktop_app/requirements_desktop.txt
桌面应用支持远程调试:
# 设置环境变量启用调试
export DEBUG_MODE=true
export DEBUG_PORT=5678
# 启动应用
cd desktop_app
python run_debug.py在VS Code中配置调试器:
{
"name": "桌面应用调试",
"type": "python",
"request": "attach",
"connect": {
"host": "localhost",
"port": 5678
}
}main_window.py- 主窗口类workers.py- 后台工作线程ui_components/- UI组件vector_data_widget.py- 矢量数据组件raster_data_widget.py- 栅格数据组件data_type_selector.py- 数据类型选择器
core/- 核心功能file_validate.py- 文件验证file_analyze.py- 文件分析file_split.py- 文件拆分crs_transform.py- 坐标系转换data_import.py- 数据导入
config/- 配置管理utils/- 工具函数
raster2oge.py- 主要处理脚本raster2minio.py- MinIO存储raster2postgre.py- 数据库存储oge_config.py- 配置管理
# 运行所有测试
python -m pytest tests/
# 运行特定模块测试
python -m pytest vector2db/tests/
python -m pytest raster2db/tests/
# 生成测试报告
python -m pytest --html=report.html tests/# 桌面应用功能测试
cd desktop_app
python run_debug.py
# 矢量数据处理测试
cd vector2db
python import_cli.py "../Data/example.shp" --owner admin --layer-products "example:测试产品"
# 栅格数据处理测试
cd raster2db
python raster2oge.py oge_config.json- 数据库: PostgreSQL + PostGIS(空间数据库)
- 对象存储: MinIO(栅格数据存储)
- 开发语言: Python 3.8+
- GUI框架: PyQt6(桌面应用)
- 核心库:
- GeoPandas - 地理数据处理
- SQLAlchemy - 数据库ORM
- PyProj - 坐标系转换
- psycopg2 - PostgreSQL驱动
- Fiona - 矢量文件读写
- GDAL/OGR - 栅格和矢量数据处理
- MinIO-py - 对象存储客户端
- ESRI Shapefile (.shp, .dbf, .shx, .prj)
- GeoJSON (.geojson)
- GeoPackage (.gpkg)
- KML/KMZ (.kml/.kmz)
- File Geodatabase (.gdb)
- 其他OGR支持格式
- GeoTIFF (.tif, .tiff)
- JPEG2000 (.jp2)
- IMG (.img)
- 其他GDAL支持格式
- 角色权限: 管理员、操作员、查看者
- 数据分级: 公开、内部、机密
- 操作审计: 记录所有数据操作
- 存储加密支持
- 传输加密(HTTPS)
- 备份加密保护
- Fork 项目
- 创建功能分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 创建 Pull Request
- 遵循 PEP 8 代码风格
- 添加适当的注释和文档字符串
- 编写单元测试
- 确保所有测试通过
feat: 新功能
fix: 修复bug
docs: 文档更新
style: 代码格式调整
refactor: 代码重构
test: 测试相关
chore: 构建过程或辅助工具的变动
- 🔧 修复矢量数据导入时的图层选择问题
- 🖥️ 优化桌面应用UI界面
- 📊 改进实时日志显示
- 🗄️ 更新数据库表结构
- 🐳 优化Docker部署配置
- 🖥️ 新增桌面GUI应用程序(基于PyQt6)
- 📷 新增栅格数据入库功能
- ☁️ 集成MinIO对象存储
- 🎨 实时彩色日志显示
- 🔧 动态字体大小调整
- 📊 改进的用户界面和体验
- ✨ 初始版本发布
- 🗺️ 支持多种矢量格式导入
- 🔄 自动坐标系转换
- 📊 完整元数据管理
- 🏷️ 产品注册和管理
- 🛡️ 数据质量检查
详细更新历史请参考 CHANGELOG.md。
本项目采用 MIT 许可证,详见 LICENSE 文件。
如有问题或建议,请通过以下方式联系:
- 📧 邮箱: [your-email@example.com]
- 🐛 问题反馈: Issues
- 💬 讨论区: Discussions
- 📖 文档: docs/
感谢以下开源项目的支持:
- PostGIS - 空间数据库扩展
- GeoPandas - 地理数据处理
- Fiona - 矢量文件读写
- PyProj - 坐标系转换
- GDAL/OGR - 地理空间数据处理
- MinIO - 高性能对象存储
- PyQt6 - Python GUI框架
- 🎯 一站式解决方案:同时支持矢量和栅格数据处理
- 🖥️ 现代化界面:基于PyQt6的桌面应用,用户体验优秀
- 📊 实时监控:彩色分级日志,处理过程一目了然
- ☁️ 云原生:集成对象存储,支持分布式部署
- 🔧 高度可配置:灵活的配置系统,满足不同需求
- 🛡️ 企业级:完整的数据治理和质量控制
- 🐳 容器化支持:提供Docker部署方案
- 📦 打包工具:支持PyInstaller和auto-py-to-exe打包
注意: 本项目正在积极开发中,API可能会有变化。建议在生产环境使用前充分测试。
⭐ 如果这个项目对你有帮助,请给我们一个星标!