2026-02-25 11:38:05 +08:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
"""完整测试 Titiler Mars 瓦片服务的所有功能"""
|
|
|
|
|
|
|
|
|
|
import sys
|
|
|
|
|
import requests
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
|
|
# 默认数据路径
|
|
|
|
|
DEFAULT_DATA = (
|
2026-02-25 16:09:25 +08:00
|
|
|
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"
|
2026-02-25 11:38:05 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
2026-02-25 16:09:25 +08:00
|
|
|
# if not Path(data_path).exists():
|
|
|
|
|
# print(f"❌ 错误: 数据文件不存在: {data_path}")
|
|
|
|
|
# sys.exit(1)
|
2026-02-25 11:38:05 +08:00
|
|
|
|
|
|
|
|
# 测试服务器是否在运行
|
|
|
|
|
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))
|