شکل‌ها و خط‌ها

پلاتفرم را انتخاب کنید: Android iOS

می‌توانید شکل‌های مختلفی به نقشه‌تان اضافه کنید. شکل شیئی روی نقشه است که به سیستم مختصات LatLng گره خورده است. ‫3D Maps در Maps JavaScript API از افزودن خطوط و چندضلعی‌ها به نقشه پشتیبانی می‌کند.

چندخطی‌ها

برای ترسیم خط روی نقشه، از چندخطی استفاده کنید. کلاس Polyline3DElement یک رونهاد خطی از بخش‌های خط متصل روی نقشه را تعریف می‌کند. یک شیء Polyline3DElement از آرایه‌ای از مکان‌های LatLng تشکیل شده است و مجموعه‌ای از بخش‌های خطی ایجاد می‌کند که آن مکان‌ها را در یک توالی مرتب‌شده به‌هم متصل می‌کند.

افزودن چندخطی

سازنده Polyline3DElement مجموعه‌ای از Polyline3DElementOptions را می‌گیرد که مختصات LatLng خط و مجموعه‌ای از سبک‌ها را برای تنظیم رفتار دیداری چندخطی مشخص می‌کند.

اشیاء چندخطی به‌صورت مجموعه‌ای از بخش‌های مستقیم روی نقشه ترسیم می‌شوند. می‌توانید رنگ‌ها، عرض‌ها، میزان شفافیت، ارتفاع، و گزینه‌های سبک هندسی سفارشی را برای خطوط در Polyline3DElementOptions هنگام ساختن خط مشخص کنید، یا می‌توانید این ویژگی‌ها را پس‌از ساختن تغییر دهید. چندخطی از سبک‌های قلم‌ضربه‌ای زیر پشتیبانی می‌کند:

  • outerColor: رنگ HTML شانزده‌شانزدهی با قالب "#FFFFFF".
  • outerWidth: مقدار عددی بین 0.0 و 1.0 که به‌عنوان درصدی از strokeWidth تفسیر می‌شود.
  • strokeColor: رنگ HTML شانزده‌شانزدهی با قالب "#FFFFFF".
  • strokeWidth: عرض خط به پیکسل.
  • geodesic: اینکه لبه‌های چندضلعی از انحنای زمین پیروی کند یا به‌صورت خطوط مستقیم ترسیم شود.
  • ‫altitudeMode: نحوه تفسیر مؤلفه‌های ارتفاع در مختصات
  • drawsOccludedSegments: بولی که نشان می‌دهد آیا بخش‌هایی از چندضلعی که توسط اشیاء (مانند ساختمان‌ها) پنهان شده‌اند باید ترسیم شوند یا نه.
  • extruded: بولی نشان‌دهنده اینکه آیا چندخطی باید به زمین متصل شود یا نه.

let map;
async function init() {
    const { Map3DElement, Polyline3DElement } =
        await google.maps.importLibrary('maps3d');

    map = new Map3DElement({
        center: { lat: 37.7927, lng: -122.402, altitude: 65.93 },
        range: 3362.87,
        tilt: 64.01,
        heading: 25.0,
        mode: 'SATELLITE',
    });

    document.body.append(map);

    const polyline = new Polyline3DElement({
        path: [
            { lat: 37.80515638571346, lng: -122.4032569467164 },
            { lat: 37.80337073509504, lng: -122.4012878349353 },
            { lat: 37.79925208843463, lng: -122.3976697250461 },
            { lat: 37.7989102378512, lng: -122.3983408725656 },
            { lat: 37.79887832784348, lng: -122.3987094864192 },
            { lat: 37.79786443410338, lng: -122.4066878788802 },
            { lat: 37.79549248916587, lng: -122.4032992702785 },
            { lat: 37.78861484290265, lng: -122.4019489189814 },
            { lat: 37.78618687561075, lng: -122.398969592545 },
            { lat: 37.7892310309145, lng: -122.3951458683092 },
            { lat: 37.7916358762409, lng: -122.3981969390652 },
        ],
        strokeColor: 'blue',
        outerColor: 'white',
        strokeWidth: 10,
        outerWidth: 0.4,
        altitudeMode: 'RELATIVE_TO_GROUND', // Place it on the ground (as it has no altitude it will just be at ground height).
        drawsOccludedSegments: true, // Show the line through the buildings or anything else that might get in the way.
    });

    map.append(polyline);
}

void init();

چندخطی‌های تعاملی

مثال زیر ویژگی drawsOccludedSegments چندخطی را پس‌از ثبت رویداد کلیک تغییر می‌دهد.

let map;
async function init() {
    const { Map3DElement, Polyline3DInteractiveElement } =
        await google.maps.importLibrary('maps3d');

    map = new Map3DElement({
        center: { lat: 37.7927, lng: -122.402, altitude: 65.93 },
        range: 3362.87,
        tilt: 64.01,
        heading: 25.0,
        mode: 'SATELLITE',
    });

    document.body.append(map);

    const polyline = new Polyline3DInteractiveElement({
        coordinates: [
            { lat: 37.80515638571346, lng: -122.4032569467164 },
            { lat: 37.80337073509504, lng: -122.4012878349353 },
            { lat: 37.79925208843463, lng: -122.3976697250461 },
            { lat: 37.7989102378512, lng: -122.3983408725656 },
            { lat: 37.79887832784348, lng: -122.3987094864192 },
            { lat: 37.79786443410338, lng: -122.4066878788802 },
            { lat: 37.79549248916587, lng: -122.4032992702785 },
            { lat: 37.78861484290265, lng: -122.4019489189814 },
            { lat: 37.78618687561075, lng: -122.398969592545 },
            { lat: 37.7892310309145, lng: -122.3951458683092 },
            { lat: 37.7916358762409, lng: -122.3981969390652 },
        ],
        strokeColor: 'blue',
        outerColor: 'white',
        strokeWidth: 10,
        outerWidth: 0.4,
        altitudeMode: 'RELATIVE_TO_GROUND', // Place it on the ground (as it has no altitude it will just be at ground height).
        drawsOccludedSegments: true, // Show the line through the buildings or anything else that might get in the way.
    });

    polyline.addEventListener('gmp-click', function () {
        // Toggle whether the line draws occluded segments.
        this.drawsOccludedSegments = !this.drawsOccludedSegments;
    });

    map.append(polyline);
}

void init();

چندضلعی‌ها

چندضلعی نشان‌دهنده منطقه‌ای است که با مسیر بسته (یا حلقه) محصور شده است و با مجموعه‌ای از مختصات تعریف می‌شود. Polygon3DElement اشیاء شبیه به اشیاء Polyline3DElement هستند از این نظر که از مجموعه‌ای از مختصات در یک توالی مرتب تشکیل شده‌اند. چندضلعی‌ها با خط پیرامونی و رنگ‌آمیزی داخلی ترسیم می‌شوند. می‌توانید رنگ‌ها و پهناهای سفارشی برای لبه چندضلعی (خط) و رنگ‌ها و میزان ماتی سفارشی برای ناحیه محصور (پر کردن) تعریف کنید. رنگ‌ها باید در قالب HTML شانزده‌شانزدهی نشان داده شوند. نام رنگ‌ها پشتیبانی نمی‌شود.

اشیاء Polygon3DElement می‌توانند شکل‌های پیچیده را توصیف کنند، ازجمله:

  • چندین منطقه غیرمجاور که با یک چندضلعی تعریف شده‌اند.
  • مناطقی که در آن‌ها سوراخ وجود دارد.
  • تقاطع یک یا چند منطقه.

برای تعریف شکل پیچیده، از چندضلعی با چند مسیر استفاده می‌کنید.

افزودن چندضلعی

چون یک ناحیه چندضلعی ممکن است شامل چندین مسیر جداگانه باشد، ویژگی paths شیء Polygon3DElement آرایه‌ای از آرایه‌ها را مشخص می‌کند. هر آرایه توالی جداگانه‌ای از مختصات مرتب‌شده LatLng را تعریف می‌کند.

برای چندضلعی‌های پایه که فقط از یک مسیر تشکیل شده‌اند، می‌توانید Polygon3DElement را بااستفاده از یک آرایه تکی از مختصات LatLng بسازید. ‫3D Maps در Maps JavaScript API هنگام ساخت، آرایه را به آرایه‌ای از آرایه‌ها تبدیل می‌کند و آن را در ویژگی path ذخیره می‌کند.

async function init() {
    const { Map3DElement, Polygon3DElement } =
        await google.maps.importLibrary('maps3d');

    const map3DElement = new Map3DElement({
        center: { lat: 40.6842, lng: -74.0019, altitude: 1000 },
        heading: 340,
        tilt: 70,
        mode: 'HYBRID',
    });

    const polygonOptions = {
        strokeColor: '#0000ff80',
        strokeWidth: 8,
        fillColor: '#ff000080',
        drawsOccludedSegments: false,
    };

    const examplePolygon = new Polygon3DElement(polygonOptions);

    examplePolygon.path = [
        { lat: 40.7144, lng: -74.0208 },
        { lat: 40.6993, lng: -74.019 },
        { lat: 40.7035, lng: -74.0004 },
    ];

    map3DElement.append(examplePolygon);

    document.body.append(map3DElement);
}

void init();

چندضلعی‌های تعاملی

مثال زیر رنگ‌های داخلی و خارجی چندضلعی را پس‌از ثبت رویداد کلیک تغییر می‌دهد.

async function init() {
    const { Map3DElement, Polygon3DInteractiveElement } =
        await google.maps.importLibrary('maps3d');

    const map = new Map3DElement({
        center: { lat: 40.6842, lng: -74.0019, altitude: 1000 },
        heading: 340,
        tilt: 70,
        mode: 'HYBRID',
    });

    document.body.append(map);

    const polygonOptions = {
        strokeColor: '#0000ff80',
        strokeWidth: 8,
        fillColor: '#ff000080',
        drawsOccludedSegments: false,
    };

    const examplePolygon = new Polygon3DInteractiveElement(polygonOptions);

    examplePolygon.path = [
        { lat: 40.7144, lng: -74.0208 },
        { lat: 40.6993, lng: -74.019 },
        { lat: 40.7035, lng: -74.0004 },
        { lat: 40.7144, lng: -74.0208 },
    ];

    examplePolygon.addEventListener('gmp-click', function (event) {
        // change the color of the polygon stroke and fill colors to a random alternatives!
        this.fillColor = randomizeHexColor(this.fillColor);
        this.strokeColor = randomizeHexColor(this.strokeColor);
        console.log(event);
    });

    map.append(examplePolygon);
}

function randomizeHexColor(originalHexColor) {
    console.log(originalHexColor);
    const alpha = originalHexColor.substring(7);

    // Generate random values for Red, Green, Blue (0-255)
    const r = Math.floor(Math.random() * 256);
    const g = Math.floor(Math.random() * 256);
    const b = Math.floor(Math.random() * 256);

    console.log(r + ' ' + g + ' ' + b);

    // Convert decimal to 2-digit hex, padding with '0' if needed
    const rHex = ('0' + r.toString(16)).slice(-2);
    const gHex = ('0' + g.toString(16)).slice(-2);
    const bHex = ('0' + b.toString(16)).slice(-2);

    // Combine parts: '#' + random RGB + original Alpha (if any)
    return `#${rHex}${gHex}${bHex}${alpha}`;
}

void init();