جستجو – B4A

Android SDK Resources

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

برای پیاده سازی این مثال باید کتابخانه های زیر را در پنجره Libraries Manager تیک بزنید:

  • JavaObject
  • Reflection
  • GPS

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

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

برای جستجوی یک عبارت حول یک طول و عرض جغرافیایی مشخص، فرمت درخواست ما باید به صورت زیر و از نوع 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"
            }
        }
    ]
}    
        

به منظور استفاده از سرویس های نشان، شما باید یک Api-Key در پنل توسعه دهندگان نشان ایجاد کرده و از آن در ارسال سرویس استفاده کنید.

سپس در فایل Main پروژه در قسمت Region Project Attributes خط زیر را اضافه کنید:

#AdditionalJar: common-release.aar
#AdditionalJar: gson-2.8.5.jar

اکتیویتی جستجو دارای یک شیء نقشه، یک EditText و یک CustomListView به صورت زیر است:

جهت تعریف شیء نقشه در کد روی View ی مربوط به نقشه که نام آن در این مثال NeshanMapSdk1 است راست کلیک کرده و از منوی باز شونده Generate، گزینه Dim NeshanMapSdk1 as NeshanMapSdk را انتخاب میکنیم. پس از این عمل، شیء نقشه در فایل کد مربوط به اکتیویتی جستجو (SearchActivity) در قسمت Globals اضافه میشود. جهت تعریف EditText و CustomListView نیز به همین صورت عمل میکنیم.

            Sub Globals
	'These global variables will be redeclared each time the activity is created.
	'These variables can only be accessed from this module.

	Private NeshanMapSdk1 As NeshanMapSdk
    Private EditText1 As EditText
	Private CustomListView1 As CustomListView
End Sub
        

نحوه عملکرد این اکتیویتی به این صورت است که پس از تایپ عبارت مورد نظر در EditText مختصات نقطه وسط نقشه توسط متغیر cameraTargetPosition که روی شیء نقشه است دریافت شده و در یک متغیر به نام centerPointLocationJO که از نوع JavaObject است ریخته میشود. سپس یک متغیر از نوع Location به نام centerPointLocation تعریف شده و مقادیر latitude و longitude از متغیر centerPointLocationJO استخراج شده و در متغیر centerPointLocation ست میشود. سپس سرویس جستجو با توجه به مقادیر بدست آمده صدا زده میشود. 

نحوه بدست آوردن نقطه وسط نقشه به صورت زیر است:

            Dim centerPointLocationJO As JavaObject = NeshanMapSdk1.CameraTargetPosition
Dim centerPointLocation As Location
centerPointLocation.Initialize
centerPointLocation.Latitude = centerPointLocationJO.RunMethod("getLatitude",Null)
centerPointLocation.Longitude= centerPointLocationJO.RunMethod("getLongitude",Null)
        

متد RunMethod برای صدا زدن متدهای جاوایی مربوط به یک JavaObject استفاده میشود.

در صورتی که متد جاوایی دارای پارامتر باشد (در مثال بالا متد getLatitude و getLongitude بدون پارامتر است)، توسط پارامتر دوم متد RunMethod میتوان پارامترهای متدهای جاوایی را به آن ارسال کرد.

برای ارسال پارامترهای متد جاوایی میتوان از کلمه کلیدی Array استفاده کرده و مقادیر پارامترهای مربوط به متد جاوایی را از طریق آن ارسال کرد. در صورتی که متد جاوایی بدون پارامتر باشد، مقدار Null به عنوان پارامتر دوم متد RunMethod ارسال میشود.

در تکه کد بالا متد RunMethod که روی متغیر centerPointLocationJO که از نوع JavaObject است صدا زده شده است و متد جاوایی getLatitude و getLongitude را برای بدست آوردن مقدار latitude و longitude صدا زده است.

ساختار سرویس جستجو به صورت زیر است:

            NeshanMapSdk1.neshanSearch(API-KEY(String), Latitude(Double), Longitude(Double), searchPhrase(String))
        

پارامترهای مربوط به سرویس search:

API-KEY: کلید دسترسی ساخته شده در پنل توسعه دهندگان نشان

Latitude: عرض جغرافیایی

Longitude: طول جغرافیایی

searchPhrase: عبارت جستجو

خروجی سرویس

پس از صدا زدن سرویس جستجو، در صورتی که خطایی در سرویس رخ ندهد خروجی سرویس در تابعی به نام searchResultReceived برگردانده خواهد شد و در صورتی که خطایی در ارسال یا دریافت سرویس رخ دهد، خروجی سرویس در تابعی به نام searchResultReceivingError برگردانده خواهد شد.

جهت دریافت نتیجه سرویس و خطا، باید این 2 تابع را به کد خود اضافه نمایید.

خروجی:

            Sub searchResultReceived(neshanSearchResultObject As Object)

End Sub
        

خطا:

            Sub searchResultReceivingError(errorObject As Object)

End Sub
        

استخراج نتایج جستجو:

پس از دریافت خروجی در تابع searchResultReceived خروجی در پارامتر این تابع که neshanSearchResultObject نام دارد بازگردانده میشود.

ماهیت متغیر neshanSearchResultObject از نوع Object است. برای استخراج مقادیر از این متغیر باید آن را تبدیل به یک JavaObject کنید. برای تبدیل این متغیر به JavaObject کافیست آن را به یک متغیر از نوع JavaObject به صورت زیر اختصاص دهید:

            Private neshanSearchResultJO As JavaObject = neshanSearchResultObject
        

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

متغیر neshanSearchResultJo شامل اجزای JSON بالاست که از طریق متد GetField و GetFieldJO میتوان به اجزای آن دسترسی داشت.

بر اساس خروجی سرویس که یک جیسون با ساختاری است که پیش تر به آن اشاره شد، توسط یک شی JavaObject میتوان مقادیر را به صورت زیر از آن استخراج کرد.

            Private neshanSearchResultJO As JavaObject = neshanSearchResultObject
	Log("Result count:" & neshanSearchResultJO.GetField("sCount"))
	Private items As List = neshanSearchResultJO.GetField("sItems")
	Private item As JavaObject
	For Each item As JavaObject In items
		CustomListView1.Add(createSearchItem(item.GetField("sItemTitle")),item)
	Next
	CustomListView1.AsView.Visible = True
        

پس از فراخوانده شدن تابع searchResultReceived و دریافت نتایج جستجو، CustomListView خالی میشود، چرا که احتمال وجود نتایج جستجوی قبلی در آن وجود دارد، پس از آن روی متغیر neshanSearchResultJO متد GetField صدازده میشود و مقادیر آرایه items را از آن استخراج میکند. سپس یک متغیر از نوع لیست به نام items تعریف شده و خروجی بدست آمده درون آن ریخته میشود. سپس لیست آیتم ها به عنوان پارامتر به تابعی به نام addItemsToListView داده میشود.

تابع addItemsToListView توسط یک حلقه For Each آیتم های لیست items را پیمایش میکند و به ازای هر آیتم، توسط فانکشن createSearchItem یک View برای هر سطر لیست ساخته و به CustomListView اضافه میکند.

تابع createSearchItem یک B4XView از فایل layout_search_item که Visual Designer آن را در عکس زیر مشاهده میکنید میسازد که داخل آن یک Label وجود دارد که عنوان نتیجه بدست آمده از جستجو را در آن نمایش میدهد. سپس View ی ساخته شده را به CustomListView اضافه میکند.

نحوه نام گذاری فیلدهای مربوط به هر سرویس به این صورت است که ابتدا حروف ابتدایی نام سرویس مورد نظر به صورت camel case آورده شده سپس نام فیلد پس از آن قرار میگیرد.

در تکه کد بالا همانطور که نام سرویس search است، ابتدای فیلدها حروف قرار گرفته است.

نام فیلدها:

نام فیلد در سرویس

            count
items
	title
	address
	neighbourhood
	region
	type
	category
	location
		y
		x
        

نام فیلد در اس دی کی

            sCount
sItems
	sItemTitle
	sItemAddress
	sItemNeighbourhood
	sItemRegion
	sItemType
	sItemCategory
	sItemLocation
		sLocationLatitude
		sLocationLongitude
        
فهرست مطالب این صفحه