لایه آنلاین – B4A

Android SDK Resources

نسخه 1.1

هدف از این بخش از پروژه اضافه کردن یک لایه آنلاین به نقشه است. جهت پیاده سازی این مثال، باید کتابخانه های زیر را در پنجره Libraries Manager تیک بزنید:
  • OkHttpUtils2 (جهت دانلود فایل Json مربوط به نقاط)
  • JSON (جهت خواندن محتویات Json)
  • Reflection (جهت بدست آوردن Package name اپلیکیشن)

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

#AdditionalJar: common-release.aar
نحوه پیاده سازی به این شکل است که در ابتدا ریکوئستی برای دانلود فایل JSON نقاط ارسال میشود و پس از دریافت، فایل در پوشه InternalCache ذخیره میشود. سپس توسط متد getAndShowPoints نقاط از فایل ذخیره شده در InternalCache استخراج شده و به صورت مارکر روی نقشه نمایش داده میشود.
لایه آنلاین مورد استفاده در این پروژه در آدرس زیر قرار دارد: اطلاعات موجود در این فایل geojson به صورت زیر است:
            "type": "FeatureCollection",
"name": "points",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 51.368444458834389, 35.722048959450113 ] } },
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 51.384140003141582, 35.778596997768005 ] } },
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 51.456522296148684, 35.663707775556659 ] } },
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 51.373137257878632, 35.656614228822541 ] } },
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 51.527715399382672, 35.737503116119001 ] } },
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 51.25037627592824, 35.74785430829283 ] } },
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 51.297536031713946, 35.676263156219797 ] } },
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 51.461240697178525, 35.725292478576648 ] } }
]
}
        

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

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

جهت پیاده سازی متد کلیک روی دکمه، Visual designer مربوط به OnlineLayerActivity را باز کرده، روی دکمه ای که قبلا اضافه شده است راست کلیک کنید و از زیر منوی Generate گزینه Click را انتخاب کنید تا Event کلیک مربوط به دکمه در OnlineLayerActivity پیاده سازی شود.

            Private Sub OnlineLayerButton_Click

End Sub
        

دانلود فایل JSON نقاط

جهت دانلود فایل JSON مربوط به نقاط، یک شیء از نوع HttpJob در قسمت Globals تعریف کرده و از آن به صورت زیر استفاده نمایید. (در این مثال پس از کلیک روی دکمه OnlineLayerButton کد مربوط به دانلود فایل JSON صدا زده میشود.

            Private Sub OnlineLayerButton_Click
	httpJob.Initialize("",Me)
	httpJob.Download("https://api.neshan.org/points.geojson")
End Sub
        

نتیجه ارسال درخواست در متدی به نام JobDone بازگردانده میشود که یک شیء از نوع HttpJob است. در ادامه نحوه دریافت فایل JSON را از طریق متد JobDone شرح خواهیم داد.

            Sub JobDone(job As HttpJob)
	If job.Success Then
		Private out As OutputStream = File.OpenOutput(File.DirInternalCache,"points.geojson",False)
		File.Copy2(job.GetInputStream,out)
		out.Close
		
		getAndShowPoints
	Else
		Log("Error:" & job.ErrorMessage)
	End If
	job.Release
End Sub
        

در قطعه کد بالا متغیر job محتوی پاسخ درخواست نقاط JSON است. ابتدا یک فایل به نام points.geojson در InternalCache ساخته میشود. سپس محتوای پاسخ در فایل ساخته شده ذخیره میشود. و در نهایت متد getAndShowPoints صدا زده میشود که در این متد محتوای فایل ذخیره شده خوانده میشود و نقاط استخراج شده به صورت نشانگر (مارکر) روی نقشه نمایش داده میشود.

            Sub getAndShowPoints
	If File.Exists(File.DirInternalCache,"points.geojson") Then
		Private jsonParser As JSONParser
		Private list1 As List
		Private map As Map

		jsonParser.Initialize(File.ReadString(File.DirInternalCache,"points.geojson"))
		map = jsonParser.NextObject
			
		list1 = map.Get("features")
			
		package = reflector.GetStaticField("anywheresoftware.b4a.BA", "packageName")
		Private markerDrawable As Int = reflector.GetStaticField(package & ".R$drawable", "icon")
			
		Private map2 As Map
		For Each feature As Map In list1
			map2 = feature.Get("geometry")
			Dim coordinateList As List
			coordinateList = map2.Get("coordinates")
			NeshanMapSdk1.addMarker(markerDrawable,25,coordinateList.Get(1),coordinateList.Get(0))
		Next
		NeshanMapSdk1.setCameraZoom(12,0.5)
	End If
End Sub
        

در قطعه کد بالا، متغیر jsonParser فایل JSON ذخیره شده را در متد Initialize خود در قالب String دریافت میکند، پس از دریافت توسط متد NextObject مقادیر فایل JSON را استخراج کرده و در متغیری به نام map میریزد. متغیر map از نوع Map که نوعی key/value است میباشد. کلیدهای map فیلدهای JSON و VALUE های آن، مقادیر فیلدها میباشد.

توسط دستور Get میتوان مقادیر مربوط به فیلدها را از map استخراج کرد. خط map.Get(“features”) مقادیر مربوط به فیلد features را برمیگرداند که لیستی از feature هاست، درون feature فیلدی به نام geometry وجود دارد که مختصات نقاط درون آن جای دارد. قطعه کد بالا، توسط یک حلقه For نقاط را استخراج کرده و توسط متد addMarker که روی شیء نقشه صدا زده میشود، نشانگرهای مربوط به نقاط را روی نقشه اضافه میکند.

نسخه 1.0

هدف از این بخش از پروژه اضافه کردن یک لایه آنلاین به نقشه است. جهت پیاده سازی این مثال، باید کتابخانه های زیر را در پنجره Libraries Manager تیک بزنید:
  • OkHttpUtils2 (جهت دانلود فایل Json مربوط به نقاط)
  • JSON (جهت خواندن محتویات Json)
  • Reflection (جهت بدست آوردن Package name اپلیکیشن)

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

#AdditionalJar: common-release.aar
نحوه پیاده سازی به این شکل است که در ابتدا ریکوئستی برای دانلود فایل JSON نقاط ارسال میشود و پس از دریافت، فایل در پوشه InternalCache ذخیره میشود. سپس توسط متد getAndShowPoints نقاط از فایل ذخیره شده در InternalCache استخراج شده و به صورت مارکر روی نقشه نمایش داده میشود.
لایه آنلاین مورد استفاده در این پروژه در آدرس زیر قرار دارد: اطلاعات موجود در این فایل geojson به صورت زیر است:
            "type": "FeatureCollection",
"name": "points",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 51.368444458834389, 35.722048959450113 ] } },
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 51.384140003141582, 35.778596997768005 ] } },
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 51.456522296148684, 35.663707775556659 ] } },
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 51.373137257878632, 35.656614228822541 ] } },
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 51.527715399382672, 35.737503116119001 ] } },
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 51.25037627592824, 35.74785430829283 ] } },
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 51.297536031713946, 35.676263156219797 ] } },
{ "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ 51.461240697178525, 35.725292478576648 ] } }
]
}
        

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

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

جهت پیاده سازی متد کلیک روی دکمه، Visual designer مربوط به OnlineLayerActivity را باز کرده، روی دکمه ای که قبلا اضافه شده است راست کلیک کنید و از زیر منوی Generate گزینه Click را انتخاب کنید تا Event کلیک مربوط به دکمه در OnlineLayerActivity پیاده سازی شود.

            Private Sub OnlineLayerButton_Click

End Sub
        

دانلود فایل JSON نقاط

جهت دانلود فایل JSON مربوط به نقاط، یک شیء از نوع HttpJob در قسمت Globals تعریف کرده و از آن به صورت زیر استفاده نمایید. (در این مثال پس از کلیک روی دکمه OnlineLayerButton کد مربوط به دانلود فایل JSON صدا زده میشود.

            Private Sub OnlineLayerButton_Click
	httpJob.Initialize("",Me)
	httpJob.Download("https://api.neshan.org/points.geojson")
End Sub
        

نتیجه ارسال درخواست در متدی به نام JobDone بازگردانده میشود که یک شیء از نوع HttpJob است. در ادامه نحوه دریافت فایل JSON را از طریق متد JobDone شرح خواهیم داد.

            Sub JobDone(job As HttpJob)
	If job.Success Then
		Private out As OutputStream = File.OpenOutput(File.DirInternalCache,"points.geojson",False)
		File.Copy2(job.GetInputStream,out)
		out.Close
		
		getAndShowPoints
	Else
		Log("Error:" & job.ErrorMessage)
	End If
	job.Release
End Sub
        

در قطعه کد بالا متغیر job محتوی پاسخ درخواست نقاط JSON است. ابتدا یک فایل به نام points.geojson در InternalCache ساخته میشود. سپس محتوای پاسخ در فایل ساخته شده ذخیره میشود. و در نهایت متد getAndShowPoints صدا زده میشود که در این متد محتوای فایل ذخیره شده خوانده میشود و نقاط استخراج شده به صورت نشانگر (مارکر) روی نقشه نمایش داده میشود.

            Sub getAndShowPoints
	If File.Exists(File.DirInternalCache,"points.geojson") Then
		Private jsonParser As JSONParser
		Private list1 As List
		Private map As Map

		jsonParser.Initialize(File.ReadString(File.DirInternalCache,"points.geojson"))
		map = jsonParser.NextObject
			
		list1 = map.Get("features")
			
		package = reflector.GetStaticField("anywheresoftware.b4a.BA", "packageName")
		Private markerDrawable As Int = reflector.GetStaticField(package & ".R$drawable", "icon")
			
		Private map2 As Map
		For Each feature As Map In list1
			map2 = feature.Get("geometry")
			Dim coordinateList As List
			coordinateList = map2.Get("coordinates")
			NeshanMapSdk1.addMarker(markerDrawable,25,coordinateList.Get(1),coordinateList.Get(0))
		Next
		NeshanMapSdk1.setCameraZoom(12,0.5)
	End If
End Sub
        

در قطعه کد بالا، متغیر jsonParser فایل JSON ذخیره شده را در متد Initialize خود در قالب String دریافت میکند، پس از دریافت توسط متد NextObject مقادیر فایل JSON را استخراج کرده و در متغیری به نام map میریزد. متغیر map از نوع Map که نوعی key/value است میباشد. کلیدهای map فیلدهای JSON و VALUE های آن، مقادیر فیلدها میباشد.

توسط دستور Get میتوان مقادیر مربوط به فیلدها را از map استخراج کرد. خط map.Get(“features”) مقادیر مربوط به فیلد features را برمیگرداند که لیستی از feature هاست، درون feature فیلدی به نام geometry وجود دارد که مختصات نقاط درون آن جای دارد. قطعه کد بالا، توسط یک حلقه For نقاط را استخراج کرده و توسط متد addMarker که روی شیء نقشه صدا زده میشود، نشانگرهای مربوط به نقاط را روی نقشه اضافه میکند.