استخدام خريطة Kaleidr أساسية
بنهاية هذا الدليل، ستعرض صفحتك خريطة Kaleidr أساسية تفاعلية بالتصميم وموضع الكاميرا اللذين تختارهما، وسيتمكن الكود من تحريك الكاميرا وتبديل التصميم. يتوفر ذلك في جميع الخطط، بما فيها Free، باستخدام مفتاح قابل للنشر يتضمن نطاق maps الموجود افتراضيًا في المفاتيح الجديدة.
قبل البدء
- مفتاح قابل للنشر (
kld_pk_live_…) من kaleidr.com/api-keys. راجع الحصول على مفتاح API. - مصدر صفحتك التجريبية، مثل
http://localhost:3000، ضمن المصادر المسموح بها في المفتاح. يعمل المفتاح الذي لا يحدد مصادر مسموحًا بها على أي موقع. - وسيلة لتقديم الصفحة عبر HTTP، مثل
npx serve .. لا تتمتع الصفحة المفت وحة من القرص بمصدر صالح، لذا يرفضها المفتاح الذي يقيّد المصادر. - إذا كان موقعك يطبق سياسة أمان المحتوى، فأضف
https://cdn.kaleidr.comإلىscript-src، وhttps://api.kaleidr.comإلىconnect-src، وhttps://map-embed.kaleidr.comإلىframe-src. راجع سياسة أمان المحتوى.
الخطوة 1: إضافة الخريطة
<script src="https://cdn.kaleidr.com/embed/v1/kaleidr.js"></script>
<kaleidr-map product="tile"
publishable-key="kld_pk_live_…"
style-id="kaleidr-morning"
style="display:block; height:480px"></kaleidr-map>
النتيجة المتوقعة: يظهر مؤشر «Loading map…» ثم خريطة أساسية فاتحة. في تبويب Network، يظهر طلب POST إلى https://api.kaleidr.com/inference-api/b2b/v1/sdk/sessions بحالة 200، يليه طلب مستند إلى https://map-embed.kaleidr.com/. يحتوي عنوان إطار iframe على معرّف التصميم فقط، دون بيانات اعتماد؛ يُرسل مفتاحك عند إنشاء الجلسة وحده، ولا يوضع رمز الجلسة في عنوان الإطار.
يجب تحديد ارتفاع للعنصر؛ وإلا تستخدم الخريطة ارتفاعًا ثابتًا يبلغ 500 بكسل. يستخدم <kaleidr-map> القيمة display:block افتراضيًا، لذا يعمل الارتفاع المحدد. أبقِ هذه القيمة في CSS أيضًا لدعم Safari قبل الإصدار 16.4، حيث يظل العنصر inline ويتجاهل height. (display:block)
الخطوة 2: اختيار التصميم
اضبط style-id على أحد التصاميم العامة التالية:
style-id | المظهر |
|---|---|
kaleidr-morning | فاتح: أرضية بيضاء ومياه سماوية وطرق بيضاء. |
kaleidr-afternoon | أرضية بدرجة متوسطة ونباتات خضراء وطرق رمادية. |
kaleidr-evening | ألوان الساعة الذهبية: رمل دافئ ودرجات زيتونية. |
kaleidr-night | أزرق كحلي وفحمي داكن مع طرق رئيسية كهرمانية. |
kaleidr-plain | مساحة بيضاء تضم الحدود وأسماء الأماكن. تظهر المباني ثلاثية الأبعاد بدءًا من مستوى تكبير 15. |
kaleidr-editorial | ألوان ما بعد الظهر دون تسميات، للخرائط الصغيرة أو الزخرفية. |
<kaleidr-map product="tile" publishable-key="kld_pk_live_…"
style-id="kaleidr-night"
style="display:block; height:480px"></kaleidr-map>
النتيجة المتوقعة: المنطقة نفسها من الخريطة بألوان داكنة.
مرّر style-id دائمًا. عند حذفه يستخدم التضمين خريطة مؤسستك الأساسية الافتراضية إن وُجدت؛ وإلا يعرض الإطار «Couldn't find a map id in the URL.».
يجب كتابة معرّفات التصاميم بدقة. لا توجد أسماء مختصرة: night ليس بديلًا عن kaleidr-night.
الخطوة 3: ضبط الكاميرا
من دون إعدادات كاميرا، تُفتح الخريطة على العرض الافتراضي للتصميم، وهو غالبًا العالم بأكمله. مرّر center (خط الطول أولًا ثم خط العرض) وzoom لعرض المنطقة المطلوبة. تعمل pitch على إمالة العرض وbearing على تدويره.
<kaleidr-map product="tile" publishable-key="kld_pk_live_…"
style-id="kaleidr-morning"
center="-0.1276,51.5072" zoom="12" pitch="45" bearing="-20"
style="display:block; height:480px"></kaleidr-map>
النتيجة المتوقعة: وسط لندن مع إمالة وتدوير.
يُتجاهل zoom ما لم تمرّر center أيضًا. يمكن استخدام pitch وbearing منفصلين.
الخطوة 4: تحريك الكاميرا وتغيير التصميم برمجيًا
العنصر هو الصيغة التصريحية. للتحكم من JavaScript، ثبّت الخريطة باستخدام Kaleidr.mount واحتفظ بكائن التحكم الذي تُرجعه الدالة.
<div id="basemap" style="height:480px"></div>
<p>
<button id="paris">Fly to Paris</button>
<button id="night">Night</button>
<button id="day">Morning</button>
</p>
<script src="https://cdn.kaleidr.com/embed/v1/kaleidr.js"></script>
<script>
const handle = Kaleidr.mount('#basemap', {
product: 'tile',
publishableKey: 'kld_pk_live_…',
styleId: 'kaleidr-morning',
center: [-0.1276, 51.5072],
zoom: 11,
});
document.getElementById('paris').addEventListener('click', () => {
// duration is in milliseconds. Leave it out to jump with no animation.
handle.setCamera({ center: [2.3522, 48.8566], zoom: 12, duration: 1200 });
});
document.getElementById('night').addEventListener('click', () => {
handle.setStyle('kaleidr-night');
});
document.getElementById('day').addEventListener('click', () => {
handle.setStyle('kaleidr-morning');
});
</script>
النتيجة المتوقعة: يغيّر كل زر الخريطة في مكانها. لا يُعاد تحميل iframe ولا يظهر طلب جلسة جديد في Network.
نقاط مهمة:
- الدالتان
setCameraوsetStyleموجودتان في كائن التحكم، لا على العنصر نفسه. - تتوفر
setStyleفي Tile فقط، وتعرض تحذيرًا من دون تنفيذ أي إجراء على المنتجات الأخرى. - يمكنك استدعاء دوال التحكم بعد عودة
Kaleidr.mountفي أي وقت. تُحفظ الاستدعاءات التي تسبق جاهزية الخريطة داخل iframe، ثم تُطبّق بالترتيب عند جاهزيتها؛ فلا حاجة إلى انتظار رسالةkaleidr-embed:readyفي الخطوة 6. استخدم خيارات التثبيت لاختيار التصميم والكاميرا عند بدء العرض. - بعد تثبيت العنصر، يؤدي تغيير
centerأوzoomأوpitchأوbearingإلى تحريك الخريطة، بينما لا يغيّر تعديلstyle-idشيئًا.
الخطوة 5: ربط لوحة محادثة بالخريطة (اختياري)
يمكن للوحة Kaleidr Chat التحكم بخريطة Tile: إذ تعرض الأماكن الواردة في الإجابات كعلامات وتضبط الكاميرا لإظهارها. ضع عنصر Tile داخل حاوية محددة الموضع، ثم ضع عنصر ال محادثة فوقه واجعل map-target يشير إلى عنصر Tile.
<div style="position:relative">
<kaleidr-map id="basemap" product="tile"
publishable-key="kld_pk_live_…"
style-id="kaleidr-morning"
center="-0.1276,51.5072" zoom="11"
style="display:block; height:560px"></kaleidr-map>
<kaleidr-map product="chat" publishable-key="kld_pk_live_…" contained
map-target="#basemap"
style="display:block; position:absolute; inset:0; z-index:1; pointer-events:none"></kaleidr-map>
</div>
<script src="https://cdn.kaleidr.com/embed/v1/kaleidr.js"></script>
النتيجة المتوقعة: تظهر لوحة المحادثة أعلى يسار الخريطة. اسأل «coffee near Covent Garden» وستظهر علامات على خريطة Tile.
وظائف سمات عنصر المحادثة وأنماطه:
| الجزء | الوظيفة |
|---|---|
map-target="#basemap" | محدّد CSS لعنصر Tile الذي تتحكم به المحادثة. |
contained | يثبّت اللوحة داخل عنصر المحادثة، وإلا تظهر ثابتة أعلى يسار نافذة المتصفح. |
position:absolute; inset:0 | يمد عنصر المحادثة فوق الخريطة لتثبيت اللوحة في زاويتها. |
z-index:1 | يبق ي طبقة المحادثة فوق الخريطة. |
pointer-events:none | يتيح سحب الخريطة وتكبيرها خارج اللوحة، مع بقاء اللوحة قابلة للنقر. |
ملاحظات:
- يصلح المفتاح نفسه لكلا العنصرين لأن المفتاح الافتراضي يتضمن النطاقين
mapsوai. يطلب عنصر المحادثة جلسة مستقلة، وتستهلك كل رسالة أرصدة الذكاء الاصطناعي. - ترتيب العنصرين غير مهم؛ تبحث لوحة المحادثة عن الخريطة حين تحتاج إليها.
توضح السمات والتخطيط خيارات تنسيق اللوحة، وتشرح الإمكانات والقيود ما يستطيع المساعد تنفيذه وما لا يستطيع.
الخطوة 6: معرفة اكتمال تحميل الخريطة (اختياري)
لا يقدم SDK وعد ready ولا يرسل العنصر أحداثًا. يرسل iframe إلى الصفحة رسالة عند رسم الخريطة لأول مرة ورسالة أخرى إذا تعذر رسم جزء منها:
const target = document.getElementById('basemap');
window.addEventListener('message', (event) => {
if (event.origin !== 'https://map-embed.kaleidr.com') return;
const frame = target.querySelector('iframe');
if (!frame || event.source !== frame.contentWindow) return;
const msg = event.data;
if (!msg || typeof msg.type !== 'string') return;
if (msg.type === 'kaleidr-embed:ready') {
// { type, id: 'kaleidr-morning', source: 'tile' }
console.log('basemap loaded', msg.id);
} else if (msg.type === 'kaleidr-embed:error') {
// { type, id, code: 'maplibre_error', message }, or
// { type, id: null, code: 'no_id', message } when there is no style
console.warn('basemap problem', msg.code, msg.message);
}
});
لا تصل أي رسالة عند فشل إنشاء الجلسة، لأن iframe لا يُنشأ أصلًا. يظهر الخطأ في وحدة التحكم. راجع إذا لم يعمل.
صفحة كاملة
احفظ المثال باسم index.html، وأدخل مفتاحك، وقدّم المجلد عبر HTTP م ن مصدر يسمح به المفتاح.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Kaleidr basemap</title>
<style>
body { font-family: system-ui, sans-serif; margin: 2rem; }
#basemap { height: 480px; }
</style>
</head>
<body>
<h1>Kaleidr basemap</h1>
<p id="status">Loading the map…</p>
<div id="basemap"></div>
<p>
<button id="paris">Fly to Paris</button>
<button id="night">Night</button>
<button id="day">Morning</button>
</p>
<script src="https://cdn.kaleidr.com/embed/v1/kaleidr.js"></script>
<script>
const target = document.getElementById('basemap');
const status = document.getElementById('status');
const handle = Kaleidr.mount(target, {
product: 'tile',
publishableKey: 'kld_pk_live_…',
styleId: 'kaleidr-morning',
center: [-0.1276, 51.5072],
zoom: 11,
});
window.addEventListener('message', (event) => {
if (event.origin !== 'https://map-embed.kaleidr.com') return;
const frame = target.querySelector('iframe');
if (!frame || event.source !== frame.contentWindow) return;
const msg = event.data;
if (msg && msg.type === 'kaleidr-embed:ready') {
status.textContent = 'Map loaded.';
}
});
document.getElementById('paris').addEventListener('click', () => {
handle.setCamera({ center: [2.3522, 48.8566], zoom: 12, duration: 1200 });
});
document.getElementById('night').addEventListener('click', () => {
handle.setStyle('kaleidr-night');
});
document.getElementById('day').addEventListener('click', () => {
handle.setStyle('kaleidr-morning');
});
// In a single-page app, call handle.destroy() when the map leaves the screen.
</script>
</body>
</html>