refactor: 重构项目结构,将geo_tools重命名为app并更新相关引用
- 将主包名从geo_tools改为app - 更新所有模块中的引用路径 - 迁移并更新测试用例 - 添加项目规则文档 - 保持原有功能不变,仅进行结构调整
This commit is contained in:
5
app/config/__init__.py
Normal file
5
app/config/__init__.py
Normal file
@@ -0,0 +1,5 @@
|
||||
"""geo_tools.config 包 —— 全局配置层。"""
|
||||
|
||||
from app.config.settings import GeoToolsSettings, settings
|
||||
|
||||
__all__ = ["GeoToolsSettings", "settings"]
|
||||
43
app/config/project_enum.py
Normal file
43
app/config/project_enum.py
Normal file
@@ -0,0 +1,43 @@
|
||||
"""
|
||||
枚举类
|
||||
"""
|
||||
from enum import Enum, unique
|
||||
|
||||
# 坐标系枚举
|
||||
@unique
|
||||
class CRS(Enum):
|
||||
WGS84 = "EPSG:4326"
|
||||
CGCS2000 = "EPSG:4490"
|
||||
WEB_MERCATOR = "EPSG:3857"
|
||||
CGCS2000_3_DEGREE_ZONE_25 = "EPSG:4513"
|
||||
CGCS2000_3_DEGREE_ZONE_26 = "EPSG:4514"
|
||||
CGCS2000_3_DEGREE_ZONE_27 = "EPSG:4515"
|
||||
CGCS2000_3_DEGREE_ZONE_28 = "EPSG:4516"
|
||||
CGCS2000_3_DEGREE_ZONE_29 = "EPSG:4517"
|
||||
CGCS2000_3_DEGREE_ZONE_30 = "EPSG:4518"
|
||||
CGCS2000_3_DEGREE_ZONE_31 = "EPSG:4519"
|
||||
CGCS2000_3_DEGREE_ZONE_32 = "EPSG:4520"
|
||||
CGCS2000_3_DEGREE_ZONE_33 = "EPSG:4521"
|
||||
CGCS2000_3_DEGREE_ZONE_34 = "EPSG:4522"
|
||||
CGCS2000_3_DEGREE_ZONE_35 = "EPSG:4523"
|
||||
CGCS2000_3_DEGREE_ZONE_36 = "EPSG:4524"
|
||||
CGCS2000_3_DEGREE_ZONE_37 = "EPSG:4525"
|
||||
CGCS2000_3_DEGREE_ZONE_38 = "EPSG:4526"
|
||||
CGCS2000_3_DEGREE_ZONE_39 = "EPSG:4527"
|
||||
CGCS2000_3_DEGREE_ZONE_40 = "EPSG:4528"
|
||||
CGCS2000_3_DEGREE_ZONE_41 = "EPSG:4529"
|
||||
CGCS2000_3_DEGREE_ZONE_42 = "EPSG:4530"
|
||||
CGCS2000_3_DEGREE_ZONE_43 = "EPSG:4531"
|
||||
CGCS2000_3_DEGREE_ZONE_44 = "EPSG:4532"
|
||||
CGCS2000_3_DEGREE_ZONE_45 = "EPSG:4533"
|
||||
CGCS2000_6_DEGREE_ZONE_13 = "EPSG:4491"
|
||||
CGCS2000_6_DEGREE_ZONE_14 = "EPSG:4492"
|
||||
CGCS2000_6_DEGREE_ZONE_15 = "EPSG:4493"
|
||||
CGCS2000_6_DEGREE_ZONE_16 = "EPSG:4494"
|
||||
CGCS2000_6_DEGREE_ZONE_17 = "EPSG:4495"
|
||||
CGCS2000_6_DEGREE_ZONE_18 = "EPSG:4496"
|
||||
CGCS2000_6_DEGREE_ZONE_19 = "EPSG:4497"
|
||||
CGCS2000_6_DEGREE_ZONE_20 = "EPSG:4498"
|
||||
CGCS2000_6_DEGREE_ZONE_21 = "EPSG:4499"
|
||||
CGCS2000_6_DEGREE_ZONE_22 = "EPSG:4500"
|
||||
CGCS2000_6_DEGREE_ZONE_23 = "EPSG:4501"
|
||||
98
app/config/settings.py
Normal file
98
app/config/settings.py
Normal file
@@ -0,0 +1,98 @@
|
||||
"""
|
||||
geo_tools.config.settings
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
全局配置,通过 Pydantic BaseSettings 从环境变量 / .env 文件加载。
|
||||
|
||||
使用方式
|
||||
--------
|
||||
>>> from geo_tools.config.settings import settings
|
||||
>>> print(settings.default_crs)
|
||||
'EPSG:4326'
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import multiprocessing
|
||||
from pathlib import Path
|
||||
|
||||
from pydantic import field_validator, model_validator
|
||||
from pydantic_settings import BaseSettings, SettingsConfigDict
|
||||
|
||||
|
||||
class GeoToolsSettings(BaseSettings):
|
||||
"""全局运行时配置。
|
||||
|
||||
所有字段均可通过前缀为 ``GEO_TOOLS_`` 的环境变量覆盖,
|
||||
或在项目根目录创建 ``.env`` 文件(参考 ``.env.example``)。
|
||||
"""
|
||||
|
||||
model_config = SettingsConfigDict(
|
||||
env_prefix="GEO_TOOLS_",
|
||||
env_file=".env",
|
||||
env_file_encoding="utf-8",
|
||||
case_sensitive=False,
|
||||
extra="ignore",
|
||||
)
|
||||
|
||||
# ── 目录配置 ──────────────────────────────────────────────
|
||||
output_dir: Path = Path("output")
|
||||
"""处理结果输出目录(相对路径相对于当前工作目录)。"""
|
||||
|
||||
log_dir: Path = Path("logs")
|
||||
"""日志文件目录。"""
|
||||
|
||||
# ── 坐标系配置 ────────────────────────────────────────────
|
||||
default_crs: str = "EPSG:4490"
|
||||
"""默认地理坐标系,使用 EPSG 代码字符串。
|
||||
常见值:
|
||||
- ``EPSG:4326`` — WGS84 经纬度
|
||||
- ``EPSG:4490`` — CGCS2000 经纬度(中国国家标准)
|
||||
- ``EPSG:3857`` — Web Mercator
|
||||
"""
|
||||
|
||||
# ── 日志配置 ──────────────────────────────────────────────
|
||||
log_level: str = "ERROR"
|
||||
"""日志等级:DEBUG / INFO / WARNING / ERROR / CRITICAL。"""
|
||||
|
||||
log_to_file: bool = True
|
||||
"""是否同时将日志写出到文件。"""
|
||||
|
||||
# ── 性能配置 ──────────────────────────────────────────────
|
||||
max_workers: int = 0
|
||||
"""并行处理最大 CPU 核数,0 表示自动检测(使用 CPU 核数 - 1)。"""
|
||||
|
||||
# ── 校验器 ────────────────────────────────────────────────
|
||||
|
||||
@field_validator("log_level")
|
||||
@classmethod
|
||||
def validate_log_level(cls, v: str) -> str:
|
||||
allowed = {"DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"}
|
||||
upper = v.upper()
|
||||
if upper not in allowed:
|
||||
raise ValueError(f"log_level 必须是 {allowed} 之一,收到:{v!r}")
|
||||
return upper
|
||||
|
||||
@field_validator("default_crs")
|
||||
@classmethod
|
||||
def validate_crs(cls, v: str) -> str:
|
||||
# 简单前缀校验,完整校验在 validators.py 中通过 pyproj 完成
|
||||
v = v.strip()
|
||||
if not v:
|
||||
raise ValueError("default_crs 不能为空")
|
||||
return v
|
||||
|
||||
@model_validator(mode="after")
|
||||
def resolve_max_workers(self) -> "GeoToolsSettings":
|
||||
if self.max_workers <= 0:
|
||||
cpu_count = multiprocessing.cpu_count()
|
||||
self.max_workers = max(1, cpu_count - 1)
|
||||
return self
|
||||
|
||||
def ensure_dirs(self) -> None:
|
||||
"""创建输出和日志目录(幂等)。"""
|
||||
self.output_dir.mkdir(parents=True, exist_ok=True)
|
||||
self.log_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
|
||||
# 模块级单例,项目内统一引用
|
||||
settings = GeoToolsSettings()
|
||||
Reference in New Issue
Block a user