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フィールドはUIに進捗インジケーターを表示するためのパーセンテージ(0-100)を提供します。
特定のパネル構成と場所の年間太陽光エネルギー収量を計算します。このエンドポイントは正確な日射量値のために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']}")