پیداکردن عوارض-موسسه چشم انداز هزاره سوم ملل-آموزش کاربردی GIS و RS
می توانید عارضهای را در حافظه دستگاه جستجو کنید یا یک جستجوی REST در ArcGIS Online یا ArcGIS Server بسازید. برای این کار از کد اولیه استفاده میکنیم و ابزاری برای جستجو ایجاد میکنیم. کاربر نام عارضه مورد نظرش را درون این ابزار تایپ میکند، سپس آن عارضه روی نقشه زوم شده و به صورت روشن و برجسته نمایش داده میشود. برای لایه marathon ابزار جستجو را طراحی و ایجاد کردیم. جستجوهای این عارضه را در لینک زیر ببینید.
https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/Boston_Marathon/FeatureServer/0/query
با استفاده از GeoJSON نتیجه جستجوها را به برنامه برمیگردانیم. برای انجام جستجوهای بیشتر در یک سرویس feature لینک زیر را ببینید:
https://resources.arcgis.com/en/help/arcgisrest-api/index.html#/Query_Feature_Service_
Layer/02r3000000r1000000/
در لینک بالا میتوانید روی یک عارضه با پارامترهای سادهای مثل where outfields=* جستجو کنید. برای شروع از کد اولیه استفاده میکنیم ولی این بار باید در تابع require تغییراتی انجام داد.
require([
“esri/map”, “esri/layers/FeatureLayer”, “esri/symbols/
SimpleFillSymbol”, “esri/symbols/SimpleLineSymbol”,
“esri/tasks/query”, “esri/geometry/Polygon”, “esri/graphic”,
“esri/dijit/PopupMobile”, “esri/dijit/PopupTemplate”, “esri/
Color”,
“dijit/layout/BorderContainer”, “dijit/layout/ContentPane”,
“dojo/on”, “dojo/domReady!”],
function(
Map, FeatureLayer, SimpleFillSymbol, SimpleLineSymbol,
Query, Polygon, graphic,
PopupMobile, PopupTemplate, Color,
BorderContainer, ContentPane,
on
) {
ماژول query و ماژولهای مورد نیاز برای روشن و برجسته کردن عارضه انتخابی را اضافه کردیم. همچنین ویجتهای container که در مثال راهنمای نقشه استفاده شدند را نیز اضافه کردیم. در این مثال نوار ابزار مربوط به جستجو را در بالای نقشه قرار دادیم. این ابزار شامل 1- یک کادر متنی است که برای وارد کردن نام عارضه استفاده میشود. 2- یک دکمهی جستجو برای انجام عمل جستجو. تصویر زیر مربوط به انجام عمل جستجوی عارضه است.
فایل MobileMapFindFeature.html که برنامه جستجوی عوارض است را در نظر بگیرید. در این برنامه برای انجام جستجو و پیدا کردن عوارض به دو تابع جدید نیاز داریم. پس از تایپ نام عارضه درون کادر متنی و زدن کلید جستجو، تابع findFeature اجرا میشود. این تابع شروع به جستجوی عارضه مورد نظر در لایه feature میکند. تابع findFeature یک پارامتر ورودی به نام searchText دارد. در این پارامتر، مقدار کادر متنی که حاوی نام عارضه تایپ شده توسط کاربر است، قرار میگیرد. شی جستجو به یک شرط که با کلمه where شروع میشود، نیاز دارد. در این فایل، فیلد STATE_NAME مبنای جستجو خواهد بود. در کادر متنی کاربر باید یکی از مقادیر فیلد STATE_NAME را وارد کند تا عارضه مربوط به همان ایالت برای وی انتخاب شود. این تابع جستجو را انجام میدهد و نتیجه جستجو را به تابع fetchRecords() ارسال میکند. در زیر تابع fetchRecords() را میبینید:
//Display the results of the find feature query
function fetchRecords(featureSet) {
//Clear the graphics layer
map.graphics.clear();
//If we get a result set
if (featureSet.features.length > 0) {
//Highlight the feature
var polygonJson = {“rings”:featureSet.features[0].geometry.
rings,”spatialReference”:map.spatialReference};
map.graphics.add(new esri.Graphic(new esri.geometry.
Polygon(polygonJson), new esri.symbol.SimpleFillSymbol(
esri.symbol.SimpleLineSymbol.STYLE_SOLID,
new esri.symbol.SimpleLineSymbol(esri.symbol.
SimpleLineSymbol.STYLE_SOLID,
new esri.Color([0, 0, 0, 1]), 1),
new esri.Color([255, 0, 0, 0.2]))
));
}
}
تابع fetchRecords چند کار را انجام میدهد:
گرافیکهای مربوط به نتایج جستجوهای قبلی را پاک میکند. زمانی که در نتیجه جستجوی کاربر، عارضهای انتخاب میشود شکل ظاهری عارضه به صورت ویژهای در میآید تا از دیگر عوارض تفکیک و قابل تشخیص باشد. این شکل ظاهری میتواند به صورت تنظیم رنگ خط یا رنگ زمینه عارضه مورد نظر باشد. به این کار اعمال گرافیک میگویند. تابع fetchRecords گرافیکهای مربوط به عارضههای قبلی که انتخاب شده بودند را پاک میکند تا جستجوی جدید کاربر بر روی عوارض اعمال شود و با نتیجه جستجوی قبلی تداخلی نداشته باشد.
اگر از جستجوی کاربر مجموعه نتایجی به دست آمده است، یک شی بر مبنای نتیجه ایجاد میکند. نقشه را با شی نتیجه تنظیم میکنیم و نقشه بر روی عارضه حاصل از جستجو زوم میشود. در آخرین مرحله تابع، به عارضه حاصل از جستجو گرافیکهایی اعمال میشود. کد کامل برنامه جستجوی عارضه در فایل MobileMapFindFeature.html قرار دارد.
جستجوی آدرس
یکی دیگر از ابزارهای درون برنامههای موبایل، جستجوی آدرس است. ابزار جستجوی آدرس مستقیماً با لایه feature کار میکند و با استفاده از یک سرویس Geocoding یک آدرس برمیگرداند.
سرویس Geocoding یک آدرس یا نام یک مکان را به مختصات طول و عرض جغرافیایی تبدیل میکند. به عنوان مثال اگر کاربر بخواهد آدرس مورد نظرش را روی نقشه پیدا کند، میتواند از سرویس Geocoding برای پیداکردن مختصات آدرس مورد نظرش استفاده کند. از سرویس Geocoding در نمونه کد استفاده کردیم. از لینک زیر میتوانید این سرویس را پیدا کنید.
https://tasks.arcgis.com/ArcGIS/rest/services/WorldLocator/GeocodeServer
اطلاعات بیشتر در مورد این سرویس را در لینک زیر ببینید:
https://geocode.arcgis.com/arcgis/index.html
در کد مربوط به جستجوی آدرس از همان کد جستجوی عارضه استفاده میکنیم. منتها در تابع require به جای esri/tasks/query، ماژول esri/tasks/locator را میگذاریم.
در اینجا در مورد ماژول esri/ dijit/Geocoder توضیح نمیدهیم. ولی پیشنهاد میکنیم اطلاعات بیشتر در مورد این ماژول مهم و باارزش را در لینک زیر ببینید:
https://developers.arcgis.com/javascript/jsapi/geocoder.html
تصویر زیر اجرای اپلیکیشن جستجوی آدرس را نشان میدهد.
در ابتدا باید geocoder مقداردهی اولیه شود. برای این کار باید کد زیر را به تابع init اضافه کنید.
locator = new Locator(“https://geocode.arcgis.com/arcgis/rest/services/
World/GeocodeServer”);
//add handler for button click
locator.on(“address-to-locations-complete”, showResults);
تابع showResults با شی geocoder سر و کار دارد. رویداد address-to-locations-complete برای پیدا کردن آدرسهای تکی و چندگانه استفاده میشود. تابع (findAddress(searchText در کد زیر، درخواست Geocoder را ایجاد میکند و زمانی که کاربر دکمه Find را میزند، این تابع صدا زده و اجرا میشود و آدرس ورودی کاربر به پارامتر ورودی تابع یعنی searchText فرستاده میشود.
//Execute find address request
function findAddress(searchText) {
//Clear any existing graphics
map.graphics.clear();
var address = {
“SingleLine”: searchText
};
locator.outSpatialReference = map.spatialReference;
var options = {
address: address,
outFields: [“Loc_name”]
};
locator.addressToLocations(options);
}
باید شی address و outFields را به شی locator بفرستیم. شی address شامل ویژگیهای مربوط به نمایش فیلدهای آدرس تکی و یا چندگانه است. این شی، پشتیبانی سرویس Geocode از فیلدهای آدرس را بررسی میکند. شی outFields لیستی از فیلدهایی است که شامل نتایج برگشتی هستند. با استفاده از کد زیر، واکنش Geocode و برگشت نتایج را توضیح میدهیم. در صورت پیداکردن و برگشت نتیجه، مکان مورد نظر بر روی نقشه به صورت زوم شده ظاهر و چهارگوشه نقشه روی این مکان تنظیم میشود. سپس یک گرافیک در مکان آدرس قرار میدهیم. کد این برنامه مشابه کد قبلی است، منتها در برنامه قبلی در قسمت مربوط به گرافیک، از گرافیک پولیگونی استفاده کردیم ولی گرافیک مورد نظر در این برنامه، گرافیک نقطهای است که موقعیت آدرس را نشان میدهد.
//Display the address search results
function showResults(evt) {
var geom;
if(evt.addresses.length > 0)
{
geom = evt.addresses[0].location;
if ( geom !== undefined ) {
map.centerAndZoom(geom, 12);
//add a graphic to the map at the geocoded location
map.graphics.add(new esri.Graphic(
new esri.geometry.Point(evt.addresses[0].location.x, evt.addresses[0].
location.y, map.spatialReference),
new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.
STYLE_SQUARE, 10,
new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_
SOLID,
new esri.Color([0,255,0]), 1),
new esri.Color([255,0,0,0.25]))
));
}
}
}
کد کامل مربوط به اپلیکیشن جستجوی آدرس در فایل MobileMapFindAddress.html قرار دارد.
قبل از اتمام بحث Geocode، بهتر است ویجت جدید Geocoder را در لینک زیر ببینید. این ویجت موقعیتها را ماهرانه و آسانتر پیدا میکند.
https://developers.arcgis.com/javascript/jssamples/locator_simple.html
برگرفته از کتاب تولید وب اپلیکیشن های موبایل با ArcGIS
نویسنده: دکتر محمد بافقی زاده
نشر: انتشارات اکادمیک