انجام جستجوهای مکانی و توصیفی-موسسه چشم انداز-آموزش کاربردی GIS و RS
با استفاده از Query tasks میتوانید جستجوی مکانی یا فیلدی یا ترکیبی از هر دو را بر روی لایههای دادهای موجود در سرویس نقشه انجام دهید. مثلاً استخراج پارسلهایی که ارزش بیشتر از 100 هزار دلار دارند و با دشت سیلابی در تقاطع هستند. در این بخش جستجوهای مکانی و توصیفی را با استفاده از اشیاء Query، QueryTask و FeatureSet انجام میدهیم.
موضوعات زیر را در این فصل پوشش میدهیم.
1- معرفی وظایف و توابع در ArcGIS Server
2- مروری بر جستجوهای مکانی و توصیفی
3- شی Query
4- انجام جستجو با QueryTask
5- پراختن به جستجوهای مکانی
معرفی وظایف و توابع در ArcGIS Server
با این وظایف و توابع جستجوهای مکانی و توصیفی، پیدا کردن عوارض با جستجوهای متنی، پیدا کردن آدرس روی نقشه و شناسایی عوارض قابل انجام هستند.
با استفاده از منبع esri/tasks عملیات هندسی مانند ایجاد حریم و اندازه گیری فاصله قابل انجام هستند. همهی این توابع و کارها الگوی مشابهی دارند و هر کدام به تعدادی پارامتر ورودی نیاز دارند. از یک شی ورودی برای تامین این پارامترهای ورودی استفاده میشود. با استفاده از این پارامترهای ورودی، تابع وظیفهی خاصی را انجام داده و سپس یک شی خروجی حاوی نتایج تابع برگردانده میشود. نمودار زیر نشان میدهد که تابع با یک شی ورودی اجرا میشود و یک شی خروجی برمیگرداند. سپس از این شی خروجی در اپلیکیشن استفاده میکنیم.
مروری بر جستجوهای مکانی و توصیفی
جستجوها با اشیاء متوالی انجام میشوند. یک شی برای ورودی تابع، یک شی برای اجرای تابع و یک شی هم برای برگرداندن نتیجهی تابع استفاده میشوند. برای جستجوهای مکانی و توصیفی، پارامترهای ورودی در شی Query ذخیره میشوند. شی QueryTask عمل جستجو را بر اساس پارامترهای ورودی شی Query انجام میدهد و در نهایت نتایج جستجو در شی FeatureSet ذخیره میشوند. شی FeatureSet شامل آرایهای از عوارض گرافیکی است که میتوانید آنها را بر روی نقشه رسم کنید. شی Query به عنوان ورودی شی QueryTask و شامل ویژگیهایی مانند geometry، where و text است. با استفاده از ویژگی geometry در نتیجهی جستجوی مکانی، یک هندسه برگردانده میشود. این شی برای نگهداری این هندسه استفاده میشود و میتواند نقطه، خط و یا پولیگون باشد. ویژگی where، عبارت جستجو را تعیین و ایجاد میکند. شی Query شامل تعدادی ویژگی اختیاری است که با استفاده از آنها میتوان فیلدهایی را در نتیجهی انجام جستجو برگرداند. شی خروجی به هندسهی عوارضی که در نتیجهی جستجو به دست آمده اند، ارجاع دارد.
شی Query
برای اینکه شی QueryTask جستجو را روی لایهی سرویس نقشه انجام دهد، به یک سری پارامتر ورودی موجود در شی Query نیاز دارد. پارامترهای ورودی موجود در شی Query بر اساس نوع جستجو اعم ازمکانی، توصیفی یا ترکیبی از هر دو، تعیین میشوند. جستجوی توصیفی توسط where یا ویژگیهای متنی تعریف و تعیین میشود. برای تعریف یک جستجوی توصیفی SQL از ویژگیهای متنی استفاده میشود. تفاوت Query.where و Query.text را در بخش بعدی توضیح میدهیم.
جهت جستجوی مکانی باید ویژگی Query.geometry را تنظیم کنید. با توجه به نوع لایهای که میخواهید جستجوی مکانی بر روی آن انجام دهید، مقدار ویژگی Query.geometry میتواند نقطه، خط و یا پولیگون باشد.
در کد زیر ایجاد نمونهای از شی Query را میبینید:
var query = new Query();
تعیین ویژگیهای Query
می توانیم پارامترهای مختلفی را برای شی Query تعیین کنیم. جهت جستجوی توصیفی باید از ویژگی Query.where یا Query.text و جهت جستجوی مکانی از ویژگی Query.geometry استفاده کنیم.
جستجوهای توصیفی
شی Query از دو ویژگی Query.where و Query.text برای جستجوی توصیفی استفاده میکند.
در کد زیر ویژگی Query.where را برای برگرداندن رکوردهایی تنظیم کرده ایم که فیلد STATE_NAME آنها Texas است. دقت کنید که ما کلمهی Texas را درون ‘‘ قراردادهایم؛ زیرا نوع فیلد STATE_NAME از نوع متنی (رشته ای) است. اگر میخواهید جستجو را بر روی فیلد از نوع متنی انجام دهید، باید مقدار مورد جستجو را درون ‘ ‘ یا “ “ قرار دهید.
query.where = “STATE_NAME = ‘Texas'”;
جهت جستجوی توصیفی علاوه بر Query.where میتوانید از Query.text نیز استفاده کنید که راهی سریع برای ایجاد عبارت جستجو با استفاده از کلمه کلیدی like است. فیلد مورد استفاده در جستجو همان display field لایه است که در سند نقشه (فایل با پسوند.mxd) تعیین شده است. برای تعیین display field لایه مراحل زیر را در Arcmap دنبال کنید. سپس از این سند نقشهای که در Arcmap ساختید، سرویس نقشهای را در ArcGIS for Server منتشر کنید.
1- فایل نقشهای خود با پسوند.mxd را در ماژول ArcMap باز کنید.
2- روی لایهای که میخواهید بر روی آن لایه جستجو انجام دهید راست کلیک کنید و گزینهی properties را بزنید.
3- در پنجره ظاهر شده در سربرگ Display قرار بگیرید.
4- در قسمت Display Expression از لیست بازشوی روبروی Field، فیلد مورد نظرتان برای انجام جستجو را انتخاب کنید. میتوانید با زدن expression عبارت جستجوی خود را وارد کنید. نیازی به تعیین عبارت جستجو در این قسمت نیست؛ زیرا میخواهیم عبارت جستجو را در کد نویسی که در ادامه میبینید، تعیین کنیم.
طی مراحل بالا display field تعیین میشود. در تصویر زیر میبینید که فیلد ZONING_NAME را به عنوان display field تعیین کردهایم. پس با ویژگی Query.text روی این فیلد جستجو انجام میدهیم.
query.text= stateName;
در کد زیر از query.text برای انجام جستجوی توصیفی بر اساس ویژگیهای متنی استفاده کردیم. این جستجو کلیه رکوردهایی را بر میگرداند که فیلد state name آنها برابر با مقداری است که کاربر وارد کرده است.
query = new Query();
query.returnGeometry = false;
query.outFields = [‘*’];
query.text = dom.byId(“stateName”).value;
queryTask.execute(query, showResults);
جستجوی مکانی
جهت انجام جستجوی مکانی بر روی یک لایه، باید یک شی هندسی معتبر مانند نقطه، خط، پولیگون و extent را بفرستید. برای جستجوی مکانی به relationship مکانی یا اصطلاحاً رابط مکانی نیز نیاز داریم که با ویژگی Query.spatialRelationship تنظیم میشود و در طی عملیات جستجو اعمال میشود. ارتباط مکانی توسط یکی از مقادیر ثابت زیر تعیین میشود:
1- SPATIAL_REL_INTERESECTS
2- SPATIAL_REL_CONTAINS
3- SPATIAL_REL_CROSSES
4- SPATIAL_REL_ENVELOPE_INTERSECTS
5- SPATIAL_REL_OVERLAPS
6- SPATIAL_REL_TOUCHES
7- SPATIAL_REL_WITHIN
8- SPATIAL_REL_RELATION
بهتر است در مورد اصطلاحات درون جدول توضیحاتی بیان کنیم.
منظور از کلاس عارضه همان لایهای است که میتوان بر روی آن عمل جستجو انجام داد، مانند لایههای وکتوری. اگر کلاس عارضه از نوع نقطهای باشد، به هر کدام از نقاط موجود در کلاس عارضه یک عارضه گفته میشود. اگر کلاس عارضه از نوع خطی باشد، به هر کدام از خطوط موجود در کلاس عارضه، عارضه گفته میشود و همینطور برای کلاس عارضهی پولیگونی به هر کدام از پولیگونها یک عارضه گفته میشود. مجموعهای از عارضههای هم نوع (عوارض هم نوع) را یک کلاس عارضه میگوییم.
قطعه کد زیر یک شی نقطهای را به فیلتر جستجوی مکانی فرستاده و رابطه ی مکانی را تعیین میکند.
query.geometry = evt.mapPoint;
query.spatialRelationship = SPATIAL_REL_INTERSECTS;
تعیین فیلدهای برگشتی
فیلدهای موجود در شی FeatureSet را محدود کنید و فقط فیلدهای مورد نیاز اپلیکیشن را برگردانید تا عملکرد و کارآئی اپلیکیشن بهتر شود. هر فیلدی که در شی FeatureSet قرار میگیرد، یک ستون اطلاعاتی است. این ستون اطلاعاتی باید از سرور به مرورگر فرستاده شود که میتواند سرعت و عملکرد اپلیکیشن شما را کاهش دهد. برای محدود کردن فیلدهای برگشتی، لیستی از فیلدها را به ویژگی Query.outFields تخصیص میدهیم و برای برگرداندن همهی فیلدها به این صورت outFields = [‘*’] عمل کنید.
علاوه بر این میتوانید هندسهی هر عارضه را با ویژگی Query.returnGeometry برگردانید. به صورت پیش فرض هندسهی عارضه برگشت داده خواهد شد. ولی در بعضی موارد اپلیکیشن شما نیازی به هندسهی بازگشتی ندارد. مثلاً اگر شما به جمعیت یک جدول که در یک ستون اطلاعاتی قرار دارد، نیاز دارید بنابراین نیازی به هندسه و شکل نخواهید داشت و صرفاً با اطلاعات آن سر و کار دارید؛ بنابراین شما میتوانید از Query.returnGeometry = false برای عدم برگشت هندسه استفاده کنید.
query.outFields =
[“NAME”, “POP2000”, “POP2007”, “POP00_SQMI”, “POP07_SQMI”];
query.returnGeometry = false;
انجام جستجو با QueryTask
وقتی ویژگیهای ورودی را در شی Query تعیین کردید، میتوانید از شی QueryTask برای اجرای جستجو استفاده کنید. قبل از اجرای جستجو، باید یک نمونه از شی QueryTask ایجاد کنید. شی QueryTask با فرستادن یک URL به لایهای که جستجو بر روی آن انجام میشود، ایجاد میشود. در نمونه کد زیر یک شی QueryTask ایجاد میشود. شمارهی شاخصی که در آخر URL آمده است، برای ارجاع به لایهای است که عملیات جستجو روی آن انجام میشود. اگر سرویس نقشهای خود را در ArcGIS Server manager باز کنید و به سرویس rest بروید، میبینید که برای هر لایه یک شمارهی شاخص تعیین شده است.
myQueryTask = new QueryTask(“http://sampleserver1.arcgisonline.com/
ArcGIS/rest/services/Demographics/ESRI_CENSUS_USA/MapServer/5”);
پس از ایجاد شی QueryTask، این شی با متد QueryTask.execute() جستجو را اجرا میکند. متد QueryTask.execute() سه پارامتر ورودی میگیرد که پارامتر اول شی ورودی Query، پارامترهای دوم و سوم توابع بازخوردی شکست و موفقیت هستند.
نحوهی دستوری این متد در زیر آمده است که شی Query به عنوان پارامتر اول آمده است.
QueryTask.execute(parameters,callback?,errback?)
اگر جستجو بدون هیچ خطایی انجام شد، تابع بازخوردی Success صدا زده میشود و شی FeatureSet به این تابع فرستاده میشود. اگر جستجو با خطا مواجه شد، تابع بازخوردی error صدا زده میشود و اجرا میشود. هر دو تابع بازخوردی Success و error اختیاری هستند و تعریف و اجرای آنها لازم نیست. هر چند شما خیلی بهتر است که توابعی را برای جستجوی موفق یا ناموفق، تعریف کنید. در مورد توابع بازخوردی شکست و موفقیت کمی بیشتر توضیح میدهیم. بیشتر توابع و کارها در ArcGis Server یک نمونه شی dojo/Deferred برمیگردانند. Deffered کلاسی برای مدیریت فرآیندهای همزمان در Dojo است. وظایف و توابع در ArcGIS Server میتوانند به صورت همزمان یا غیر همزمان اجرا شوند.
همزمانی و غیر همزمانی تابع مواردی مانند چگونگی تعامل با سرور و چگونگی گرفتن نتایج از تابع را کنترل و تعیین میکند. وقتی یک سرویس بر روی همزمانی تنظیم میشود، کاربر باید منتظر بماند تا کار مورد نظر به طور کامل اجرا شود. مثلاً یک کار همزمان به سرعت در طی چند ثانیه اجرا میشود؛ اما یک کار غیرهمزمان طولانیتر اجرا میشود و کاربر نیازی نیست تا صبر کند تا این کار غیرهمزمان به طور کامل اجرا شود و کاربر آزاد است تا با اپلیکیشن کار کند و هر کار دیگری را اجرا کند. وقتی کار روی سرور به طور کامل اجرا شد، تابع بازخوردی را صدا میزند و نتایج را به تابع بازخوردی میفرستد. اکثر مواقع این نتایج بر روی نقشه به نمایش در میآیند.
به کد زیر دقت کنید. ابتدا یک متغیر جدید با نام myQueryTask ایجاد شده که به لایهای با شمارهی شاخص 6 اشاره میکند. لازم به ذکر است که شماره شاخص لایهها از 0 شروع میشود. سپس یک شی Query که شامل ویژگیهای ورودی جستجو است، ایجاد میشود. سپس متد execute() بر روی شی QueryTask برای انجام جستجو، اجرا میشود. این متد یک شی FeatureSet که شامل نتایج جستجو است، برگردانده میشود. در صورت اجرای موفق جستجو، عوارض حاصل از جستجو با یک تابع بازخوردی به نام showResults پردازش میشوند. تابع showResults در متد execute() استفاده میشود و در صورت اجرای ناموفق جستجو تابع errorCallback() صدا زده میشود.
myQueryTask = new QueryTask(“http://sampleserver1.arcgisonline.com/
ArcGIS/rest/services/Demographics/ESRI_CENSUS_USA/MapServer/5”);
//build query filter
myQuery = new Query();
myQuery.returnGeometry = false;
myQuery.outFields = [“STATE_NAME”, “POP2007”, “MALES”, “FEMALES”];
myQuery.text = ‘Oregon’;
//execute query
myQueryTask.execute(myQuery, showResults, errorCallback);
function showResults(fs) {
//do something with the results
//they are returned as a featureset object
}
function errorCallback() {
alert(“An error occurred during task execution”);
}
برگرفته از کتاب تولید و طراحی اپلیکیشن های Web GIS و Mobile GIS با استفاده از ArcGIS API for JavaScript
نویسنده: دکتر محمد بافقی زاده
نشر: انتشارات اکادمیک
بدون دیدگاه