سرویس ماتریس فاصله – B4A

Android SDK Resources

هدف از این بخش از پروژه، استفاده از وب سرویس ماتریس فاصله (Distance Matrix API) در B4A است.

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

کتابخانه های مورد نیاز

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

  • JavaObject

وب سرویس

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

وب سرویس ماتریس فاصله

 

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

            {
	"status": "Ok",
	"rows": [
    	{
        	"elements": [
            	{
                	"status": "Ok",
                	"duration": {
                    	"value": 699,
                    	"text": "۱۲ دقیقه"
                	},
                	"distance": {
                    	"value": 8332,
                    	"text": "۸ کیلومتر"
                	}
            	},
            	{
                	"status": "Ok",
                	"duration": {
                    	"value": 605,
                    	"text": "۱۰ دقیقه"
                	},
                	"distance": {
                    	"value": 5373,
                    	"text": "۵ کیلومتر"
                	}
            	}
        	]
    	},
    	{
        	"elements": [
            	{
                	"status": "Ok",
                	"duration": {
                    	"value": 511,
                    	"text": "۹ دقیقه"
                	},
                	"distance": {
                    	"value": 5317,
                    	"text": "۵ کیلومتر"
                	}
            	},
            	{
                	"status": "Ok",
                	"duration": {
                    	"value": 69,
                    	"text": "۱ دقیقه"
                	},
                	"distance": {
                    	"value": 389,
                    	"text": "۴۰۰ متر"
                	}
            	}
        	]
    	}
	],
	"origin_addresses": [
    	"36.317559,59.532226",
    	"36.337077,59.530843"
	],
	"destination_addresses": [
    	"36.350681,59.545227",
    	"36.337012,59.530023"
	]
}
        

پیاده سازی

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

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

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

جهت صدا زدن سرویس ماتریس فاصله از طریق اس دی کی B4A نشان میتوانید از متد neshanDistanceMatrix به صورت زیر استفاده کنید:

            NeshanMapSdk1.neshanDistanceMatrix(API-KEY(String),Type(String),origins(String),destinations(String))
        

پارامترها:

API-KEY: کلید دسترسی از نوع string که در پنل توسعه دهندگان ایجاد کرده اید.

type: مشخص کننده نوع محاسبه مسافت و زمان بر اساس وسیله نقلیه که مقدار آن میتواند car برای خودرو و motorcycle برای موتور سیکلت باشد.

origins: لیستی از مختصات نقاط شروع. هر کدام از این مختصات باید به فرم latitude,longitude باشند که با کاما (,) از یکدیگر جدا شده‌اند. در صورتی که تعداد مختصات بیشتر از یک عدد باشد از علامت پایپ ( | ) برای جداسازی آنها استفاده می‌شود.

destinationsلیستی از مختصات نقاط پایانی که قالب آن مانند origins است.

پس از صدا زدن این سرویس، خروجی توسط متد distanceMatrixResultReceived دریافت میشود.

جهت دریافت خروجی متد distanceMatrixResultReceived را در اکتیویتی خود به صورت زیر پیاده سازی کنید:

            Sub distanceMatrixResultReceived(distanceMatrixResultObject As Object)
	
End Sub
        

در صورتی که سرویس به هر دلیلی با خطا مواجه شود، متد distanceMatrixResultReceivingError صدا زده خواهد شد.

بنابراین در اکتیویتی خود، متد distanceMatrixResultReceivingError را برای دریافت خطا به صورت زیر پیاده سازی کنید.

            Sub distanceMatrixResultReceivingError(errorObject As Object)
	
End Sub
        

متغیر errorObject حاوی خطایی است که از سمت سرویس برگردانده شده است.

در صورتی که سرویس با خطا مواجه نشود، متغیر distanceMatrixResultObject در متد distanceMatrixResultReceived حاوی خروجی سرویس ماتریس فاصله خواهد بود.

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

            Sub distanceMatrixResultReceived(distanceMatrixResultObject As Object)
	Private distanceMatrixResultJO As JavaObject = distanceMatrixResultObject
	Private rows As List = distanceMatrixResultJO.GetField("dMRows")
	Log(distanceMatrixResultJO.GetField("dMOriginAddresses"))
	Log(distanceMatrixResultJO.GetField("dMDestinationAddresses"))
	For Each row As JavaObject In rows
		Private elements As List = row.GetField("dMRowElements")
		For Each element As JavaObject In elements
			Log(element.GetFieldJO("dMElementDistance").RunMethod("getText",Null))
			Log(element.GetFieldJO("dMElementDistance").RunMethod("getValue",Null))
			
			Log(element.GetFieldJO("dMElementDuration").RunMethod("getText",Null))
			Log(element.GetFieldJO("dMElementDuration").RunMethod("getValue",Null))
		Next	
	Next
End Sub
        

در مثال بالا ابتدا خروجی سرویس که در متغیر distanceMatrixResultObject است داخل یک متغیر از نوع JavaObject به نام distanceMatrixResultJO ریخته میشود. با این کار متغیر distanceMatrixResultObject تبدیل به یک متغیر از نوع JavaObject شده و داخل متغیر distanceMatrixResultJo قرار میگیرد.

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

مثال بالا مقادیر مربوط به خروجی سرویس را استخراج کرده و آنها را Log میکند.

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

در تکه کد بالا همانطور که نام سرویس distanceMatrix است، ابتدای فیلدها حروف dM به صورت camel case قرار گرفته است

 

نام فیلدها:

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

            status
rows
	elements
		status
		duration
			value
			text
		distance
			value
			text
origin_addresses
destination_addresses
        

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

            dMStatus
dMRows
	dmRowElements
		dMElementStatus
		dMElementDuration
			value
			text
		dMElementdistance
			value
			text
dMOriginAddresses
dMDestinationAddresses
        

دقت داشته باشید که برخی از فیلدهایی که بدون نام مخفف سرویس در اول نام آنها هستند (value و text) از طریق متد RunMethod یا RunMethodJO قابل دسترسی هستند.

متد RunMethod و RunMethodJO متدهایی هستند که برای صدا زدن متدهای جاوایی مورد استفاده قرار میگیرند.

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

متغیرهایی همچون text و value دارای یک متد Getter برای بدست آوردن مقدار آنها هستند. بنابراین برای بدست آوردن مقدار متغیرهای text و value میتوان از متد Getter آنها به صورت زیر استفاده کرد:

            javaObject.RunMethod("Java method name",Java method parameters)
        

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