جستجو

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

نسخه 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 نشان در برنامه خود باید در پنل توسعه دهندگان نشان ثبت نام کنید و فایل لایسنس برنامه خود را به صورت رایگان دریافت کنید از اینجا شروع کنید

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

خطوط زیر را به وابستگی های فایل build.gradle (Module.app) اضافه کنید:

            dependencies {
    implementation 'neshan-android-sdk:services-sdk:1.0.1'
    implementation 'neshan-android-sdk:common-sdk:0.0.2'
    }
        

می توانید سورس پروژه SDK سرویس های نشان را در لینک زیر مشاهده کنید

سورس کد پروژه 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_marginLeft="6dp"
            android:layout_marginTop="3dp"
            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"
            android:tint="#ffffff"
            app:srcCompat="@drawable/ic_marker_two" />

        <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:onClick="showSearchClick"
            android:tint="#ffffff"
            app:srcCompat="@drawable/ic_list_search" />


        <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>
        

Search.java:

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

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

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

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

            // Initializing layout references (views, map and events)
    private void initLayoutReferences() {
        // Initializing views
        initViews();
        // Initializing mapView elements
        initMap();

        //listen for search text change
        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                doSearch(s.toString());
            }
        });
        
         editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == EditorInfo.IME_ACTION_SEARCH){
                    closeKeyBoard();
                    doSearch(editText.getText().toString());

                }
                return false;
            }
        });

    }
        

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

            // We use findViewByID for every element in our layout file here
    private void initViews() {
        map = findViewById(R.id.map);
        editText = findViewById(R.id.search_editText);
        recyclerView = findViewById(R.id.recyclerView);
        items = new ArrayList<>();
        adapter = new SearchAdapter(items, this);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);
    }
        

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

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

قبل از بررسی متد search که متد اصلی این اکتیویتی است ، به پکیج model.search نگاهی بیندازید . برای دریافت و تجزیه فایل json که به عنوان نتیجه جستجو برگردانده میشود ، به این کلاس ها که بر اساس همان پاسخ سرور است نیاز داریم .

هچنین به کلاس RetrofitClientInstance و اینترفیس GetDataService بروید و به متد getNeshanSearch که برای دریافت نتایج جستجو استفاده میشود نگاه کنید . برای استفاده از سرویس های نشان به API_KEY مرتبط با سرویس مورد نظر خود نیاز دارید که میتوانید به صورت رایگان از پنل توسعه دهندگان نشان بدست آروید .

اگر متوجه نشدید که این کلاس ها و اینترفیس چه کاری انجام میدهند هیچ جای نگرانی نیست ، به لینک های اوایل صفحه مراجعه کنید و با Retrofit و Gson آشنا شوید .

            public interface ReverseService{

  // TODO: replace "YOUR_API_KEY" with your api key
  @Headers("Api-Key: service.PnRV9ocd8zm9QYYlJUNLJoAihE3hfy34WUZ6jcjr")
  @GET
  Call<NeshanSearch> getNeshanSearch(@Url String url);
}
        

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

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

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

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

            private void search(String term) {
      LatLng searchPosition = map.getCameraTargetPosition();
      new NeshanSearch.Builder("service.PnRV9ocd8zm9QYYlJUNLJoAihE3hfy34WUZ6jcjr")
              .setLocation(searchPosition)
              .setTerm(term)
              .build().call(new Callback<NeshanSearchResult>() {
          @Override
          public void onResponse(Call<NeshanSearchResult> call, Response<NeshanSearchResult> response) {
              NeshanSearchResult result = response.body();
              items=result.getItems();
              adapter.updateList(items);
              updateCenterMarker(searchPosition);
          }

          @Override
          public void onFailure(Call<NeshanSearchResult> call, Throwable t) {
              Log.i(TAG, "onFailure: " + t.getMessage());
              Toast.makeText(Search.this, "ارتباط برقرار نشد!", Toast.LENGTH_SHORT).show();
          }
      });

  }
        

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

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

            public void showMarkersClick(View view) {
        adapter.updateList(new ArrayList<Item>());
        closeKeyBoard();
        clearMarkers();
        double minLat = Double.MAX_VALUE;
        double minLng = Double.MAX_VALUE;
        double maxLat = Double.MIN_VALUE;
        double maxLng = Double.MIN_VALUE;
        for (Item item : items) {
            Location location = item.getLocation();
            LatLng latLng = location.getLatLng();
            markers.add(addMarker(latLng, 15f));
            minLat = Math.min(latLng.getLatitude(), minLat);
            minLng = Math.min(latLng.getLongitude(), minLng);
            maxLat = Math.max(latLng.getLatitude(), maxLat);
            maxLng = Math.max(latLng.getLongitude(), maxLng);
        }

        if (items.size() > 0) {
            map.moveToCameraBounds(new LatLngBounds(new LatLng(minLat,minLng ), new LatLng(maxLat, maxLng)),
                    new ScreenBounds(new ScreenPos(0, 0), new ScreenPos(map.getWidth(), map.getHeight())),
                    true, 0.5f);
        }

    }

    private void clearMarkers() {
        map.clearMarkers();
        markers.clear();
    }
        

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

            public void showSearchClick(View view) {
      closeKeyBoard();
      adapter.updateList(items);
      markerLayer.clear();
  }
        

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

            @Override
 public void onSeachItemClick(LngLat lngLat) {
     closeKeyBoard();
     clearMarkers();
     adapter.updateList(new ArrayList<Item>());
     map.moveCamera(LatLng, 0);
     map.setZoom(16f, 0);
     addMarker(LatLng, 30f);
 }