مستندات جامع اندروید
نسخه 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);
}