v1STABLE

API 文档

SunTrace3D 合作伙伴 API 允许您生成 HD 3D 城市模型、计算太阳能产量,并在您的网站上嵌入交互式 3D 查看器。所有端点使用 JSON 和标准 HTTP 方法。

以 Markdown 格式查看(机器可读)
1

概述

SunTrace3D API 是一个用于编程访问 3D 城市模型生成和太阳能计算的 RESTful 服务。API 专为希望将太阳能分析集成到自己的应用程序、网站或工作流程中的合作伙伴设计。

基础 URL

https://suntrace3d.com/api/v1
REST API
JSON 请求/响应
Bearer 认证
API 密钥认证
HD 画质
所有 API 模型均为 HD

可用端点

POST/api/v1/models生成新的 HD 3D 模型
GET/api/v1/models/:id检查模型生成状态
POST/api/solar/calculate计算太阳能产量
GET/embed可嵌入 3D 查看器(iframe)
GET/api/health健康检查(无需认证)
Partner portal showing API keys and usage statistics
合作伙伴门户 — 管理 API 密钥、查看使用统计、获取嵌入代码
2

认证

所有 API 请求需要通过 Authorization 头中的 Bearer 令牌进行认证。API 密钥通过合作伙伴门户管理。

获取 API 密钥

  1. 1
    创建账户
    如果还没有账户,请在 /auth/signup 注册。
  2. 2
    升级到 Pro
    API 访问需要 Pro 订阅。从您的账户设置中升级。
  3. 3
    生成 API 密钥
    访问合作伙伴门户并点击"创建密钥"。请立即复制密钥 — 不会再次显示。
  4. 4
    在请求中使用
    在所有 API 请求中将密钥作为 Bearer 令牌包含。
认证头bash
curl -H "Authorization: Bearer st_live_abc123def456..." \
  https://suntrace3d.com/api/v1/models

请保管好您的 API 密钥

切勿在客户端 JavaScript、公共仓库或前端代码中暴露 API 密钥。如果密钥泄露,请立即从合作伙伴门户撤销并创建新密钥。

3

生成 3D 模型

请求为特定地理位置生成 HD 3D 城市模型。模型异步生成 — 轮询状态端点以检查何时准备就绪。

POST/api/v1/models

请求体

latitudenumberrequired中心点纬度(-90 到 90)
longitudenumberrequired中心点经度(-180 到 180)
radiusKmnumber建模区域半径(km)(默认: 0.3)

响应

idstringrequired用于状态轮询的唯一模型标识符
statusstringrequired"pending" | "processing" | "ready" | "failed"
modelUrlstringGLB 模型文件的 URL(就绪时)
progressnumber生成进度 0-100(处理中时)
stepstring当前生成步骤描述
请求bash
curl -X POST https://suntrace3d.com/api/v1/models \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "latitude": 44.8699,
    "longitude": 13.8420,
    "radiusKm": 0.3
  }'
响应(待处理)json
{
  "id": "hd_44.8699_13.8420_0.3",
  "status": "pending"
}
响应(就绪)json
{
  "id": "hd_44.8699_13.8420_0.3",
  "status": "ready",
  "modelUrl": "https://s3.eu-central-1.amazonaws.com/suntrace-models/hd_44.8699_13.8420_0.3/scene.glb"
}

模型缓存

如果相同位置和半径的模型已经生成,API 会立即返回缓存的结果,状态为 status: "ready"。模型在 S3 中缓存 30 天。缓存结果不收费。

API request generating a 3D model
API 异步生成 HD 3D 模型 — 轮询状态端点直到就绪
4

检查模型状态

轮询此端点以检查模型生成请求的状态。模型经历多个阶段: pending → processing → ready。

GET/api/v1/models/:id
请求bash
curl https://suntrace3d.com/api/v1/models/hd_44.8699_13.8420_0.3 \
  -H "Authorization: Bearer YOUR_API_KEY"
响应(处理中)json
{
  "id": "hd_44.8699_13.8420_0.3",
  "status": "processing",
  "progress": 65,
  "step": "Generating textures..."
}
响应(就绪)json
{
  "id": "hd_44.8699_13.8420_0.3",
  "status": "ready",
  "modelUrl": "https://s3.eu-central-1.amazonaws.com/suntrace-models/hd_44.8699_13.8420_0.3/scene.glb",
  "progress": 100,
  "step": null
}

状态值

pending任务已排队,等待工作进程接取
processing模型正在生成。检查 progress 字段获取百分比。
ready模型已就绪。modelUrl 字段包含下载 URL。
failed生成失败。您可以通过创建新请求重试。

轮询建议

建议每 5-10 秒轮询一次。典型的生成时间为 30-120 秒,取决于区域大小和服务器负载。progress 字段提供百分比(0-100)以在您的 UI 中显示进度指示器。

5

计算太阳能

计算特定面板配置和位置的年度太阳能产量。此端点使用 PVGIS(光伏地理信息系统)卫星数据获取精确的辐照值。

POST/api/solar/calculate

请求体

latitudenumberrequired位置纬度
longitudenumberrequired位置经度
tiltDegnumberrequired面板倾斜角(度)(0-90)
azimuthDegnumberrequired面板方位角(度)(0=北,180=南)
panelAreaM2numberrequired面板总面积(平方米)
panelEfficiencynumberrequired面板效率(0.0 - 1.0,通常 0.18-0.22)
shadingLossFractionnumber遮蔽损失系数(0.0-1.0,默认: 0)

响应

annualYieldKwhnumberrequired估计年度能源产量(kWh)
peakPowerKwnumberrequired峰值功率输出(kW)
specificYieldnumberrequired比能量产出(kWh/kWp)
monthlyKwhnumber[]required12 个月的月度 kWh 值数组
sourcestringrequired数据源标识符("pvgis")
请求bash
curl -X POST https://suntrace3d.com/api/solar/calculate \
  -H "Content-Type: application/json" \
  -d '{
    "latitude": 44.8699,
    "longitude": 13.8420,
    "tiltDeg": 35,
    "azimuthDeg": 180,
    "panelAreaM2": 20,
    "panelEfficiency": 0.20,
    "shadingLossFraction": 0.05
  }'
响应json
{
  "annualYieldKwh": 4982,
  "peakPowerKw": 4.0,
  "specificYield": 1246,
  "monthlyKwh": [248, 305, 412, 465, 522, 548, 562, 530, 445, 368, 280, 232],
  "source": "pvgis"
}

无需认证

太阳能计算端点公开可用,不需要 API 密钥。它使用欧盟委员会联合研究中心维护的 PVGIS 公共 API。

Solar energy calculation API response
太阳能计算 API 返回年度产量、峰值功率和月度明细
6

嵌入查看器

使用 iframe 在您的网站上嵌入交互式 3D 太阳能查看器。嵌入查看器包含阴影模拟的时间控件,支持桌面和移动设备。

嵌入 URL 参数

latnumberrequired要显示位置的纬度
lngnumberrequired要显示位置的经度
keystringrequired用于认证的 API 密钥
基本嵌入代码html
<iframe
  src="https://suntrace3d.com/embed?lat=44.8699&lng=13.8420&key=YOUR_API_KEY"
  width="100%"
  height="500"
  frameborder="0"
  allow="fullscreen"
  style="border-radius: 12px; border: 1px solid #e5e7eb;">
</iframe>
响应式嵌入(推荐)html
<div style="position: relative; width: 100%; padding-bottom: 56.25%; overflow: hidden; border-radius: 12px;">
  <iframe
    src="https://suntrace3d.com/embed?lat=44.8699&lng=13.8420&key=YOUR_API_KEY"
    style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: none;"
    allow="fullscreen">
  </iframe>
</div>

嵌入功能

交互式 3D 轨道、平移和缩放
阴影模拟时间滑块
响应式 — 支持移动端
Google 3D Tiles 逼真模型
无需额外 JavaScript
全屏支持
Embedded 3D viewer in an iframe
嵌入查看器包含时间控件,支持桌面和移动设备
7

速率限制

API 实施速率限制以确保公平使用和系统稳定性。

模型生成
POST /api/v1/models
10 个请求
每小时,每个 API 密钥
状态轮询
GET /api/v1/models/:id
无限制
按需轮询
太阳能计算
POST /api/solar/calculate
无限制
公共端点
嵌入查看
GET /embed
无限制
无限次查看
速率限制超出响应 (429)json
{
  "error": "Rate limit exceeded. Maximum 10 generations per hour."
}
8

错误处理

API 使用标准 HTTP 状态码。所有错误响应包含一个带有描述问题的 error 字段的 JSON 体。

HTTP 状态码

200成功 — 请求成功完成
400Bad Request — 缺少或无效的参数
401Unauthorized — 缺少或无效的 API 密钥
404Not Found — 模型 ID 不存在
429Too Many Requests — 超出速率限制
503Service Unavailable — 外部服务(PVGIS)不可用
错误响应示例json
{
  "error": "latitude and longitude are required"
}
认证错误json
{
  "error": "Invalid or revoked API key"
}
9

Webhook

模型完成通知的 Webhook 支持计划在未来版本中提供。目前请使用状态端点轮询来检查模型是否就绪。

即将推出

Webhook 回调将在模型生成完成时向您指定的 URL 发送 POST 请求,消除轮询的需要。此功能已纳入路线图。

10

完整示例

常见集成场景的完整复制粘贴示例。

生成模型并等待完成

Bash — 完整工作流程bash
#!/bin/bash
API_KEY="YOUR_API_KEY"
BASE_URL="https://suntrace3d.com"

# 1. Request model generation
echo "Requesting model generation..."
RESPONSE=$(curl -s -X POST "$BASE_URL/api/v1/models" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"latitude": 44.8699, "longitude": 13.8420, "radiusKm": 0.3}')

MODEL_ID=$(echo $RESPONSE | jq -r '.id')
STATUS=$(echo $RESPONSE | jq -r '.status')
echo "Model ID: $MODEL_ID (status: $STATUS)"

# 2. Poll until ready
while [ "$STATUS" != "ready" ] && [ "$STATUS" != "failed" ]; do
  sleep 5
  RESPONSE=$(curl -s "$BASE_URL/api/v1/models/$MODEL_ID" \
    -H "Authorization: Bearer $API_KEY")
  STATUS=$(echo $RESPONSE | jq -r '.status')
  PROGRESS=$(echo $RESPONSE | jq -r '.progress // 0')
  echo "Status: $STATUS ($PROGRESS%)"
done

# 3. Get the model URL
if [ "$STATUS" = "ready" ]; then
  MODEL_URL=$(echo $RESPONSE | jq -r '.modelUrl')
  echo "Model ready: $MODEL_URL"
else
  echo "Generation failed"
fi

JavaScript/Node.js 集成

Node.js — 生成并轮询javascript
const API_KEY = 'YOUR_API_KEY';
const BASE_URL = 'https://suntrace3d.com';

async function generateModel(lat, lng) {
  // 1. Request generation
  const res = await fetch(`${BASE_URL}/api/v1/models`, {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ latitude: lat, longitude: lng }),
  });

  const { id, status, modelUrl } = await res.json();

  // If already cached, return immediately
  if (status === 'ready') return { id, modelUrl };

  // 2. Poll until ready
  return pollStatus(id);
}

async function pollStatus(modelId) {
  while (true) {
    await new Promise(r => setTimeout(r, 5000)); // Wait 5s

    const res = await fetch(`${BASE_URL}/api/v1/models/${modelId}`, {
      headers: { 'Authorization': `Bearer ${API_KEY}` },
    });

    const data = await res.json();
    console.log(`Status: ${data.status} (${data.progress || 0}%)`);

    if (data.status === 'ready') return data;
    if (data.status === 'failed') throw new Error('Generation failed');
  }
}

// Usage
generateModel(44.8699, 13.8420)
  .then(data => console.log('Model URL:', data.modelUrl))
  .catch(err => console.error(err));

Python 集成

Python — 生成并计算太阳能python
import requests
import time

API_KEY = "YOUR_API_KEY"
BASE_URL = "https://suntrace3d.com"

def generate_model(lat: float, lng: float) -> dict:
    """Generate an HD 3D model and wait for completion."""
    # Request generation
    res = requests.post(
        f"{BASE_URL}/api/v1/models",
        headers={"Authorization": f"Bearer {API_KEY}"},
        json={"latitude": lat, "longitude": lng, "radiusKm": 0.3},
    )
    data = res.json()

    if data["status"] == "ready":
        return data

    # Poll until ready
    model_id = data["id"]
    while True:
        time.sleep(5)
        res = requests.get(
            f"{BASE_URL}/api/v1/models/{model_id}",
            headers={"Authorization": f"Bearer {API_KEY}"},
        )
        data = res.json()
        print(f"Status: {data['status']} ({data.get('progress', 0)}%)")

        if data["status"] == "ready":
            return data
        if data["status"] == "failed":
            raise Exception("Generation failed")

def calculate_solar(lat: float, lng: float, tilt: float = 35, azimuth: float = 180) -> dict:
    """Calculate solar energy yield for a panel configuration."""
    res = requests.post(
        f"{BASE_URL}/api/solar/calculate",
        json={
            "latitude": lat,
            "longitude": lng,
            "tiltDeg": tilt,
            "azimuthDeg": azimuth,
            "panelAreaM2": 20,
            "panelEfficiency": 0.20,
        },
    )
    return res.json()

# Usage
model = generate_model(44.8699, 13.8420)
print(f"Model URL: {model['modelUrl']}")

solar = calculate_solar(44.8699, 13.8420)
print(f"Annual yield: {solar['annualYieldKwh']} kWh")
print(f"Monthly: {solar['monthlyKwh']}")
API integration code examples in multiple languages
用于 API 集成的 Bash、JavaScript 和 Python 完整代码示例

初次使用 SunTrace3D?

查看用户指南,获取 3D 查看器、阴影模拟和太阳能板分析功能的完整操作指南。

用户指南