Markers

اختَر النظام الأساسي: Android iOS JavaScript

تشير العلامات إلى مواقع فردية على الخريطة. يمكنك تخصيص العلامات عن طريق تغيير اللون التلقائي أو استبدال رمز العلامة بصورة مخصّصة. يمكن أن توفّر نوافذ المعلومات سياقًا إضافيًا لمحدّد موقع.

عيّنات تعليمات برمجية

يتضمن مستودع ApiDemos على GitHub نموذجًا يعرض ميزات العلامة المختلفة:

Java

الكوتلين

المقدمة

تشير محدِّدات المواقع إلى المواقع الجغرافية على الخريطة. تستخدم العلامة التلقائية رمزًا عاديًا شائعًا من حيث الشكل والأسلوب في "خرائط Google". ويمكن تغيير لون الرمز أو صورته أو نقطة الارتساء عبر واجهة برمجة التطبيقات. محدّدات المواقع هي عناصر من النوع Marker، وتتم إضافتها إلى الخريطة باستخدام طريقة GoogleMap.addMarker(markerOptions).

تم تصميم العلامات لتكون تفاعلية. ويتلقى هؤلاء المستخدمون أحداث click تلقائيًا، وغالبًا ما يتم استخدامها مع مستمعي الأحداث لإظهار نوافذ المعلومات. عندما يتم ضبط السمة على draggable لمنصّة على true، يُسمح للمستخدم بتغيير موضع العلامة. اضغط مع الاستمرار على إمكانية تحريك العلامة.

بشكل تلقائي، عندما ينقر مستخدم على محدّد، يظهر شريط أدوات الخريطة في أسفل يسار الخريطة، ما يمنح المستخدم إمكانية الوصول السريع إلى تطبيق "خرائط Google" المتوافق مع الأجهزة الجوّالة. ويمكنك إيقاف شريط الأدوات. لمزيد من المعلومات، راجِع دليل عناصر التحكّم.

بدء استخدام العلامات

تتناول هذه الحلقة من Maps Live أساسيات إضافة علامات إلى خريطتك باستخدام حزمة تطوير البرامج بالاستناد إلى بيانات "خرائط Google" للتطبيقات المتوافقة مع Android.

إضافة علامة

يوضّح المثال التالي كيفية إضافة علامة إلى خريطة. يتم إنشاء محدّد الموقع بالإحداثيات -33.852,151.211 (سيدني وأستراليا) ويعرض السلسلة "العلامة في سيدني" في نافذة معلومات عند النقر عليها.

لغة Java


@Override
public void onMapReady(GoogleMap googleMap) {
    // Add a marker in Sydney, Australia,
    // and move the map's camera to the same location.
    LatLng sydney = new LatLng(-33.852, 151.211);
    googleMap.addMarker(new MarkerOptions()
        .position(sydney)
        .title("Marker in Sydney"));
    googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}

      

Kotlin


override fun onMapReady(googleMap: GoogleMap) {
    // Add a marker in Sydney, Australia,
    // and move the map's camera to the same location.
    val sydney = LatLng(-33.852, 151.211)
    googleMap.addMarker(
        MarkerOptions()
            .position(sydney)
            .title("Marker in Sydney")
    )
    googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney))
}

      

عرض معلومات إضافية حول أداة التحديد

من المتطلبات الشائعة عرض معلومات إضافية عن مكان أو موقع جغرافي عندما ينقر المستخدم على علامة على الخريطة. راجِع دليل نوافذ المعلومات.

ربط البيانات بعلامة

يمكنك تخزين عنصر بيانات عشوائي باستخدام علامة باستخدام Marker.setTag()، واسترداد عنصر البيانات باستخدام Marker.getTag(). يوضح النموذج التالي كيفية احتساب عدد مرات النقر على العلامة باستخدام العلامات:

لغة Java


/**
 * A demo class that stores and retrieves data objects with each marker.
 */
public class MarkerDemoActivity extends AppCompatActivity implements
    GoogleMap.OnMarkerClickListener,
    OnMapReadyCallback {

    private final LatLng PERTH = new LatLng(-31.952854, 115.857342);
    private final LatLng SYDNEY = new LatLng(-33.87365, 151.20689);
    private final LatLng BRISBANE = new LatLng(-27.47093, 153.0235);

    private Marker markerPerth;
    private Marker markerSydney;
    private Marker markerBrisbane;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_markers);
        SupportMapFragment mapFragment =
            (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    /** Called when the map is ready. */
    @Override
    public void onMapReady(GoogleMap map) {
        // Add some markers to the map, and add a data object to each marker.
        markerPerth = map.addMarker(new MarkerOptions()
            .position(PERTH)
            .title("Perth"));
        markerPerth.setTag(0);

        markerSydney = map.addMarker(new MarkerOptions()
            .position(SYDNEY)
            .title("Sydney"));
        markerSydney.setTag(0);

        markerBrisbane = map.addMarker(new MarkerOptions()
            .position(BRISBANE)
            .title("Brisbane"));
        markerBrisbane.setTag(0);

        // Set a listener for marker click.
        map.setOnMarkerClickListener(this);
    }

    /** Called when the user clicks a marker. */
    @Override
    public boolean onMarkerClick(final Marker marker) {

        // Retrieve the data from the marker.
        Integer clickCount = (Integer) marker.getTag();

        // Check if a click count was set, then display the click count.
        if (clickCount != null) {
            clickCount = clickCount + 1;
            marker.setTag(clickCount);
            Toast.makeText(this,
                marker.getTitle() +
                    " has been clicked " + clickCount + " times.",
                Toast.LENGTH_SHORT).show();
        }

        // Return false to indicate that we have not consumed the event and that we wish
        // for the default behavior to occur (which is for the camera to move such that the
        // marker is centered and for the marker's info window to open, if it has one).
        return false;
    }
}

      

Kotlin


/**
 * A demo class that stores and retrieves data objects with each marker.
 */
class MarkerDemoActivity : AppCompatActivity(),
    OnMarkerClickListener, OnMapReadyCallback {
    private val PERTH = LatLng(-31.952854, 115.857342)
    private val SYDNEY = LatLng(-33.87365, 151.20689)
    private val BRISBANE = LatLng(-27.47093, 153.0235)

    private var markerPerth: Marker? = null
    private var markerSydney: Marker? = null
    private var markerBrisbane: Marker? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_markers)
        val mapFragment =
            supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
        mapFragment!!.getMapAsync(this)
    }

    /** Called when the map is ready.  */
    override fun onMapReady(map: GoogleMap) {
        // Add some markers to the map, and add a data object to each marker.
        markerPerth = map.addMarker(
            MarkerOptions()
                .position(PERTH)
                .title("Perth")
        )
        markerPerth?.tag = 0
        markerSydney = map.addMarker(
            MarkerOptions()
                .position(SYDNEY)
                .title("Sydney")
        )
        markerSydney?.tag = 0
        markerBrisbane = map.addMarker(
            MarkerOptions()
                .position(BRISBANE)
                .title("Brisbane")
        )
        markerBrisbane?.tag = 0

        // Set a listener for marker click.
        map.setOnMarkerClickListener(this)
    }

    /** Called when the user clicks a marker.  */
    override fun onMarkerClick(marker: Marker): Boolean {

        // Retrieve the data from the marker.
        val clickCount = marker.tag as? Int

        // Check if a click count was set, then display the click count.
        clickCount?.let {
            val newClickCount = it + 1
            marker.tag = newClickCount
            Toast.makeText(
                this,
                "${marker.title} has been clicked $newClickCount times.",
                Toast.LENGTH_SHORT
            ).show()
        }

        // Return false to indicate that we have not consumed the event and that we wish
        // for the default behavior to occur (which is for the camera to move such that the
        // marker is centered and for the marker's info window to open, if it has one).
        return false
    }
}

      

في ما يلي بعض الأمثلة على السيناريوهات التي يكون فيها تخزين البيانات واستردادها باستخدام علامات مفيدًا:

  • قد يلبي تطبيقك أنواعًا مختلفة من العلامات، وتريد التعامل معه بشكل مختلف عندما ينقر المستخدم عليها. لتحقيق ذلك، يمكنك تخزين String باستخدام العلامة التي تشير إلى النوع.
  • من الممكن أنّك تواجه نظامًا له معرّفات سجلّات فريدة، حيث تشير العلامات إلى سجلّات معيّنة في هذا النظام.
  • قد تشير بيانات أداة التحديد إلى الأولوية لاستخدامها عند تحديد فهرس z لعلامة.

جعل علامة الموقع قابلة للسحب

يمكنك إعادة ضبط موضع محدّد بعد إضافته إلى الخريطة طالما أنّ السمة draggable تم ضبطها على true. اضغط مع الاستمرار على محدّد الموقع لتفعيل وضع السحب. عندما ترفع إصبعك عن الشاشة، ستظل محدّدة الموقع في ذلك الموضع.

لا يمكن سحب العلامات تلقائيًا. يجب ضبط محدّد الموقع على أن يكون قابلاً للدمج بشكل صريح إما مع MarkerOptions.draggable(boolean) قبل إضافته إلى الخريطة، أو Marker.setDraggable(boolean) بعد إضافته إلى الخريطة. يمكنك الاستماع إلى أحداث السحب على محدَّد الموقع، كما هو موضَّح في أحداث سحب العلامات.

يضيف المقتطف أدناه علامة قابلة للسحب في بيرث، أستراليا.

لغة Java


final LatLng perthLocation = new LatLng(-31.90, 115.86);
Marker perth = map.addMarker(
    new MarkerOptions()
        .position(perthLocation)
        .draggable(true));

      

Kotlin


val perthLocation = LatLng(-31.90, 115.86)
val perth = map.addMarker(
    MarkerOptions()
        .position(perthLocation)
        .draggable(true)
)

      

تخصيص أداة تحديد

يعرض هذا الفيديو طرق استخدام العلامات لوضع تمثيل بصري للمواقع الجغرافية على الخريطة.

يمكن أن تحدِّد العلامات صورة مخصّصة لعرضها بدلاً من الرمز التلقائي. يتضمن تحديد الرمز إعداد عدد من الخصائص التي تؤثر في السلوك المرئي للعلامة.

تتيح العلامات التخصيص من خلال الخصائص التالية:

الموضع (مطلوب)
القيمة LatLng لموضع العلامة على الخريطة. هذه هي السمة المطلوبة الوحيدة لكائن Marker.
مرساة
النقطة التي سيتم وضعها على الصورة هي موضع خط الطول في أداة التحديد. ويتم ضبط هذا الإعداد تلقائيًا على منتصف الجزء السفلي من الصورة.
إصدار أولي
يضبط تعتيم العلامة. يكون الإعداد التلقائي بالقيمة 1.0.
Title
سلسلة يتم عرضها في نافذة المعلومات عندما ينقر المستخدم على العلامة.
المقتطف
النص الإضافي الذي يظهر أسفل العنوان
الرمز
صورة نقطية تُعرض بدلاً من صورة العلامة التلقائية.
قابلة للسحب
اضبط القيمة على true إذا أردت السماح للمستخدم بنقل العلامة. يكون الإعداد التلقائي بالقيمة false.
مرئي
يمكنك ضبط القيمة على false لجعل العلامة غير مرئية. يكون الإعداد التلقائي في true.
اتجاه مسطّح أو إلى لوحة إعلانات
تستخدم العلامات تلقائيًا اتجاه لوحة الإعلانات، ما يعني أنها ترسوم على شاشة الجهاز بدلاً من سطح الخريطة. لا يؤدي تغيير الخريطة أو إمالةها أو تكبيرها/تصغيرها إلى تغيير اتجاه العلامة. يمكنك ضبط اتجاه محدّد موقع ليكون مسطّحًا على الأرض. يتم تدوير العلامات المسطحة عند تدوير الخريطة، ويتم تغيير منظورها عند إمالة الخريطة. كما هي الحال مع علامات لوحات الإعلانات، تحتفظ العلامات المسطحة بحجمها عند تكبير الخريطة أو تصغيرها.
دوائر
الاتجاه الخاص بالعلامة، محدَّد بالدرجات في اتجاه عقارب الساعة. يتغير الموضع التلقائي إذا كانت العلامة مسطّحة. ويكون الموضع التلقائي علامة مسطّحة هو المحاذاة الشمالي. عندما تكون العلامة غير مسطّحة، يشير الموضع التلقائي إلى أنّ العلامة تشير إلى أنّ العلامة مضبوطة على توجيه الكاميرا دائمًا.

ينشئ المقتطف أدناه علامة بسيطة مع الرمز التلقائي.

لغة Java


final LatLng melbourneLocation = new LatLng(-37.813, 144.962);
Marker melbourne = map.addMarker(
    new MarkerOptions()
        .position(melbourneLocation));

      

Kotlin


val melbourneLocation = LatLng(-37.813, 144.962)
val melbourne = map.addMarker(
    MarkerOptions()
        .position(melbourneLocation)
)

      

تخصيص لون أداة التحديد

يمكن تخصيص لون صورة العلامة التلقائية من خلال تمرير الكائن BitmapDescriptor إلى طريقة icon(). يمكنك استخدام مجموعة من الألوان المحدّدة مسبقًا في الكائن BitmapDescriptorFactory أو ضبط لون علامة مخصّص باستخدام الطريقة BitmapDescriptorFactory.defaultMarker(float hue). تدرج الألوان بين 0 و360، وهي تمثّل النقاط على عجلة الألوان.

لغة Java


final LatLng melbourneLocation = new LatLng(-37.813, 144.962);
Marker melbourne = map.addMarker(
    new MarkerOptions()
        .position(melbourneLocation)
        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));

      

Kotlin


val melbourneLocation = LatLng(-37.813, 144.962)
val melbourne = map.addMarker(
    MarkerOptions()
        .position(melbourneLocation)
        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
)

      

تخصيص تعتيم العلامة

يمكنك التحكم في تعتيم محدّد باستخدام الأسلوبMarkOptions.alpha(). يجب تحديد الإصدار الأولي على أنه عائم بين 0.0 و1.0، حيث تكون القيمة 0 شفافة تمامًا والرقم 1 غير شفاف تمامًا.

لغة Java


final LatLng melbourneLocation = new LatLng(-37.813, 144.962);
Marker melbourne = map.addMarker(new MarkerOptions()
    .position(melbourneLocation)
    .alpha(0.7f));

      

Kotlin


val melbourneLocation = LatLng(-37.813, 144.962)
val melbourne = map.addMarker(
    MarkerOptions()
        .position(melbourneLocation)
        .alpha(0.7f)
)

      

تخصيص صورة أداة التحديد

يمكنك استبدال صورة علامة تلقائية بصورة علامة مخصّصة، وغالبًا ما تُعرف باسم رمز محدّد. يتم دائمًا ضبط الرموز المخصّصة على أنّها BitmapDescriptor، ويتم تحديدها باستخدام إحدى الطرق ضمن فئة BitmapDescriptorFactory.

fromAsset(String assetName)
تنشئ علامة مخصّصة باستخدام اسم صورة Bitmap في دليل مواد العرض.
fromBitmap(Bitmap image)
لإنشاء علامة مخصَّصة من صورة Bitmap.
fromFile(String fileName)
لإنشاء رمز مخصّص باستخدام اسم ملف صورة Bitmap في وحدة التخزين الداخلية.
fromPath(String absolutePath)
لإنشاء علامة مخصّصة من مسار ملف مطلق لصورة على صورة نقطية
fromResource(int resourceId)
لإنشاء علامة مخصَّصة باستخدام رقم تعريف المورد لصورة نقطية.

يعمل المقتطف أدناه على إنشاء محدِّد برمز مخصَّص.

لغة Java


final LatLng melbourneLocation = new LatLng(-37.813, 144.962);
Marker melbourne = map.addMarker(
    new MarkerOptions()
        .position(melbourneLocation)
        .title("Melbourne")
        .snippet("Population: 4,137,400")
        .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)));

      

Kotlin


val melbourneLocation = LatLng(-37.813, 144.962)
val melbourne = map.addMarker(
    MarkerOptions()
        .position(melbourneLocation)
        .title("Melbourne")
        .snippet("Population: 4,137,400")
        .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow))
)

      

تحديد شكل مسطّح

يتم عادةً رسم رموز العلامات بالنسبة إلى الشاشة، علمًا بأنّ تدوير الخريطة أو إمالةها أو تصغيرها لن يؤدي إلى تغيير اتجاه محدّد الموقع. يمكنك ضبط اتجاه الاتجاه على محدّدة لتكون مسطّحة على الأرض. العلامات التي يتم توجيهها بهذه الطريقة سيتم تدويرها عند تدوير الخريطة، وكذلك يتم تغيير منظورها عند إمالة الخريطة. ستحتفظ العلامات المسطحة بحجمها عند تكبير الخريطة أو تصغيرها.

لتغيير اتجاه العلامة، اضبط سمة flat للعلامة على true.

لغة Java


final LatLng perthLocation = new LatLng(-31.90, 115.86);
Marker perth = map.addMarker(
    new MarkerOptions()
        .position(perthLocation)
        .flat(true));

      

Kotlin


val perthLocation = LatLng(-31.90, 115.86)
val perth = map.addMarker(
    MarkerOptions()
        .position(perthLocation)
        .flat(true)
)

      

تدوير علامة

يمكنك تدوير علامة حول نقطة الارتساء باستخدام Marker.طريقة setRotation() يتم قياس التدوير بالدرجات في اتجاه عقارب الساعة من الموضع التلقائي. عندما يكون محدّد الموقع مسطّحًا على الخريطة، يكون الموضع التلقائي هو الشمال. عندما لا تكون العلامة مسطّحة، يكون الموضع التلقائي هو التوجيه للأعلى، وتكون التدوير بحيث تكون العلامة محدَّدة أمام الكاميرا دائمًا.

يؤدي المثال التالي إلى تدوير العلامة بزاوية 90 درجة. يؤدي ضبط نقطة الارتساء إلى 0.5,0.5 إلى تدوير العلامة حول مركزها، بدلاً من قاعدةها.

لغة Java


final LatLng perthLocation = new LatLng(-31.90, 115.86);
Marker perth = map.addMarker(
    new MarkerOptions()
        .position(perthLocation)
        .anchor(0.5f,0.5f)
        .rotation(90.0f));

      

Kotlin


val perthLocation = LatLng(-31.90, 115.86)
val perth = map.addMarker(
    MarkerOptions()
        .position(perthLocation)
        .anchor(0.5f, 0.5f)
        .rotation(90.0f)
)

      

علامة التحديد z

يحدد فهرس z ترتيب تسلسل استدعاء الدوال البرمجية لهذه العلامة، بالنسبة إلى العلامات الأخرى على الخريطة. يتم وضع علامة ذات مؤشر z مرتفع على شكل علامات ذات فهارس z منخفضة. القيمة التلقائية لفهرس z هي 0.

اضبط فهرس z على عنصر خيارات العلامة من خلال طلب MarkerOptions.zIndex()، كما هو موضّح في مقتطف الرمز التالي:

لغة Java


map.addMarker(new MarkerOptions()
    .position(new LatLng(10, 10))
    .title("Marker z1")
    .zIndex(1.0f));

      

Kotlin


map.addMarker(
    MarkerOptions()
        .position(LatLng(10.0, 10.0))
        .title("Marker z1")
        .zIndex(1.0f)
)

      

يمكنك الوصول إلى فهرس z للعلامة من خلال طلب الرقم Marker.getZIndex()، ويمكنك تغييره عن طريق الاتصال بـ Marker.setZIndex().

يتم دائمًا رسم العلامات على طبقات المربّعات وغير ذلك من العناصر غير المميّزة التي لا تحمل علامات (التراكبات الأرضية والخطوط المضلّعة والمضلعات وأشكال أخرى) بغض النظر عن فهرس z للتراكبات الأخرى. وتُعتبَر العلامات المحددّة في مجموعة فهرس z منفصلة عن غيرها.

تعرّف على المزيد من المعلومات عن تأثير فهرس z على أحداث النقرات أدناه.

التعامل مع أحداث العلامات

تسمح لك Maps API بالاستماع إلى أحداث محدِّد الموقع والرد عليها. للاستماع إلى هذه الأحداث، عليك ضبط المستمع المقابل على عنصر GoogleMap الذي تنتمي إليه العلامات. عند وقوع الحدث على إحدى العلامات على الخريطة، يتم استدعاء استدعاء المستمع مع عنصر Marker المقابل الذي يتم تمريره كمَعلمة. لمقارنة هذا العنصر Marker بمرجعك الخاص بعنصر Marker، يجب استخدام equals() وليس ==.

يمكنك الاستماع إلى الأحداث التالية:

أحداث نقرات محدّد الموقع

يمكنك استخدام OnMarkerClickListener للاستماع إلى أحداث النقر على أداة التحديد. لضبط هذه المستمع على الخريطة، اتّصِل GoogleMap.setOnMarkerClickListener(OnMarkerClickListener). عندما ينقر المستخدم على محدِّد، سيتم استدعاء onMarkerClick(Marker) وسيتم تمرير العلامة كوسيطة. تعرض هذه الطريقة قيمة منطقية تشير إلى ما إذا كنت قد استهلكت الحدث (أي تريد إيقاف السلوك التلقائي). إذا عرض false، سيتم تطبيق السلوك التلقائي إضافةً إلى السلوك المخصّص. السلوك التلقائي لحدث النقر على محدّد الموقع هو عرض نافذة المعلومات (في حال توفرها) وتحريك الكاميرا بحيث يتم وضع العلامة في وسط الخريطة.

تأثير فهرسة z على أحداث النقر:

  • عندما ينقر المستخدم على مجموعة من العلامات، يتم تشغيل حدث النقر للعلامة التي تحمل أعلى فهرس z.
  • ويتم تشغيل حدث واحد على الأكثر لكل نقرة. بعبارة أخرى، لا يتم تمرير النقرة إلى العلامات أو التراكبات الأخرى ذات قيم فهرس z أقل.
  • يؤدي النقر على مجموعة من العلامات إلى حدوث نقرات لاحقة للتنقّل بين المجموعات، واختيار كل منها بدوره. ويُرتّب ترتيب الدورة لأول مرة فهرس z، ثم يقترب من نقطة النقر.
  • إذا نقر المستخدم خارج نطاق المجموعة، ستعيد واجهة برمجة التطبيقات احتساب المجموعة وإعادة ضبط حالة دورة النقر بحيث تبدأ من البداية.
  • يندرج حدث النقر ضمن مجموعات العلامات إلى أشكال وتراكبات أخرى قبل إعادة تشغيل الدورة.
  • يتم اعتبار العلامات على أنّها في مجموعة فهرس z منفصلة عن الأشكال أو الأشكال المركّبة الأخرى (الخطوط المضلّعة و/أو المضلّعات و/أو الدوائر و/أو العناصر المركّبة على الأرض) بغض النظر عن فهرس z للتراكبات الأخرى. إذا كانت عدّة علامات أو عناصر مركّبة أو أشكال مركّبة فوق بعضها، يتم التنقّل بين أحداث النقر من خلال مجموعة من العلامات أولاً، ثم تشغيلها عند ظهور عناصر مركّبة أو أشكال أخرى قابلة للنقر، استنادًا إلى قيم الفهرس الخاص بها.

أحداث سحب محدّد الموقع

يمكنك استخدام OnMarkerDragListener للاستماع إلى أحداث السحب على محدِّد الموقع. لضبط هذه المستمع على الخريطة، اتّصِل GoogleMap.setOnMarkerDragListener. لسحب محدّد، يجب أن يضغط المستخدم مع الاستمرار على العلامة. عندما يسحب المستخدم إصبعه من الشاشة، ستظل علامة التحديد في هذا الموضع. عندما يتم سحب محدّد، يتم طلب onMarkerDragStart(Marker) في البداية. أثناء سحب العلامة، يتم طلب onMarkerDrag(Marker) باستمرار. في نهاية شريط السحب يتم طلب onMarkerDragEnd(Marker). يمكنك الحصول على موضع محدّد الموقع في أي وقت عن طريق الاتصال بـ Marker.getPosition().