#!/usr/bin/env python3 """完整测试 Titiler Mars 瓦片服务的所有功能""" import sys import requests from pathlib import Path # 默认数据路径 DEFAULT_DATA = ( Path("/data") / "mola/Mars_MGS_MOLA_ClrShade_merge_global_463m.ptiff" ) # 默认数据路径 DEFAULT_DATA = ( Path("/data") / "moric_global/HX1_GRAS_MoRIC_DOM_076m_Global_00N00E_A.ptiff" ) def test_server(base_url: str, data_path: str): """测试服务器的各个端点""" print(f"🔍 测试 Mars Titiler 服务器") print(f" 服务地址: {base_url}") print(f" 数据文件: {data_path}\n") print("=" * 70) tests = [ { "name": "1. 获取数据信息 (/info)", "url": f"{base_url}/info?url={data_path}", "show_keys": ["width", "height", "count", "bounds", "minzoom", "maxzoom"], }, { "name": "2. 获取 TileJSON (/MarsCylindrical/tilejson.json)", "url": f"{base_url}/MarsCylindrical/tilejson.json?url={data_path}", "show_keys": ["tilejson", "minzoom", "maxzoom", "bounds", "tiles"], }, { "name": "3. 获取瓦片 (/tiles/MarsCylindrical/0/0/0.png)", "url": f"{base_url}/tiles/MarsCylindrical/0/0/0.png?url={data_path}", "binary": True, }, { "name": "4. 获取预览图 (/preview.png)", "url": f"{base_url}/preview.png?url={data_path}&max_size=256", "binary": True, }, ] all_passed = True for test in tests: print(f"\n{test['name']}") print(f" URL: {test['url']}") try: response = requests.get(test["url"], timeout=10) if response.status_code == 200: print(f" ✓ 状态: {response.status_code} OK") if test.get("binary"): print(f" ✓ 大小: {len(response.content):,} bytes") print(f" ✓ 类型: {response.headers.get('content-type')}") else: data = response.json() if "show_keys" in test: for key in test["show_keys"]: if key in data: value = data[key] if isinstance(value, list) and len(str(value)) > 60: print(f" - {key}: [列表长度 {len(value)}]") elif isinstance(value, str) and len(value) > 60: print(f" - {key}: {value[:60]}...") else: print(f" - {key}: {value}") else: print(f" ✗ 失败: HTTP {response.status_code}") print(f" 错误: {response.text[:200]}") all_passed = False except Exception as e: print(f" ✗ 异常: {e}") all_passed = False print("\n" + "=" * 70) if all_passed: print("✓ 所有测试通过!") print("\n🎉 Mars Titiler 瓦片服务运行正常!") else: print("✗ 部分测试失败") return 1 print("\n📖 其他可用端点:") print(f" - API 文档: {base_url}/docs") print(f" - 地图查看器: {base_url}/MarsCylindrical/map.html?url={data_path}") print(f" - 统计信息: {base_url}/statistics?url={data_path}") return 0 if __name__ == "__main__": if len(sys.argv) > 1: base_url = sys.argv[1] else: base_url = "http://localhost:8001" if len(sys.argv) > 2: data_path = sys.argv[2] else: data_path = str(DEFAULT_DATA) # if not Path(data_path).exists(): # print(f"❌ 错误: 数据文件不存在: {data_path}") # sys.exit(1) # 测试服务器是否在运行 try: requests.get(f"{base_url}/", timeout=2) except requests.exceptions.RequestException: print(f"❌ 错误: 无法连接到服务器 {base_url}") print("请先启动服务器: ./start_server.sh 或 uvicorn app:app") sys.exit(1) sys.exit(test_server(base_url, data_path))