TXT / Excel(CSV) / SHP 三种格式任意互转
支持 WGS84 / CGCS2000 / Xian80 / Beijing54 / Web Mercator 坐标系转换
由 Mapo 🗺️ 自动生成
80 lines
2.1 KiB
Python
80 lines
2.1 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
CoordConverter — Mercator Suite Entry Point
|
|
Reads PARAM_* env vars set by agc, runs conversion, outputs SUITE_OUTPUT JSON.
|
|
"""
|
|
import os
|
|
import sys
|
|
import json
|
|
import traceback
|
|
|
|
# Ensure suite dir is on path
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
|
|
from converter.workflow import ConversionWorkflow
|
|
|
|
|
|
def get_param(name: str, default: str | None = None) -> str:
|
|
val = os.environ.get(f"PARAM_{name}")
|
|
if val:
|
|
return val.strip()
|
|
if default is not None:
|
|
return default
|
|
raise ValueError(f"缺少必填参数: {name}")
|
|
|
|
|
|
def parse_epsg(raw: str) -> str | None:
|
|
"""Normalize EPSG string. '4326' → 'EPSG:4326'. 'auto' / '' → None."""
|
|
raw = raw.strip()
|
|
if not raw or raw.lower() in ("auto", "none", ""):
|
|
return None
|
|
if raw.upper().startswith("EPSG:"):
|
|
return raw.upper()
|
|
return f"EPSG:{raw}"
|
|
|
|
|
|
def main():
|
|
input_file = get_param("INPUT_FILE")
|
|
output_file = get_param("OUTPUT_FILE")
|
|
from_crs_raw = get_param("FROM_CRS", "auto")
|
|
to_crs_raw = get_param("TO_CRS", "EPSG:4490")
|
|
output_format = get_param("OUTPUT_FORMAT", "auto")
|
|
|
|
# Validate input
|
|
if not os.path.isfile(input_file):
|
|
raise FileNotFoundError(f"输入文件不存在: {input_file}")
|
|
|
|
from_crs = parse_epsg(from_crs_raw)
|
|
to_crs = parse_epsg(to_crs_raw)
|
|
|
|
# Ensure output dir exists
|
|
out_dir = os.path.dirname(output_file)
|
|
if out_dir:
|
|
os.makedirs(out_dir, exist_ok=True)
|
|
|
|
wf = ConversionWorkflow()
|
|
result = wf.run(
|
|
input_path=input_file,
|
|
output_path=output_file,
|
|
from_crs=from_crs,
|
|
to_crs=to_crs,
|
|
output_format=output_format,
|
|
)
|
|
|
|
# Mercator standard output
|
|
print("=== SUITE_OUTPUT ===")
|
|
print(json.dumps(result, ensure_ascii=False, indent=2))
|
|
print("=== END_SUITE_OUTPUT ===")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
main()
|
|
except Exception as e:
|
|
print(json.dumps({
|
|
"success": False,
|
|
"error": str(e),
|
|
"traceback": traceback.format_exc(),
|
|
}, ensure_ascii=False))
|
|
sys.exit(1)
|