Files
geo_tools/README.md
2026-03-04 17:07:07 +08:00

129 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# geo_tools
> 专业地理信息数据处理工具库 —— 基于 geopandas / shapely / fiona
[![Python](https://img.shields.io/badge/python-3.10%2B-blue)](https://www.python.org)
[![License: MIT](https://img.shields.io/badge/license-MIT-green)](LICENSE)
---
## 功能特性
- **统一 IO 接口**:一行代码读写 Shapefile、GeoJSON、GeoPackage、**File Geodatabase (GDB)**、KML、CSV 等格式
- **核心几何运算**:基于 Shapely 2.x 的缓冲区、集合运算、有效性检查与自动修复
- **坐标系处理**重投影、CRS 信息查询、批量坐标转换,内置中国常用 CRS 常量
- **空间分析**:叠置分析、最近邻、按位置选择、面积加权均值、属性统计汇总
- **配置驱动**:通过 `.env` 或环境变量控制输出路径、日志级别、默认 CRS 等
- **栅格预留接口**:为 rasterio 集成预留扩展点
## 项目结构
```
geo_tools/
├── geo_tools/ # 主包
│ ├── config/ # Pydantic BaseSettings 全局配置
│ ├── core/ # 核心处理vector / geometry / projection / raster
│ ├── io/ # 数据读写readers / writers含 GDB
│ ├── analysis/ # 空间分析spatial_ops / stats
│ └── utils/ # 通用工具logger / validators / config
├── scripts/ # 独立处理脚本
├── tests/ # pytest 测试套件
├── data/sample/ # 示例数据GeoJSON
├── output/ # 处理结果输出目录
├── logs/ # 日志文件目录
├── docs/ # 文档
└── pyproject.toml # 项目配置与依赖
```
## 快速开始
### 安装依赖
```bash
# 推荐使用 conda 安装地理库(避免 GDAL 编译问题)
conda install -c conda-forge geopandas shapely fiona pyproj
# 然后安装本项目(开发模式)
pip install -e ".[dev]"
```
### 基本使用
```python
import geo_tools
# 读取矢量数据(自动识别格式)
gdf = geo_tools.read_vector("data/sample/sample_points.geojson")
# 读写 File Geodatabase
layers = geo_tools.list_gdb_layers("path/to/data.gdb")
gdf = geo_tools.read_gdb("path/to/data.gdb", layer="my_layer")
geo_tools.write_gdb(gdf, "output/result.gdb", layer="result")
# 坐标系转换
gdf_proj = geo_tools.reproject(gdf, "EPSG:3857")
# 缓冲区分析
from geo_tools.core.geometry import buffer_geometry
buffered_geom = buffer_geometry(gdf.geometry[0], distance=1000)
# 空间叠置
from geo_tools.analysis.spatial_ops import overlay
result = geo_tools.overlay(layer_a, layer_b, how="intersection")
# 面积加权均值
from geo_tools.analysis.stats import area_weighted_mean
result = area_weighted_mean(polygon_gdf, value_col="soil_ph", group_col="region")
```
### 配置
复制 `.env.example``.env` 并按需修改:
```bash
GEO_TOOLS_OUTPUT_DIR=D:/output
GEO_TOOLS_DEFAULT_CRS=EPSG:4490
GEO_TOOLS_LOG_LEVEL=DEBUG
```
## 运行测试
```bash
# 运行全部测试
pytest tests/ -v
# 运行带覆盖率报告
pytest tests/ -v --cov=geo_tools --cov-report=html
```
## 运行示例脚本
```bash
python scripts/example_workflow.py
```
## GDB 支持说明
本项目通过 `fiona>=1.9``OpenFileGDB` 驱动读写 Esri File Geodatabase`.gdb`)。
| 操作 | 驱动 | 要求 |
|------|------|------|
| 读取 GDB | `OpenFileGDB` | fiona >= 1.9(内置) |
| 写出 GDB | `OpenFileGDB` | fiona >= 1.9(内置) |
| 编辑 GDB高级 | `FileGDB` | 需要 ESRI FileGDB API |
```python
# 列出所有图层
layers = geo_tools.list_gdb_layers("data.gdb")
# 读取指定图层
gdf = geo_tools.read_gdb("data.gdb", layer="土地利用", crs="EPSG:4490")
# 写出到 GDB新建或追加图层
geo_tools.write_gdb(result_gdf, "output.gdb", layer="分析结果", mode="w")
```
## 许可证
MIT License