SunTrace3D 合作伙伴 API 允许您生成 HD 3D 城市模型、计算太阳能产量,并在您的网站上嵌入交互式 3D 查看器。所有端点使用 JSON 和标准 HTTP 方法。
以 Markdown 格式查看(机器可读)SunTrace3D API 是一个用于编程访问 3D 城市模型生成和太阳能计算的 RESTful 服务。API 专为希望将太阳能分析集成到自己的应用程序、网站或工作流程中的合作伙伴设计。
https://suntrace3d.com/api/v1/api/v1/models生成新的 HD 3D 模型/api/v1/models/:id检查模型生成状态/api/solar/calculate计算太阳能产量/embed可嵌入 3D 查看器(iframe)/api/health健康检查(无需认证)
所有 API 请求需要通过 Authorization 头中的 Bearer 令牌进行认证。API 密钥通过合作伙伴门户管理。
curl -H "Authorization: Bearer st_live_abc123def456..." \
https://suntrace3d.com/api/v1/models切勿在客户端 JavaScript、公共仓库或前端代码中暴露 API 密钥。如果密钥泄露,请立即从合作伙伴门户撤销并创建新密钥。
请求为特定地理位置生成 HD 3D 城市模型。模型异步生成 — 轮询状态端点以检查何时准备就绪。
/api/v1/modelslatitudenumberrequired中心点纬度(-90 到 90)longitudenumberrequired中心点经度(-180 到 180)radiusKmnumber建模区域半径(km)(默认: 0.3)idstringrequired用于状态轮询的唯一模型标识符statusstringrequired"pending" | "processing" | "ready" | "failed"modelUrlstringGLB 模型文件的 URL(就绪时)progressnumber生成进度 0-100(处理中时)stepstring当前生成步骤描述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
}'{
"id": "hd_44.8699_13.8420_0.3",
"status": "pending"
}{
"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 天。缓存结果不收费。

轮询此端点以检查模型生成请求的状态。模型经历多个阶段: pending → processing → ready。
/api/v1/models/:idcurl https://suntrace3d.com/api/v1/models/hd_44.8699_13.8420_0.3 \
-H "Authorization: Bearer YOUR_API_KEY"{
"id": "hd_44.8699_13.8420_0.3",
"status": "processing",
"progress": 65,
"step": "Generating textures..."
}{
"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
}建议每 5-10 秒轮询一次。典型的生成时间为 30-120 秒,取决于区域大小和服务器负载。progress 字段提供百分比(0-100)以在您的 UI 中显示进度指示器。
计算特定面板配置和位置的年度太阳能产量。此端点使用 PVGIS(光伏地理信息系统)卫星数据获取精确的辐照值。
/api/solar/calculatelatitudenumberrequired位置纬度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")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
}'{
"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。

使用 iframe 在您的网站上嵌入交互式 3D 太阳能查看器。嵌入查看器包含阴影模拟的时间控件,支持桌面和移动设备。
latnumberrequired要显示位置的纬度lngnumberrequired要显示位置的经度keystringrequired用于认证的 API 密钥<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><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>
API 实施速率限制以确保公平使用和系统稳定性。
{
"error": "Rate limit exceeded. Maximum 10 generations per hour."
}API 使用标准 HTTP 状态码。所有错误响应包含一个带有描述问题的 error 字段的 JSON 体。
{
"error": "latitude and longitude are required"
}{
"error": "Invalid or revoked API key"
}模型完成通知的 Webhook 支持计划在未来版本中提供。目前请使用状态端点轮询来检查模型是否就绪。
Webhook 回调将在模型生成完成时向您指定的 URL 发送 POST 请求,消除轮询的需要。此功能已纳入路线图。
常见集成场景的完整复制粘贴示例。
#!/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"
ficonst 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));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']}")