کارهای Network Analyst-موسسه چشم انداز هزاره سوم ملل-آموزش کاربردی GIS و RS
با سرویسهای آنالیز شبکه، انواع تجزیه و تحلیلها مانند یافتن بهترین مسیر بین دو آدرس، پیدا کردن نزدیکترین مدرسه، شناسایی منطقهی سرویس دهی و خدمات اطراف یک موقعیت و پاسخگویی به مجموعه سفارشات را بر روی شبکهی مسیر قابل انجام هستند. سرویسها توسط آدرس URL قابل دسترسی اند. سه نوع تجزیه و تحلیل 1- مسیریابی 2- یافتن نزدیکترین مراکز خدماتی (مانند مدرسه، آتش نشانی، بیمارستان و…)3- زمان رسیدن به مناطق و محدودههای خدماتی را میتوانید انجام دهید.
هر کدام از سه سرویس بالا را در این بخش مفصلاً توضیح میدهیم. برای استفاده از سرویسهای Network Analyst باید پلاگین Network Analyst را برای ArcGIS Server داشته باشید.
در این بخش مباحث زیر را پوشش میدهیم:
1- RouteTask
2- ایجاد اپلیکیشن RouteTask (مسیریابی)
3- دسترسی به نزدیک ترین مرکز خدماتی
4- دسترسی به مناطق و محدودههای خدمات رسانی
RouteTask
شی RouteTask برای یافتن مسیرهایی بین دو یا چند موقعیت (نقطه) استفاده میشود. همچنین به صورت اختیاری میتوانید جهتهای مسیر را نیز به دست آورید. شی RouteTask از سرویسهای network analysis برای محاسبهی مسیرهای ساده و پیچیده، استفاده میکند. این مسیرها شامل چندین ایستگاه (نقاط stop)، موانع و پنجرههای زمان هستند. شی RouteTask از کم هزینه ترین مسیر بین دو یا چند نقطه استفاده میکند. اگر منظور از هزینه، فاصله باشد آنگاه این شی مسیری با کم ترین طول را برمیگرداند؛ و اگر منظور از هزینه، زمان باشد آنگاه این شی مسیری با کوتاه ترین زمان را برمیگرداند. تصویر زیر خروجی RouteTask را نشان میدهد.
همانند دیگر کارهایی که قبلاً یاد گرفتیم، Routing از سه شی RouteParameters، RouteTask و RouteResult تشکیل شده است. تصویر زیر این سه شی را نشان میدهد.
شی RouteParameters پارامترهای ورودی RouteTask را فراهم میکند. شی RouteParameters تقاضای مسیریابی را به ArcGIS Server میفرستد. ArcGIS Server نتایج را در یک شی RouteResult قرار میدهد. شی RouteParameters شامل نقاط stop، موانع و سدها (barrier)، جهتهای رانندگی، جهتهای مسیر و موارد دیگر است. شما میتوانید لیست کاملی از همهی پارامترهای موجود در این شی را در لینک https://developers.arcgis.com/en/javascript/jsapi/ routeparameters-amd.html ببینید. کد زیر یک نمونه از شی RouteParameters ایجاد کرده و نقاط ایستگاه را اضافه و سیستم مختصات ارجاع مکانی را تعیین میکند. جهت به دست آوردن wkid سرویس خود میتوانید در ماژول ArcMap روی دیتافریم دادههای خود (سند نقشهای که در قالب سرویس نقشهای در arcGis server انتشار داده اید) دابل کلیک کنید. به سربرگ coordinate System بروید و در قسمت current coordinate system، wkid را ببینید. شی RouteTask عملیات مسیریابی را با استفاده از شی RouteParameters انجام میدهد. شی RouteTask حاوی URL اشاره گر به سرویس network است. سپس متد solve() عملیات RouteTask را اجرا میکند. متد solve() عملیات مسیریابی را با استفاده از ویژگیهایی که در زیر تعیین کردیم، انجام میدهد.
routeParams = new RouteParameters();
routeParams.stops = new FeatureSet();
routeParams.outSpatialReference = {wkid:4326};
routeParams.stops.features.push(stop1);
routeParams.stops.features.push(stop2);
routeTask.solve(routeParams);
شی RouteResult به تابع بازخوردی فرستاده میشود. سپس این تابع دادهها را به کاربر نمایش میدهد. حجم دادههای برگشتی به ویژگیهایی که در شی RouteParameters قرار دارند، بستگی دارد. یکی از مهم ترین ویژگیهای شی RouteParameters، ویژگی stops است که نقاطی مابین نقاط ابتدا وانتهای مسیر هستند و درتهیهی بهترین مسیر استفاده میشوند. Stops توسط یک شی DataLayer یا شی FeatureSet تعیین میشوند. مفهوم مانع درعملیات مسیریابی مهم است. در هنگام طراحی مسیر؛ موانع، مسیر را محدود میکنند. موانع شامل یک تصادف، کار بر روی قسمتی از جاده و یا تأخیرهایی مانند عبور قطار از ریل هستند. موانع توسط شی FeatureSet یا شی DataLayer ایجاد میشوند و با ویژگی RouteParameters.barriers تعیین میشوند. کد زیر در نقطهای که کاربر کلیک کرده، یک مانع ایجاد میکند.
var routeParameters = new RouteParameters();
//Add barriers as a FeatureSet
routeParameters.barriers = new FeatureSet();
routeParameters.barriers.features.push(map.graphics.add(new
Graphic(evt.mapPoint, barrierSymbol)));
برای داشتن جهتهای مسیر برگشتی، ویژگی RouteParameters.returnDirections را با مقدار true تنظیم کنید. هم چنین میتوانید ویژگیهایی برای کنترل جهتهای برگشتی تعیین کنید. زبان مورد استفاده در جهتها با ویژگی RouteParameters.directionsLanguage، واحد طول (بر حسب متر، مایل و …) با ویژگی RouteParameters.directionsLengthUnits، نوع خروجی با ویژگی RouteParameters. directionsOutputType، نام سبک با ویژگی RouteParameters.StyleName و مشخصهی زمان با ویژگی RouteParameters.directionsTimeAttribute تنظیم میشوند.
میتوانید برای عملیات مسیریابی شرط بگذارید. مثلاً اگر یکی از stopها در دسترس نباشد، آنگاه عملیات مسیریابی به شکست بیانجامد. این شرط با ویژگی RouteParameters.ignoreInvalidLocations وتنظیم آن با مقدار true یا false انجام میشود.
ایجاد اپلیکیشن RouteTask مسیریابی
در این تمرین میخواهیم عملیات مسیریابی را به اپلیکیشن اضافه کنیم. یک نمونه از RouteParameters ایجاد میکنیم و با کلیکهای کاربر بر روی نقشه، stop اضافه میکنیم. مسیر نهایی به صورت یک نماد خطی بر روی نقشه نمایش داده میشود. پس بیائید شروع کنیم:
1- Sandbox را باز کنید.
2- همهی محتویات تگ <script> را باز کنید.
3- منابع زیر را برای استفاده از اشیاء مورد نیاز اضافه کنید:
<script>
require([
“esri/map”,
“esri/tasks/RouteParameters”,
“esri/tasks/RouteTask”,
“esri/tasks/FeatureSet”,
“esri/symbols/SimpleMarkerSymbol”,
“esri/symbols/SimpleLineSymbol”,
“esri/graphic”,
“dojo/_base/Color”
],
function(Map, RouteParameters, RouteTask,
FeatureSet, SimpleMarkerSymbol, SimpleLineSymbol,
Graphic, Color ){
});
</script>
4- درون تابع require() یک شی map ایجاد کنید و متغیرهایی را برای نگهداری اشیاء و نمادها تعریف کنید:
<script>
require([
“esri/map”,
“esri/tasks/RouteParameters”,
“esri/tasks/RouteTask”,
“esri/tasks/RouteResult”,
“esri/tasks/FeatureSet”,
“esri/symbols/SimpleMarkerSymbol”,
“esri/symbols/SimpleLineSymbol”,
“esri/graphic”,
“dojo/_base/Color”
],
function(Map, RouteParameters, RouteTask, RouteResult,
FeatureSet, SimpleMarkerSymbol, SimpleLineSymbol,
Graphic, Color ){
var map, routeTask, routeParams;
var stopSymbol, routeSymbol, lastStop;
map = new Map(“mapDiv”, {
basemap: “streets”,
center:[-123.379, 48.418], //long, lat
zoom: 14});
});
</script>
5- درست در زیر کد ایجاد شی map، رویداد کلیک نقشه را اضافه کنید. با کلیک نقشه، تابع addStop() صدا زده میشود:
map = new Map(“mapDiv”, {
basemap: “streets”,
center:[-123.379, 48.418], //long, lat
zoom: 14
});
map.on(“click”, addStop);
6- اشیاء RouteTask و RouteParameters را ایجاد کنید. ویژگی RouteParameters.stops را برابر یک شی FeatureSet قرار دهید. هم چنین ویژگی RouteParameters.outSpatialReference را تنظیم کنید.
map = new Map(“mapDiv”, {
basemap: “streets”,
center:[-123.379, 48.418], //long, lat
zoom: 14
});
map.on(“click”, addStop);
routeTask = new RouteTask
(“https://tasks.arcgisonline.com/ArcGIS/rest/services/
NetworkAnalysis/ESRI_Route_NA/NAServer/Route”);
routeParams = new RouteParameters();
routeParams.stops = new FeatureSet();
routeParams.outSpatialReference = {“wkid”:4326};
تصویر زیر سرویس network analysis را نشان میدهد.
7- رویدادهای RouteTask.solve-complete() و RouteTask.error() را اضافه کنید. وقتی عملیات مسیریابی به درستی انجام شد، تابع showRoute() صدا زده میشود و در صورت بروز هر خطایی، تابع errorHandler() صدا زده میشود.
routeParams = new RouteParameters();
routeParams.stops = new FeatureSet();
routeParams.outSpatialReference = {“wkid”:4326};
routeTask.on(“solve-complete”, showRoute);
routeTask.on(“error”, errorHandler);
8- نماد نقطهای را برای تعیین نقاط ابتدا و انتهای مسیر و نماد خط را برای تعیین مسیر نهایی ایجاد کنید. برای ترسیم این نمادها از اشیاء SimpleMarkerSymbol() و SimpleLineSymbol() استفاده میکنیم. خطوط کد زیر را به دنبال خطوط کدی که در مرحلهی قبل نوشتید، اضافه کنید:
stopSymbol = new
SimpleMarkerSymbol().setStyle
(SimpleMarkerSymbol.STYLE_CROSS).setSize(15);
stopSymbol.outline.setWidth(4);
routeSymbol = new SimpleLineSymbol().setColor(new
Color([0,0,255,0.5])).setWidth(5);
9- یک تابع addStop() اضافه کنید. وقتی کاربر بر روی نقشه کلیک کند این تابع به ازای هر بار کلیک کاربر یک نقطه (stop) به مسیر اضافه میکند. ورودی این تابع یک شی Event است و نقطهی کلیک شده بر روی نقشه، توسط این شی استخراج میشود. این تابع یک گرافیک نقطهای به نقشه اضافه میکند و هم چنین گرافیک را به ویژگی RouteParameters.stops اضافه میکند. وقتی برای بار دوم بر روی نقشه کلیک شود، این تابع متد RouteTask.solve() را صدا میزند و یک نمونه RouteParameters به این متد میفرستد.
function addStop(evt) {
var stop = map.graphics.add(new Graphic(evt.mapPoint,
stopSymbol));
routeParams.stops.features.push(stop);
if (routeParams.stops.features.length >= 2) {
routeTask.solve(routeParams);
lastStop = routeParams.stops.features.splice(0,
1)[0];
}
}
10- تابع showRoute() را ایجاد کنید. ورودی این تابع یک شی RouteResult است که این تابع مسیر را مانند یک خط به لایهی گرافیکی اضافه میکند.
function showRoute(solveResult) {
map.graphics.add(solveResult.result.routeResults[0]
.route.setSymbol(routeSymbol));
}
11- یک تابع بازخوردی شکست اضافه کنید. اگرعملیات مسیریابی با خطا مواجه شد، این تابع یک پیام مناسب به کاربر نشان میدهد و همهی گرافیکهای روی نقشه را پاک میکند.
function errorHandler(err) {
alert(“An error occurred\n” + err.message + “\n” +
err.details.join(“\n”));
routeParams.stops.features.splice(0, 0, lastStop);
map.graphics.remove
(routeParams.stops.features.splice(1, 1)[0]);
}
12- میتوانید از فایل routing.html موجود در پوشهی موجود در DVD ضمیمه ی کتاب استفاده کنید و کد خود را بررسی کنید.
13- حال دکمهی run را بزنید. تصویری مانند زیر خواهید دید:
14- در هر جایی از نقشه کلیک کنید. یک نماد بر روی نقشه مطابق زیر ظاهر میشود.
15- بر روی نقطه ی دیگری از نقشه کلیک کنید. بهترین مسیر را بین این دو نقطهی کلیک شده نمایش میدهد.
دسترسی به نزدیکترین مرکز خدماتی
کار ClosestFacility هزینهی جابجایی بین مرکز حادثه و مرکز خدمات رسانی را محاسبه میکند. هنگامی که مراکز خدمات رسانی جستجو میشوند، میتوانید تعداد مراکز خدمات رسانی نزدیک را تعیین کنید. هم چنین جهت حرکت به سمت این مراکز را تعیین کنید. ClosestFacility بهترین مسیر بین محل حادثه و مرکز خدمات رسانی، جهت مسیر و هزینههای مسیر را نشان میدهد.
عملیات closest facility از سه کلاس ClosestFacilityParameters، ClosestFacilityTask و ClosestFacilitySolveResults تشکیل شده است.
شی ClosestFacilityParameters شامل پارامترهای ورودی مانند انسداد و مسدودی ها، نقاط حادثه دیده، مسیرها، جهتها و موارد دیگر است. این پارامترها ورودیهای کلاس ClosestFacilityTask هستند. این کلاس یک متد solve() دارد. ArcGIS Server نتایج را در قالب شی ClosestFacilitySolveResults برمیگرداند. شی ClosestFacilityParameters ورودی شی ClosestFacilityTask است. ویژگی incidents و facilities برای تنظیم موقعیت هستند. ویژگیهای returnIncidents، returnRoutes و returnDirections دادهی برگشتی را کنترل میکنند. مقدار این ویژگیها را میتوان با true یا false تنظیم کرد. اگر ویژگیهای مذکور با true تنظیم شوند، اطلاعات آن ویژگی در نتایج نمایش داده میشود. برای تعیین محل حادثه (شروع مسیر یا پایان مسیر) از پارامتر travelDirection استفاده میشود و در واقع جهت مسیر را مشخص میکند. اگر مقدار مانع بیشتر از مقدار موجود در ویژگی defaultCutoff باشد، تجزیه و تحلیل مسیر متوقف خواهد شد. در کد زیر یک نمونه ClosestFacilityParameters ایجاد میشود و ویژگیهای مختلف را اعمال میکند.
params = new ClosestFacilityParameters();
params.defaultCutoff = 3.0;
params.returnIncidents = false;
params.returnRoutes = true;
params.returnDirections = true;
در هنگام ایجاد یک نمونه از ClosestFacilityTask به منبع REST نیاز داریم تا به سرویس network analysis اشاره کند. کلاس ClosestFacilityTask پارامترهای ClosestFacilityParameters را میگیرد و پارامترها را با متد solve() در سرویس network analysis قرار میدهد. متد solve() توابع بازخوردی خطا و موفقیت را نیز میگیرد.
cfTask = new
ClosestFacilityTask(“https://<domain>/arcgis/rest/services/network/
ClosestFacility”);
params = new ClosestFacilityParameters();
params.defaultCutoff = 3.0;
params.returnIncidents = false;
params.returnRoutes = true;
params.returnDirections = true;
cfTask.solve(params, processResults);
نتایج برگشتی عملیات ClosestFacilityTask در شی ClosestFacilitySolveResult قرار میگیرد. این شی، شامل شی DirectionsFeatureSet است. شی DirectionsFeatureSet شامل آرایهای از جهتها، متن جهتها و هندسهی مسیر است. ویژگیهای برگشتی شامل متن جهت، طول هر تکهی مسیر (زیرا ممکن است مسیر از چند تکه تشکیل شود)، زمان جابجایی در تکههای مسیر، تخمین زمان ورود به تکهی مسیر است. شی ClosestFacilitySolveResults شامل آرایهای از نقاط حادثه دیده، آرایهای از خطوط که این خطوط تکههای مسیر هستند، پیامهای برگشتی و آرایهای از نقاط مسدود کننده و قطع کننده.
کار ServiceArea
ServiceArea محدودهی خدمات رسانی در اطراف یک موقعیت را نشان میدهد. در تصویر زیر منطقهی خدماتی بر اساس دقیقه است. از نقطهی کلیک شده؛ مناطق قابل دسترس در یک محدودهی زمانی مشخص را نشان میدهد.
عملیات service area، از سه شی تشکیل شده است. ServiceAreaParameters، ServiceAreaTask و ServiceAreaSolveResults.
کلاس ServiceAreaParameters شامل پارامترهای ورودی مانند نقاط شکست و حادثه دیده، موانع و محدودیت ها، جهت مسیر و مواردی از این قبیل است. این پارامترها ورودی کلاس ServiceAreaTask هستند. پارامترهای موجود در کلاس ServiceAreaParameters به ServiceAreaTask فرستاده میشوند. سرانجام نتایج در شی ServiceAreaSolveResults قرار میگیرند. شی ServiceAreaParameters ورودی ServiceAreaTask است. بسیاری از ویژگیهای شی ServiceAreaTask توضیح داده میشوند. ویژگی defaultBreaks آرایهای از اعداد است که مناطق خدمات رسانی قابل دسترس در یک محدودهی زمانی را تعیین میکند. این ویژگی در کد زیر، محدودههای خدمات رسانی قابل دسترس در 2 دقیقه را مشخص میکند. اگر ویژگی returnFacilities را با مقدار true تنظیم کنیم، نقاط تسهیلات و امکانات همراه نتایج برگردانده میشوند. مناطق مسدود، خطوط مسدود و نقاط مسدود با ویژگی barriers تنظیم میشوند. نقاط تسهیلات و امکانات میتوانند به عنوان نقطهی شروع و یا نقطهی پایان مسیر تنظیم شوند. ویژگی travelDirection این تنظیم را انجام میدهد.
params = new ServiceAreaParameters();
params.defaultBreaks = [2];
params.outSpatialReference = map.spatialReference;
params.returnFacilities = false;
کلاس ServiceAreaTask مناطق خدمت رسانی را در اطراف یک موقعیت پیدا میکند. ServiceAreaTask حاوی URL سرویس REST است. این URL به سرویس network analysis اشاره میکند. برای به دست آوردن منطقهی خدمات رسانی، باید متد solve() را روی ServiceAreaTask صدا بزنید. نتایج عملیات ServiceAreaTask در شی ServiceAreaSolveResult قرار میگیرد. این شی نتیجه شامل ویژگیهای متنوعی مانند ServiceAreaPolygons که آرایهای از پولیگونها است، میباشد. این پولیگونها، مناطق سرویسدهی را نشان میدهند.
برگرفته از کتاب تولید و طراحی اپلیکیشن های Web GIS و Mobile GIS با استفاده از ArcGIS API for JavaScript
نویسنده: دکتر محمد بافقی زاده
نشر: انتشارات اکادمیک