سرویس فروشنده دوره گرد – B4A

Android SDK Resources

هدف از این بخش از پروژه، استفاده از وب سرویس نگاشت نقطه بر نقشه (Travelling salesman problemیا tsp) در B4A است.

این سرویس یک مشکل معروف و قدیمی بنام فروشنده دوره گرد را حل می کند. زمانیکه شخصی مانند مسئول تحویل بسته‌ها با هر وسیله نقلیه (وانت، موتور، خودروی معمولی، …)، بیش از 1 مقصد داشته باشد، این سرویس به کمک الگوریتم هوش مصنوعی و پردازش تمام حالات ممکن، بهترین و بهینه ترین ترتیب مقاصد را به شما پیشنهاد میدهد. بعبارتی ترتیبی که مقاصد باید طی شوند پردازش نموده و به نمایش میگذارد.

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

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

  • JavaObject

وب سرویس

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

وب سرویس فروشنده دوره گرد

 

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

            {
    "points": [
        {
            "name": "محقق امین",
            "location": [
                35.725682,
                51.49544
            ],
            "index": 0
        },
        {
            "name": "فردوسی",
            "location": [
                35.715012,
                51.499415
            ],
            "index": 1
        },
        {
            "name": "توحید",
            "location": [
                35.751292,
                51.538933
            ],
            "index": 2
        },
        {
            "name": "جلیل آباد",
            "location": [
                35.691695,
                51.391455
            ],
            "index": 3
        },
        {
            "name": "پیامبر",
            "location": [
                35.737673,
                51.321258
            ],
            "index": 4
        },
        {
            "name": "مجموعه ورزشی آزادی",
            "location": [
                35.729842,
                51.265652
            ],
            "index": 5
        }
    ]
}
        

پیاده سازی

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

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

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

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

            NeshanMapSdk1.neshanTravelingSalesman(API-KEY(String),Waypoints(String),RoundTrip(Boolean),SourceIsAnyPoint(Boolean),LastIsAnyPoint(Boolean))
        

پارامترها:

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

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

RoundTrip: این پارامتر مشخص می‌کند که آیا سفر به نقطه شروع باز می‌گردد یا خیر. مقدار آن به صورت True,False می‌باشد.

sourceIsAnyPoint: این پارامتر مشخص می‌کند که آیا مبدا می‌تواند هر نقطه‌ایTrue باشد، یا باید اولین نقطه باشد False

lastIsAnyPoint: این پارامتر مشخص می‌کند که آیا مقصد می‌تواند هر نقطه‌ای True باشد، یا باید آخرین نقطه باشد False

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

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

            Sub neshanTravelingSalesmanResultReceived(neshanTravelingSalesmanResultObject As Object)
	
End Sub
        

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

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

            Sub travelingSalesmanResultReceivingError(errorObject As Object)
	
End Sub
        

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

در صورتی که سرویس با خطا مواجه نشود، متغیر neshanTravelingSalesmanResultObject در متد neshanTravelingSalesmanResultReceived حاوی خروجی سرویس فروشنده دوره گرد خواهد بود.

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

            Sub neshanTravelingSalesmanResultReceived(neshanTravelingSalesmanResultObject As Object)
	Private neshanTravelingSalesmanResultJO As JavaObject =  neshanTravelingSalesmanResultObject
	Private points As List = neshanTravelingSalesmanResultJO.GetField("tSPoints")
	For Each point As JavaObject In points
		Log(point.GetField("tSPointName"))
		Log(point.GetField("tSPointLocation"))
		Log(point.GetField("tSPointIndex"))
	Next
End Sub
        

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

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

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

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

در تکه کد بالا همانطور که نام سرویس travelling salesman است، ابتدای فیلدها حروف tS به صورت camel case قرار گرفته است.

 

نام فیلدها:

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

            points
	name
	location
	index
        

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

            tSPoints
	tSPointName
	tSPointLocation
	tSPointIndex