يتيح لك API شركاء SunTrace3D توليد نماذج مدن HD ثلاثية الأبعاد، وحساب إنتاج الطاقة الشمسية، وتضمين عارضات ثلاثية الأبعاد تفاعلية في موقعك الإلكتروني. تستخدم جميع نقاط النهاية JSON وطرق HTTP القياسية.
عرض بصيغة Markdown (قابل للقراءة آليًا)API SunTrace3D هي خدمة RESTful للوصول البرمجي إلى توليد نماذج المدن ثلاثية الأبعاد وحسابات الطاقة الشمسية. صُمم API للشركاء الذين يرغبون في دمج التحليل الشمسي في تطبيقاتهم أو مواقعهم الإلكترونية أو سير عملهم.
https://suntrace3d.com/api/v1/api/v1/modelsتوليد نموذج HD ثلاثي الأبعاد جديد/api/v1/models/:idالتحقق من حالة توليد النموذج/api/solar/calculateحساب إنتاج الطاقة الشمسية/embedعارض ثلاثي الأبعاد قابل للتضمين (iframe)/api/healthفحص الحالة (دون مصادقة)
تتطلب جميع طلبات API المصادقة عبر Bearer token في رأس Authorization. تتم إدارة مفاتيح API من خلال بوابة الشركاء.
curl -H "Authorization: Bearer st_live_abc123def456..." \
https://suntrace3d.com/api/v1/modelsلا تكشف أبدًا مفتاح API في JavaScript من جانب العميل أو المستودعات العامة أو الكود الأمامي. إذا تم اختراق مفتاحك، قم بإلغائه فورًا من بوابة الشركاء وأنشئ مفتاحًا جديدًا.
اطلب توليد نموذج مدينة HD ثلاثي الأبعاد لموقع جغرافي محدد. يتم توليد النموذج بشكل غير متزامن — استعلم عن نقطة نهاية الحالة للتحقق من الجاهزية.
/api/v1/modelslatitudenumberrequiredخط عرض نقطة المركز (-90 إلى 90)longitudenumberrequiredخط طول نقطة المركز (-180 إلى 180)radiusKmnumberنصف قطر المنطقة المراد نمذجتها بالكيلومتر (افتراضي: 0.3)idstringrequiredمعرّف النموذج الفريد لاستعلام الحالةstatusstringrequired"pending" | "processing" | "ready" | "failed"modelUrlstringعنوان URL لملف النموذج GLB (عند الجاهزية)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) لعرض مؤشر التقدم في واجهتك.
احسب إنتاج الطاقة الشمسية السنوي لتكوين ألواح وموقع محدد. تستخدم نقطة النهاية هذه بيانات 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تقدير إنتاج الطاقة السنوي بوحدة kWhpeakPowerKwnumberrequiredذروة الطاقة المنتجة بوحدة kWspecificYieldnumberrequiredالإنتاج النوعي بوحدة kWh/kWpmonthlyKwhnumber[]requiredمصفوفة من 12 قيمة شهرية بوحدة kWhsourcestringrequiredمعرّف مصدر البيانات ("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. تستخدم API PVGIS العام الذي يديره مركز الأبحاث المشترك التابع للمفوضية الأوروبية.

ضمّن عارضًا شمسيًا تفاعليًا ثلاثي الأبعاد في موقعك الإلكتروني باستخدام iframe. يتضمن عارض التضمين عناصر تحكم زمنية لمحاكاة الظلال ويعمل على أجهزة الكمبيوتر والأجهزة المحمولة.
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 القياسية. تتضمن جميع استجابات الأخطاء نصًا بصيغة JSON مع حقل error يصف المشكلة.
{
"error": "latitude and longitude are required"
}{
"error": "Invalid or revoked API key"
}دعم Webhooks لإشعارات اكتمال النموذج مخطط لإصدار مستقبلي. حاليًا، استخدم الاستعلام على نقطة نهاية الحالة للتحقق من جاهزية النماذج.
ستقوم Webhooks بإرسال طلب POST إلى عنوان URL الذي تحدده عند اكتمال توليد النموذج، مما يلغي الحاجة للاستعلام. هذه الميزة في خارطة الطريق.
أمثلة كاملة جاهزة للنسخ واللصق لسيناريوهات التكامل الشائعة.
#!/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']}")
اطلع على دليل المستخدم للحصول على شرح كامل للعارض ثلاثي الأبعاد ومحاكاة الظلال وميزات تحليل الألواح الشمسية.
دليل المستخدم