جستجو – کاتلین

مستندات جامع اندروید

نسخه 1.0.3

هدف از این بخش از پروژه، جستجوی نام خیابان ها و مکان های ثبت شده بر روی نقشه ، به وسیله سرویس جستجوی مکان محور نشان است. با استفاده از این سرویس ، بهترین نتایج ممکن پیرامون یک نقطه مشخص بدست می آید.

فهرست مطالب این صفحه

برای آشنایی سریع با وب سرویس جستجوی مکان محور نشان ، میتوانید از لینک زیر استفاده کنید

وب سرویس جستجو


برای جستجوی یک عبارت حول یک طول و عرض جغرافیایی مشخص ، فرمت درخواست ما باید به صورت زیر و از نوع Get باشد:

برای مثال جستجوی کلمه آزادی حول طول و عرض جغرافیایی 59.543695 , 36.327371 (مشهد) به این صورت می باشد:

و پاسخ دریافت شده از سرور به صورت زیر می باشد:

            {
    "count": 30,
    "items": [
        {
            "title": "بزرگراه آزادی",
            "category": "municipal",
            "type": "trunk",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله شهید فرامرز عباسی",
            "location": {
                "x": 59.54418939716518,
                "y": 36.328338876612705,
                "z": "NaN"
            }
        },
        {
            "title": "پل آزادی",
            "address": "پل آزادی",
            "category": "municipal",
            "type": "trunk",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله آزادشهر",
            "location": {
                "x": 59.54135775,
                "y": 36.318429949999995,
                "z": "NaN"
            }
        },
        {
            "title": "میدان آزادی",
            "address": "میدان آزادی",
            "category": "municipal",
            "type": "roundabout",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله آزادشهر",
            "location": {
                "x": 59.54038191808422,
                "y": 36.31564164676244,
                "z": "NaN"
            }
        },
        {
            "title": "زیرگذر میدان آزادی",
            "address": "زیرگذر میدان آزادی",
            "category": "municipal",
            "type": "trunk",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله آزادشهر",
            "location": {
                "x": 59.54059953955253,
                "y": 36.315184051371986,
                "z": "NaN"
            }
        },
        {
            "title": "میدان آزادی",
            "address": "میدان آزادی",
            "category": "municipal",
            "type": "primary",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله ملک آباد",
            "location": {
                "x": 59.54140005973515,
                "y": 36.314887754298844,
                "z": "NaN"
            }
        },
        {
            "title": "کنارگذر بزرگراه آزادی",
            "address": "کنارگذر پیامبر اعظم",
            "category": "municipal",
            "type": "secondary",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "شهرک امام هادی",
            "location": {
                "x": 59.54439154999999,
                "y": 36.3531682,
                "z": "NaN"
            }
        },
        {
            "title": "شهید حسن آزادی",
            "address": "مجد 25 - قرنی 18/17",
            "category": "municipal",
            "type": "tertiary",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله سعدآباد",
            "location": {
                "x": 59.58923944280614,
                "y": 36.308469070152775,
                "z": "NaN"
            }
        },
        {
            "title": "پایگاه قطار شهری میدان آزادی",
            "address": "میدان آزادی",
            "category": "place",
            "type": "vaccine",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله ملک آباد",
            "location": {
                "x": 59.54253804942464,
                "y": 36.3140559482299,
                "z": "NaN"
            }
        },
        {
            "title": "پاساژ فرش آزادی",
            "address": "ایت الله خزعلی",
            "category": "place",
            "type": "shopping_mall",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله سراب",
            "location": {
                "x": 59.608517199999994,
                "y": 36.292807100000005,
                "z": "NaN"
            }
        },
        {
            "title": "خیابان کنارگذر آزادی",
            "address": "خیابان کنارگذر آزادی",
            "category": "municipal",
            "type": "residential",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله آزادشهر",
            "location": {
                "x": 59.54404234999999,
                "y": 36.329699649999995,
                "z": "NaN"
            }
        },
        {
            "title": "آژانس شبانه روزی آزادی",
            "address": "بزرگراه آزادی",
            "category": "place",
            "type": "taxi_service",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله آزادشهر",
            "location": {
                "x": 59.544172100000004,
                "y": 36.330574399999996,
                "z": "NaN"
            }
        },
        {
            "title": "خیابان کنارگذر آزادی",
            "address": "خیابان کنارگذر آزادی",
            "category": "municipal",
            "type": "residential",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله سجاد شهر",
            "location": {
                "x": 59.54319050239321,
                "y": 36.32326550047579,
                "z": "NaN"
            }
        },
        {
            "title": "مجتمع نان آزادی",
            "address": "بزرگراه آزادی، آزادی 24",
            "category": "place",
            "type": "bakery",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله آزادشهر",
            "location": {
                "x": 59.54438534913283,
                "y": 36.33176519346292,
                "z": "NaN"
            }
        },
        {
            "title": "مجتمع نان آزادی",
            "address": "بزرگراه آزادی، آزادی 24",
            "category": "place",
            "type": "bakery",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله آزادشهر",
            "location": {
                "x": 59.54453329323038,
                "y": 36.33179868787656,
                "z": "NaN"
            }
        },
        {
            "title": "بیمه دانا شعبه آزادی",
            "address": "بزرگراه آزادی",
            "category": "place",
            "type": "insurance_agency",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله ملک آباد",
            "location": {
                "x": 59.5418879,
                "y": 36.3178947,
                "z": "NaN"
            }
        },
        {
            "title": "سوپر مارکت آزادی",
            "address": "بزرگراه آزادی، آزادی 44",
            "category": "place",
            "type": "supermarket",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله زیبا شهر",
            "location": {
                "x": 59.54611628611779,
                "y": 36.33788119023024,
                "z": "NaN"
            }
        },
        {
            "title": "آرایشگاه مردانه آزادی",
            "address": "بلوار امامت، امامت 6",
            "category": "place",
            "type": "hair_care",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله آزادشهر",
            "location": {
                "x": 59.53280338931937,
                "y": 36.32112802605641,
                "z": "NaN"
            }
        },
        {
            "title": "دکه روزنامه فروشی پایانه آزادی",
            "address": "بلوار وکیل آباد",
            "category": "place",
            "type": "news_stand",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله آزادشهر",
            "location": {
                "x": 59.534917,
                "y": 36.317397699999994,
                "z": "NaN"
            }
        },
        {
            "title": "میدان آزادی (فلکه پارک)",
            "address": "پل آزادی",
            "category": "place",
            "type": "town_square",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله دانشگاه",
            "location": {
                "x": 59.540574324945034,
                "y": 36.31507382936625,
                "z": "NaN"
            }
        },
        {
            "title": "کارواش آزادی",
            "address": "بلوار سید رضی، سیدرضی 46",
            "category": "place",
            "type": "car_wash",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله سیدرضی",
            "location": {
                "x": 59.521802111019156,
                "y": 36.33803379099843,
                "z": "NaN"
            }
        },
        {
            "title": "درب میدان آزادی پارک ملت",
            "address": "زیرگذر میدان آزادی",
            "category": "place",
            "type": "entrance",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله آزادشهر",
            "location": {
                "x": 59.53974549478894,
                "y": 36.31643569086812,
                "z": "NaN"
            }
        },
        {
            "title": "ورودی مترو ایستگاه آزادی",
            "address": "بلوار ملک آباد",
            "category": "place",
            "type": "metro_entrance",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله ملک آباد",
            "location": {
                "x": 59.54458236694337,
                "y": 36.31272506713864,
                "z": "NaN"
            }
        },
        {
            "title": "ورودی مترو ایستگاه آزادی",
            "address": "بلوار ملک آباد",
            "category": "place",
            "type": "metro_entrance",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله نوفل لوشاتو",
            "location": {
                "x": 59.544410705566406,
                "y": 36.31237030029296,
                "z": "NaN"
            }
        },
        {
            "title": "آکادمی پارکور آزادی",
            "category": "place",
            "type": "stadium",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله ولیعصر",
            "location": {
                "x": 59.526407910792,
                "y": 36.352386115982185,
                "z": "NaN"
            }
        },
        {
            "title": "املاک آزادی",
            "address": "بلوار معلم",
            "category": "place",
            "type": "real_estate_agency",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله دانشجو",
            "location": {
                "x": 59.501091845132436,
                "y": 36.336599701370126,
                "z": "NaN"
            }
        },
        {
            "title": "آشپزخانه آزادی",
            "address": "حر عاملی",
            "category": "place",
            "type": "meal_delivery",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله حجت",
            "location": {
                "x": 59.58995038757027,
                "y": 36.319777606051716,
                "z": "NaN"
            }
        },
        {
            "title": "آزادی",
            "address": "بلوار خواجه ربیع، خیابان شهید یوسف زاده، یوسف زاده 8، یوسف زاده 6/3",
            "category": "place",
            "type": "park",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله خواجه ربیع",
            "location": {
                "x": 59.634921299999995,
                "y": 36.33853619999999,
                "z": "NaN"
            }
        },
        {
            "title": "بوستان آزادی",
            "address": "خیابان شهید یوسف زاده، یوسف زاده 12، یوسف زاده 6/3، یوسف زاده 6/7",
            "category": "place",
            "type": "park",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله خواجه ربیع",
            "location": {
                "x": 59.6351601,
                "y": 36.33986519999999,
                "z": "NaN"
            }
        },
        {
            "title": "دبستان آزادی (دولتی)",
            "address": "بلوار سرافرازان، سرافرازان 28، رهایی3/7-رهایی3/2",
            "category": "place",
            "type": "formal_school",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله سرافرازان",
            "location": {
                "x": 59.50994229441166,
                "y": 36.2952944312223,
                "z": "NaN"
            }
        },
        {
            "title": "کلینیک ترک اعتیاد آزادی",
            "address": "بلوار احمدآباد، پاستور",
            "category": "place",
            "type": "addiction_clinic",
            "region": "مشهد، خراسان رضوی",
            "neighbourhood": "محله بهشت",
            "location": {
                "x": 59.581735,
                "y": 36.29528719999998,
                "z": "NaN"
            }
        }
    ]
}
        

اینبار جستجوی کلمه آزادی ولی حول طول و عرض جغرافیایی 51.3355413 , 35.6999053 (تهران) به این صورت است:

و پاسخ دریافت شده از سرور به صورت زیر می باشد:

            {
    "count": 30,
    "items": [
        {
            "title": "برج میدان آزادی",
            "address": "میدان آزادی",
            "category": "place",
            "type": "point_of_interest",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله استاد معین",
            "location": {
                "x": 51.33806134577803,
                "y": 35.699739812739935,
                "z": "NaN"
            }
        },
        {
            "title": "میدان آزادی",
            "address": "میدان آزادی",
            "category": "municipal",
            "type": "roundabout",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله استاد معین",
            "location": {
                "x": 51.33535615742,
                "y": 35.700077048324,
                "z": "NaN"
            }
        },
        {
            "title": "حوضچه میدان آزادی",
            "address": "بزرگراه لشگری",
            "category": "place",
            "type": "interests",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله استاد معین",
            "location": {
                "x": 51.337430724562076,
                "y": 35.69971719018604,
                "z": "NaN"
            }
        },
        {
            "title": "آزادی",
            "address": "آزادی",
            "category": "municipal",
            "type": "primary",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله استاد معین",
            "location": {
                "x": 51.34008459044491,
                "y": 35.69990999018817,
                "z": "NaN"
            }
        },
        {
            "title": "بیمارستان آزادی",
            "address": "بزرگراه یادگار امام، میمنت",
            "category": "place",
            "type": "hospital",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله زنجان جنوبی",
            "location": {
                "x": 51.357253789901726,
                "y": 35.69693220935499,
                "z": "NaN"
            }
        },
        {
            "title": "شیشه مینا (استادیوم آزادی)",
            "address": "شیشه مینا (استادیوم آزادی)",
            "category": "municipal",
            "type": "primary",
            "region": "تهران، استان تهران",
            "neighbourhood": "شهرک فرهنگیان",
            "location": {
                "x": 51.28661275,
                "y": 35.7155347,
                "z": "NaN"
            }
        },
        {
            "title": "بلوار غربی ورزشگاه آزادی",
            "address": "بلوار غربی ورزشگاه آزادی",
            "category": "municipal",
            "type": "primary",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله ورزشگاه آزادی",
            "location": {
                "x": 51.26638533735376,
                "y": 35.715470710176405,
                "z": "NaN"
            }
        },
        {
            "title": "دریاچه ورزشگاه آزادی",
            "category": "place",
            "type": "interests",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله ورزشگاه آزادی",
            "location": {
                "x": 51.27144328374694,
                "y": 35.72759607802438,
                "z": "NaN"
            }
        },
        {
            "title": "شیشه مینا (استادیوم آزادی)",
            "address": "شیشه مینا (استادیوم آزادی)",
            "category": "municipal",
            "type": "roundabout",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله ورزشگاه آزادی",
            "location": {
                "x": 51.268901835887775,
                "y": 35.73609439859721,
                "z": "NaN"
            }
        },
        {
            "title": "کنارگذر آزادی",
            "address": "کنارگذر آزادی",
            "category": "municipal",
            "type": "secondary",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله استاد معین",
            "location": {
                "x": 51.34617884345915,
                "y": 35.699779895418914,
                "z": "NaN"
            }
        },
        {
            "title": "کنارگذر آزادی",
            "address": "کنارگذر آزادی",
            "category": "municipal",
            "type": "secondary",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله توحید",
            "location": {
                "x": 51.37248723329772,
                "y": 35.70070062676796,
                "z": "NaN"
            }
        },
        {
            "title": "آزادی",
            "address": "کاشانی",
            "category": "municipal",
            "type": "secondary",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله یافت آباد",
            "location": {
                "x": 51.34911402003776,
                "y": 35.664506514701074,
                "z": "NaN"
            }
        },
        {
            "title": "پارک آزادی",
            "address": "آزادی، هوشیار، ابراهیمی، شورا سوم",
            "category": "place",
            "type": "park",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله دکتر هوشیار",
            "location": {
                "x": 51.351514330734915,
                "y": 35.6987029480465,
                "z": "NaN"
            }
        },
        {
            "title": "شهدای آزادی",
            "address": "آزادی، هوشیار، ابراهیمی",
            "category": "place",
            "type": "park",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله دکتر هوشیار",
            "location": {
                "x": 51.35158347947666,
                "y": 35.699200470180884,
                "z": "NaN"
            }
        },
        {
            "title": "بوستان شهدای آزادی",
            "address": "آزادی",
            "category": "place",
            "type": "park",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله دکتر هوشیار",
            "location": {
                "x": 51.35164,
                "y": 35.6998382,
                "z": "NaN"
            }
        },
        {
            "title": "پارک آزادی",
            "address": "فلکه اول صادقیه، رحیمی، اکرمی",
            "category": "place",
            "type": "park",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله صادقیه",
            "location": {
                "x": 51.3410326,
                "y": 35.719053499999994,
                "z": "NaN"
            }
        },
        {
            "title": "مرکز خرید سپهر آزادی",
            "address": "آزادی",
            "category": "place",
            "type": "shopping_mall",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله نصرت",
            "location": {
                "x": 51.37975560000003,
                "y": 35.700978199999966,
                "z": "NaN"
            }
        },
        {
            "title": "برج نگین آزادی",
            "address": "آزادی",
            "category": "place",
            "type": "commercial_complex",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله نصرت",
            "location": {
                "x": 51.38094507823783,
                "y": 35.70097434339961,
                "z": "NaN"
            }
        },
        {
            "title": "موزه برج آزادی (تالار کهن)",
            "address": "میدان آزادی",
            "category": "place",
            "type": "museum",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله استاد معین",
            "location": {
                "x": 51.33863560490706,
                "y": 35.6997449384972,
                "z": "NaN"
            }
        },
        {
            "title": "پست ۶۳ کیلوولت آزادی(مقر مانور آزادی)",
            "address": "بزرگراه لشگری",
            "category": "place",
            "type": "local_government_office",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله فرودگاه مهرآباد",
            "location": {
                "x": 51.330880524585574,
                "y": 35.69898226038998,
                "z": "NaN"
            }
        },
        {
            "title": "استادیوم آزادی",
            "category": "place",
            "type": "stadium",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله ورزشگاه آزادی",
            "location": {
                "x": 51.2756365,
                "y": 35.724463099999994,
                "z": "NaN"
            }
        },
        {
            "title": "بوستان ورزشگاه آزادی",
            "address": "بلوار غربی ورزشگاه آزادی، شیشه مینا (استادیوم آزادی)",
            "category": "place",
            "type": "park",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله ورزشگاه آزادی",
            "location": {
                "x": 51.27605029999999,
                "y": 35.727651200000004,
                "z": "NaN"
            }
        },
        {
            "title": "پايگاه واکسیناسیون سیار اورژانس میدان آزادی",
            "address": "بزرگراه لشگری",
            "category": "place",
            "type": "vaccine",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله استاد معین",
            "location": {
                "x": 51.33753659975725,
                "y": 35.69980066074036,
                "z": "NaN"
            }
        },
        {
            "title": "پست برق آزادی",
            "address": "قزوین",
            "category": "place",
            "type": "local_government_office",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله سلیمانی - تیموری",
            "location": {
                "x": 51.365921380672084,
                "y": 35.667642426742376,
                "z": "NaN"
            }
        },
        {
            "title": "پارکینگ برج آزادی",
            "address": "بزرگراه لشگری",
            "category": "place",
            "type": "parking",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله استاد معین",
            "location": {
                "x": 51.336074520349364,
                "y": 35.7007749384552,
                "z": "NaN"
            }
        },
        {
            "title": "بازار روز آزادی",
            "address": "بزرگراه لشگری",
            "category": "place",
            "type": "vegetable_market",
            "region": "تهران، استان تهران",
            "neighbourhood": "شهرک آپادانا",
            "location": {
                "x": 51.33357564013263,
                "y": 35.70022499842319,
                "z": "NaN"
            }
        },
        {
            "title": "ایستگاه پلیس کلانتری 135 آزادی",
            "address": "بزرگراه لشگری",
            "category": "place",
            "type": "police",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله استاد معین",
            "location": {
                "x": 51.33712230469234,
                "y": 35.7010645215458,
                "z": "NaN"
            }
        },
        {
            "title": "رستوران بین المللی برج آزادی",
            "address": "بزرگراه لشگری",
            "category": "place",
            "type": "restaurant",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله استاد معین",
            "location": {
                "x": 51.33766840068348,
                "y": 35.699730572703984,
                "z": "NaN"
            }
        },
        {
            "title": "مسجد هفتاد و دو تن میدان آزادی",
            "address": "بزرگراه لشگری، رحمانی",
            "category": "place",
            "type": "mosque",
            "region": "تهران، استان تهران",
            "neighbourhood": "شهرک آپادانا",
            "location": {
                "x": 51.33211998346048,
                "y": 35.70004390331042,
                "z": "NaN"
            }
        },
        {
            "title": "پست برق فوق توزیع آزادی",
            "address": "بزرگراه لشگری",
            "category": "place",
            "type": "point_of_interest",
            "region": "تهران، استان تهران",
            "neighbourhood": "محله فرودگاه مهرآباد",
            "location": {
                "x": 51.33108767903619,
                "y": 35.69885923888011,
                "z": "NaN"
            }
        }
    ]
}
        

در این پروژه برای ارسال درخواست جستجو و دریافت نتیجه از SDK سرویس های نشان استفاده شده است.

AndroidManifest.xml:

دسترسی‌ زیر را برای استفاده از اینترنت به فایل مانیفست برنامه اضافه کنید:

            <uses-permission android:name="android.permission.INTERNET"/>
        

activity_search.xml:

در این صفحه علاوه بر المان نقشه ، یک EditText برای نوشتن عبارت جستجو ، یکRecyclerView برای نمایش لیست نتایج جستجو و دو ImageButton وجود دارد که ImageButton با id = show_markers_imageButton برای نمایش نتایج جستجو بر روی نقشه به صورت مارکر استفاده میشود و ImageButton با id = show_search_imageButton برای نمایش نتایج جستجو در RecyclerView استفاده میشود .

            <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context=".activity.Search">

    <org.neshan.mapsdk.MapView
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <EditText
        android:id="@+id/search_editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="3dp"
        android:layout_marginLeft="6dp"
        android:layout_marginRight="6dp"
        android:background="@drawable/edit_text_search_bg"
        android:hint="جستجو"
        android:imeOptions="actionSearch"
        android:inputType="text"
        android:textSize="16dp"/>

    <ImageButton
        android:id="@+id/show_markers_imageButton"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_below="@id/search_editText"
        android:layout_marginTop="3dp"
        android:layout_marginRight="15dp"
        android:layout_toLeftOf="@+id/center_point"
        android:background="@drawable/toggle_button_on_bg"
        android:onClick="showMarkersClick"
        app:srcCompat="@drawable/ic_marker_two"
        android:tint="#ffffff" />

    <TextView
        android:id="@+id/center_point"
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:layout_below="@id/search_editText"
        android:layout_centerHorizontal="true"
        android:text="" />

    <ImageButton
        android:id="@+id/show_search_imageButton"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_below="@id/search_editText"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="4dp"
        android:layout_marginBottom="4dp"
        android:layout_toRightOf="@+id/center_point"
        android:background="@drawable/toggle_button_on_bg"
        android:tint="#ffffff"
        app:srcCompat="@drawable/ic_list_search"
        android:onClick="showSearchClick"/>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/show_markers_imageButton"/>

</RelativeLayout>
        

SearchActivity.kt:

متد initLayoutRefrences برای دادن مقادیر اولیه به تمامی المان‌های مربوط به رابط کاربری نوشته شده‌است.

همچنین Listenerهای مربوط به EditText نیز در همین متد قرار دارد .

بعد از تغییر در متن EditText ، متد afterTextChanged فراخوانی میشود که در این متد ، متد search فراخوانی میشود تا درخواست جستجو ارسال و پاسخ آن دریافت شود.

با کلیک بر روی آیکون جستجوی کیبرد ، متد onEditorAction فراخوانی میشود که در این متد نیز متد search فراخوانی میشود .

            // Initializing layout references (views, map and map events)
    private fun initLayoutReferences() {
        // Initializing views
        initViews()
        // Initializing mapView element
        initMap()

        //listen for search text change
        editText.addTextChangedListener(object : TextWatcher {
            override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
            override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
            override fun afterTextChanged(s: Editable) {
                search(s.toString())
                Log.i(TAG, "afterTextChanged: $s")
            }
        })

        editText.setOnEditorActionListener(object :TextView.OnEditorActionListener{
            override fun onEditorAction(p0: TextView?, p1: Int, p2: KeyEvent?): Boolean {
                if(p1 == EditorInfo.IME_ACTION_SEARCH){
                    closeKeyBoard()
                    search(editText.text.toString())
                }
                return false
            }
        })
    }
        

در متد initViews ارتباط بین Viewهای فایل activity_search.xml و اشیای مربوطه در جاوا برقرار شده است.

            // We use findViewByID for every element in our layout file here
    private fun initViews() {
        map = findViewById(R.id.mapview)
        editText = findViewById(R.id.search_editText)
        recyclerView = findViewById(R.id.recyclerView)
        items = java.util.ArrayList()
        adapter = SearchAdapter(items, this@SearchActivity)
        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.adapter = adapter
    }
        

در متد initMap یک موقعیت جغرافیایی ساخته می شود، سپس نقشه به این موقعیت منتقل شده و یک نشانگر نیز در این مکان اضافه می شود که نشان دهنده مکانی است که جستجو با محوریت آن انجام می شود.

            private fun initMap() {
        // Setting map focal position to a fixed position and setting camera zoom
        val latLng = LatLng(35.767234, 51.330743)
        map.moveCamera(latLng, 0f)
        map.setZoom(14f, 0f)
        centerMarker = Marker(latLng, getCenterMarkerStyle())
        map.addMarker(centerMarker)
    }
        

حالا به متد search نگاه بیندازید .

این متد بعد از هر بار تغییر در EditText در متد afterTextChanged فراخوانی میشود . طول و عرض جغرافیایی وسط صفحه ، به عنوان طول و عرض جغرافیایی مرجع انتخاب میشود و centerMarker در همین مکان نشان داده میشد تا مشخص شود جستجو پیرامون چه نقطه ای انجام شده است .

سپس با استفاده از متد Builder از کلاس NeshanSearch، پارامترهای ورودی وب سرویس مقدار دهی می شود و شی از نوع NeshanSearch با صدا زدن متد build ساخته می شود. حال با صدا زدن متد call این شی می توانیم وب سرویس را صدا زده و نتیجه آن را در Callback که به عنوان ورودی متد call تعریف کرده ایم دریافت کنیم.

در صورت موفقیت آمیز بودن دریافت پاسخ از سرور، onResponse فراخوانی می شود و بدنه ( body ) پارامتر response که از نوع NeshanSearchResult است شامل لیستی از کلاس Item خواهد بود. برای نمایش لیست نتایج در RecyclerView این لیست به متد updateList فرستاده میشود

                private fun search(term: String) {
        val searchPosition: LatLng = map.getCameraTargetPosition()
        updateCenterMarker(searchPosition)
        NeshanSearch.Builder("service.oz8cfBdCEdmTv8qGx1835A1OPcVdq5DcTGgMN6z9")
            .setLocation(searchPosition)
            .setTerm(term)
            .build().call(object : Callback<NeshanSearchResult?> {
                override fun onResponse(
                    call: Call<NeshanSearchResult?>,
                    response: Response<NeshanSearchResult?>
                ) {
                    if (response.code() == 403) {
                        Toast.makeText(
                            this@SearchActivity,
                            "کلید دسترسی نامعتبر",
                            Toast.LENGTH_LONG
                        ).show()
                        return
                    }
                    if (response.body() != null) {
                        val result = response.body()
                        items = result!!.items
                        adapter.updateList(items)
                    }
                }

                override fun onFailure(call: Call<NeshanSearchResult?>, t: Throwable) {
                    Log.i(TAG, "onFailure: " + t.message)
                    Toast.makeText(this@SearchActivity, "ارتباط برقرار نشد!", Toast.LENGTH_SHORT)
                        .show()
                }
            })
    }

        

با کلیک بر روی ImageButton با id = show_markers_imageButton متد showMarkersClick فراخوانی میشود . در این متد ، مکان های یافت شده به وسیله مارکرها بر روی نقشه نمایش داده میشوند و بعد از آن به وسیله متد moveToCameraBounds میزان نمایش نقشه ، بر اساس محدوده مارکرهای روی نقشه تنظیم میشود .

متد moveToCameraBounds به آبجکت از کلاس LatLngBounds نیاز دارد که مقادیر مینیمم طول و عرض جغرافیایی و ماکسیمم طول و عرض جغرافیایی را که میخواهیم به عنوان محدوده نمایش نقشه در در نظر بگیریم به constructor کلاس Bound میدهیم .

                fun showMarkersClick(view: View) {
        adapter.updateList(java.util.ArrayList())
        closeKeyBoard()
        clearMarkers()
        var minLat = Double.MAX_VALUE
        var minLng = Double.MAX_VALUE
        var maxLat = Double.MIN_VALUE
        var maxLng = Double.MIN_VALUE
        for (item in items) {
            val location = item.location
            val latLng = location.latLng
            markers.add(addMarker(latLng, 15f)!!)
            minLat = Math.min(latLng.latitude, minLat)
            minLng = Math.min(latLng.longitude, minLng)
            maxLat = Math.max(latLng.latitude, maxLat)
            maxLng = Math.max(latLng.longitude, maxLng)
        }
        if (items.isNotEmpty()) {
            map.moveToCameraBounds(
                LatLngBounds(LatLng(minLat, minLng), LatLng(maxLat, maxLng)),
                ScreenBounds(
                    ScreenPos(0f, 0f),
                    ScreenPos(map.width.toFloat(), map.height.toFloat())
                ),
                true, 0.5f
            )
        }
    }

    private fun clearMarkers() {
        for (marker in markers) {
            map.removeMarker(marker)
        }
        markers.clear()
    }

        

با کلیک بر روی ImageButton با id = show_search_imageButton متد showSearchClick فراخوانی میشود و دوباره RecyclerView نمایش داده میشود .

                fun showSearchClick(view: View?) {
        closeKeyBoard()
        adapter!!.updateList(items!!)
        clearMarkers()
    }

        

با کلیک بر روی هر یک از آیتم های RecyclerView متد onSearchItemClick فراخوانی میشود و مکان آیتم کلیک شده بر روی نقشه نمایش داده میشود . به کلاس SearchAdapter و فایل item_search.xml مراجعه کنید .

                override fun onSearchItemClick(LatLng: LatLng?) {
        closeKeyBoard()
        clearMarkers()
        adapter.updateList(java.util.ArrayList())
        map.moveCamera(LatLng, 0f)
        map.setZoom(16f, 0f)
        addMarker(LatLng!!, 30f)
    }