خانه » برنامه نویسی

برنامه نویسی

 راجع به ArcObjects بیشتر بدانیم…

درس اول:

 لزوم آشنایی با ArcObjects

سلام دوستان  قصد دارم یه کم از دنیای ArcObjectها براتون بنویسم. راجع به اینکه چی هستن، چه استفاده ای میشه ازشون کرد و اینکه کلاً چه دنیای وسیع و جالبیه.

قبل از اینکه بخوام شروع کنم اجازه میخوام از تمامی اساتید و دوستان خوبی و مهربونی  مثل جناب آقای دکتر بابک میرباقری و مهندس عباس بیگی که منو تو این مسیر کمک کردن تشکر و قدردانی کنم. واقعا داشتن استادای خوب نعمت بزرگیه. و اینم بگم افراد زیاد دیگه ای توی ایران  هستن  که این مفاهیم رو بهتر از من بلدن اما با کسب اجازه از همه این عزیزان میخوام از تجربیات خودم برای بقیه کاربرانی که تازه توی این مسیر قدم برداشتن بگم امیدوارم که اگه توی مطالب ارائه شده اشکال و ایرادی مبینن یادآوری کنن.

میخوام یه کم از تجربه چندیدن دوره تدریس برنامه نویسی با ArcObject براتون بگم اینکه یه کاربر عادی ArcGIS وقتی میخواد شروع به یاد گیری این مسیر بکنه معمولا دید صحیحی از اینکه ArcObjectها چیا هستن، چرا ما باید بعنوان یک کاربر نرم افزارهای مکانی شرکت ESRI اونا رو یاد بگیریم ، از کجا باید شروع کنیم و مسیر یادگیری رو چطور ادامه بدیم ندارن. خوب نمیخوام دلسردتون بکنم اما راستش مسیر زیادی تا یادگیری کامل این راه هست و نیاز به وقت و حوصله زیادی داره که خوب البته مسلما ما نیاز به یادگیری همه چیز نداریم هر کدوم از ما در حد توان و زمان خودمون میتونیم براش وقت بزاریم و به چیزایی که میخواییم برسیم. 

خوب بطور طبیعی کاربران نرم ­افزار ArcGIS قبل از استفاده از این نرم ­افزار باید با ArcObjects آشنایی داشته باشن اما شناخت اولیه از نرم افزار ArcGIS میتونه کمک قابل توجهی در فهم برنامه نویسی با استفاده از ArcObjects بکنه لذا توصیه میشه علاقه مندان گرامی قبل از شروع یادگیری ArcObjectها با این نرم ­افزار آشنایی داشته باشن.

راجع به اینکه با ArcObjectها چه کارایی میتونیم انجام بدیم باید بگم تقریبا محدودیتی در استفاده از اونا وجود نداره و بستگی به سطح تسلط شما به کلاس های اونا داره. همین قدر براتون بگم که نرم  افزار ArcMap رو با این همه بزرگی، با کلاس های ArcObject نوشتن. میدونید این یعنی چی؟ یعنی ما میتونیم یه نرم افزار مثل ArcMap یا شاید قویتر بنویسیم. فوق العادست نه! البته جو نگیر نشین چون فعلا خیلی فاصله داریم.

معمولا چند هدف اصلی در زمینه استفاده از ArcObjects مد نظر هست. فعلا میخوام در مورد معمولترین استفاده از اونها که همون سفارشی کردن نرم افزار ArcGIS هست براتون بنویسم. سفارشی کردن نرم افزار ArcGIS به این معنی که این نرم افزار رو هر طور که بخواهیم میتونیم تغییر بدیم و تنظیم کنیم این کارو میتونیم حتی بدون برنامه نویسی هم انجام بدیم. البته تغییرات با این روش در موارد اندکی نیاز ما رو برطرف میکنه و ما نیاز به کدنویسی در محیط های توسعه نرم افزار از قبیل VS.NET رو داریم. توی این روش دیگه دست ما کاملا باز هست و تقریبا به هر صورتی میتوانیم نرم افزار ArcGIS به دلخواه خودمان تغییر دهیم. از اضافه کردن فرم ها گرفته تا منوها و نوارابزارها و اکستنشن ها.

بسیاری اوقات ما نیازی به فروش یک نرم افزار نداریم بلکه میخوایم نیاز خودمون رو در انجام یکسری فرآیندهای تکراری که در کارهای روزمره با اونا برخورد می کنیم برطرف کنیم و یا حتی پا رو فراتر گذاشته و کارهایی که ArcMap قادر به انجام اونها نیست رو برنامه نویسی بکنیم. در کل میخوام اینو بگم که امروزه یادگیری ArcObjects برای هر متخصص کار با نرم افزارهای GISی مورد نیازه. چه افرادی که میخوان بطور تخصصی در زمینه برنامه نویسی در حیطه نرم افزارهای مکانی فعالیت کنن و چه اونهایی که میخوان کار خودشون رو بصورت حرفه ای تر و با صرف زمان و انرژی کمتر انجام بدن.

درس دوم:

کاربردهای ArcObjects

بطور کلی ۴ هدف اصلی در استفاده از ArcObjectها وجود داره:

  •  customize کردن (سفارشی کردن) نرم افزار ArcMap.
  •  توسعه نرم افزارهای Desktop Applications (Standalone).
  • توسعه نرم افزارهای مبتنی بر تکنولوژی وب (Web Applications).

خوب می خواهم راجع به اولین کاربرد ArcObjectها یه خورده براتون بنویسم. همونطور که گفتم هدف ما از سفارشی کردن نرم افزار ArcMap، ایجاد چیدمان دلخواه از ابزارها و منوهای نرم افزار و یا اضافه کردن ابزارها و کامپوننت های نرم افزاری خودمون هست. در کل ۴ روش واسه سفارشی کردن نرم افزار ArcMap وجود داره:

  • سفارشی کردن با استفاده از پنجره Customize در نرم افزار ArcMap.
  • سفارشی کردن با استفاده از زبان اسکریپتی Python.
  • سفارشی کردن از طریق توسعه Add-ins Componentها.
  • سفارشی کردن از طریق توسعه Custom Componentها.

روش اول: توی این روش ما میتونیم نرم افزار ArcMap رو بدون نیاز به هیچگونه تجربه برنامه نویسی سفارشی کنیم. با استفاده از پنجره Customize میتونیم عنوان تمامی منوها و ابزارهای نرم افزار رو فارسی کرد، چیدمان اونها رو عوض کرد، به منوها یا نوارابزارها میتونیم ابزارهای خودمون رو اضافه کنیم حتی تمامی منوهای کلیک راست نرم افزار رو دستکاری کرد. باورتون میشه! چه قابلیت های جالبی وجود داره حتی بدون یک خط کد نویسی. اما راستش رو بخوایین این روش علیرغم ساده گیش خیلی کاربرد عملی واسه ما نداره. بهترین توجیه توی استفاده از این روش جابجا کردن منوها وابزارها و دم دست قرار دادن اونهاییکه بیشتر ازشون استفاده میکنیم (یجای اینکه هر سری اونها رو از جاهای مختلف و با کلی مراحل اونها رو پیدا میکنیم). توی سازمان ها یه مدیر GIS میتونه با سفارشی کردن یک نرم افزار و کپی کردن فایل Normal.mxt توی یه مسیر مشترک در شبکه بقیه نرم افزارهای ArcMap در سازمان رو به یک شکل سفارشی کنه. فقط کافیه بقیه کارکنان شرکت این فایل رو توی مسیر پیش فرض نرم افزار کپی کنن و نرم افزار رو یکبار باز و بسته کنن. تمامی تغییرات مورد نظر توی نرم افزار اونها براحتی اعمال میشه. و برای برگشتش هم کافیه فایل سالم رو دوباره تو همون مسیر کپی کرد و یا فایل قبلی رو حذف کرد. یه عکس از این قابلیت رو براتون میزارم:

 Customize

—————————————————————————————————————–

روش دوم: خوب همونطوری که گفتم یکی از روش­های سفارشی کردن نرم افزار ArcMap، استفاده از زبان برنامه نویسی Python هست. راستش بحث راجع به این زبان خودش یه مبحث جداست اما همینو بدونین که این زبان رو دوستانی که تو حوضه وب کار میکنن بهتر میشناسن اگرچه میشه باهاش نرم افزارهای Desktop  هم نوشت. و میگن در آینده اگه یه زبان بتونه جای زبان جاوا رو بگیره همین Python  هست. اما اینکه توی بحث ما چقدر به کارمون میاد خدمتتون عرض میکنم.

شرکت ESRI مثل خیلی دیگه از شرکت ها این زبان اسکریپتی رو بدلیل قدرت بالا و حجم کمش در نرم افزار ArcMap، جا (embed) داده. و موقع نصب نرم افزار هم خودش نصب میشه. محیط توسعه یکپارچه (IDE (Integrated Development Environment این زبان بهراه نصب نرم افزار، خودش نصب میشه. اما میتونیم از محیط تعبیه شده در نرم افزار ArcMap، هم استفاده کنیم. در ضمن یادگیری این زبان هم سخت نیست بیشتر شبیه محاوره روزمره ست، یه کتاب مرتبط هم توی سایت واستون گذاشتم. بهترین کاربرد این زبان توی نرم افزار ArcMap، اتوماتیک کردن فرآیندهای GeoProcessing هست. میتونیم تو این زمینه یجورایی با Model Builder نرم افزار مقایسش کنیم البته اینجا دستمون خیلی بازتره. اینکه چندین عملیات بطور خودکار و حتی در یک زمان خاص (هفتگی، روزانه …) انجام بشن از قابلیت های استفاده از این زبان هست. حتی میتونین برنامه نوشته شده رو بصورت ابزار به هر کدوم از نوارابزارهای ArcMap اضافه کنیم و ازش براحتی استفاده کنیم و یا اون رو به افراد دیگه بدین.

خوب خلاصه بخوام بگم مشکل اصلی در استفاده از این زبان در سفارشی کردن نرم افزار اینه که ابزار توسعه داده توی این روش رو نمیتونیم بصورت یک فایل قابل نصب درآورد و اگه بخواهیم ابزارمون رو به فرد دیگه ای بدیم باید عملا کدمون رو بدیم. خوب راستش این محدودیت کمی نیست.

یه نمونه خیلی ساده از استفاده از این زبان رو واستون گذاشتم.

Python_Buffer

——————————————————————————————————————-

خوب و اما روش سوم:

توی ۲ روش بعدی ما نیاز به کار با کلاس های ArcObject داریم و باید با مفهوم این کلاس ها آشنا شد و بفهمیم چطوری میتونیم از اونها استفاده کنیم. لابد تا الان موقع نصب ArcGIS دقت کردین که فایل ها رو داره کجا نصب میکنه نه! خوب میدونم که خیلی ها تا الان به این چیزا دقت نکردن. موقع نصب نرم افزار، تقریباً ۷۰ اسمبلی روی سیستم شما نصب میشه و متناظر با هر کدوم از اونها یک فایل pdf توی مسیر زیر از درایو نصب نرم افزار گذاشته میشه:

C:\Program Files (x86)\ArcGIS\DeveloperKit10.1\Diagrams

خوب این فایل های pdf در واقع محتویات اون اسمبلی ها رو در قالب زبان UML به ما نشون میدن. اگه هر کدوم از این فایل رو ببینید متوجه میشید که هر فایل از چند صفحه و داخل هر صفحه تعداد زیادی کلاس به شکل مستطیل نشون داده شده. من سعی میکنم به شکل ساده براتون توضیح بدم این کلاس ها چی هستن و توی پست های بعدی نمونه کدهایی رو براتون بزارم. اما فهم کامل و عمیق این کلاس ها، نیاز به درک صحیح از مفاهیم تکنولوژی COM، شی گرایی و یک زبان برنامه نویسی سطح بالا مثل C#  و ساختار .NET Framework داره.

میخوام قبل از اینکه بییشتر وارد بحث های تخصصی تر بشیم چند تصویر از کابرد استفاده از ArcObjectها بهتون نشون بدم. چون اینکار میتونه اشتیاق ما رو در یاد گرفتن اونا بیشتر بکنه. تصویر زیر یک واسط گرافیکی رو نشون میده که بعنوان یک اکستنشن به نرم افزار ArcGIS اضافه شده. از این اکتنشن برای الحاق فایل های پیوست با فرمت های عکس، فیلم و فایل های آفیس استفاده شد. خوب از همین جا یاد میگیریم که یکی از هدف های اصلی ما واسه سفارشی کردن نرم افزار ArcGIS، بغیر از اضافه کردن واسط های گرافیکی فارسی و کاربرپسند میتونه انجام کارهایی باشه که نرم افزار قابل به انجام اونها نیست یا اینکه برای انجام اونها باید یکسری فرآیندهای تکراری رو بصورت سریالی و مرتب انجام بدیم درحالیکه خودمون میتونیم انجام اونها رو بصورت اتوماتیک در یک مرحله کدنویسی و برنامه ریزی کنیم.

Extension1یا اینکه میتونیم از این کلاس ها واسه توسعه نرم افزارهای Standalone استفاده کنیم. بطوریکه بدون نیاز به نصب ArcGIS، این نرم افزار بتونه تمامی نیاز به انجام تحلیل های مکانی رو واسه ما برطرف بکنه. بعنوان مثال تصویر زیر یک نمونه نرم افزار Standalone هست که با ArcEngine توسعه دادم. هدف از این نرم افزار این بود که بتونیم به دور از تمامی ابزارها و محیط گسترده نرم افزار ArcGIS، یک نرم افزار کاملاً فارسی داشته باشیم که علاوه بر انجام تحلیل های مکانی مورد نیاز، قابلیت انجام تحلیل های تخصصی شبکه های توزیع آب شهری مثل تحلیل سرعت و افت فشار شبکه ها (که نرم افزار ArcGIS توانایی انجام اونها رو نداره) رو هم داشته باشه. خوب این یکی از حالت هاییکه ما نیاز به توسعه نرم افزارهای مستقل داریم.

waterGIS1

درس سوم:

مفاهیم ArcObjects

 در واقع  مفهوم کلاس ها و شی ها با الهام از طبیعت به وجود اومدند. کلاس ها رو میتونین یک مدل فرض کنین که بتنهایی خودشون کاربردی و قابل استفاده نیستن اما اشیایی که ما با استفاده از این مدل ها می سازیم قابل لمس و استفاده هستن. برای اینکه واضح تر بگم یه مثال معروف رو براتون میزنم: فرض کنین یه تیکه خمیر شیرینی دارین و میخوایین شیرینی بپزین. برای پختن شیرینی های خوشگل نیاز به چندتا قالب مثلاً مثلث و مربع شکل داریم. خوب کاری که ما میکنیم اینه که قالب ها رو توی خمیر میزنیم بعدش تو فر میزاریم و شیرینی رو آماده میکنیم. خوب اگه تا الان فهمیدین کلاس و شی کجای این مثال بودن پس مطلب رو گرفتین. اگه نه عیبی نداره یکم بیشتر فکر کنین!

توی مثال بالا مدل های ما همون کلاس های ما بودن که به خودی خود شیرینی نیستن اما ما تونستیم از روی اونا شیرینی بسازیم. در واقع شیرینی های ما همون اشیاء ما هستن که وجود خارجی دارن و ما اونا رو می خوریم ( نه قالب های شیرینی (کلاس ها) رو). خوب اگه این مثال رو بیشتر باز کنیم میتونیم مفاهیمی مثل پنهان سازی، ارث بری و پلومورفیزم رو با هم ببینیم که خوب توضیح این موضوعات اینجا یه خورده طولانی میشه و از حوصله خواننده خارج. با خوندن یه کتابی که مفاهیم شی گرایی رو توضیح داده باشه میتونین این مفاهیم رو درک کنین.

خوب همینطوری که ما با یه الگو میتونیم هر تعداد شیرینی دلخواه بپزیم اینجا هم از یک کلاس هر تعداد شی که بخواییم میتونیم ایجاد کنیم. ۲ عنصر اصلی هر کلاس خصوصیات و متدها هستن که خصوصیت ها مشخصه های یک کلاس و متدها رفتار اون رو شبیه سازی میکنن. مثلا یک کلاس خودکار رو در نظر بگیرین خصوصیاتی مثل رنگ و … داره و رفتاری مثل نوشتن میشه براش تعریف کرد. البته کلاس ها مشخصه های دیگه هم دارن که مطالب بیشتر بمونه به عهده خودتون. طریقه ایجاد یک شی یا نمونه(Instance)  از یک کلاس هم با کلمه کلیدی new بصورت زیره:

;()Rectangle rect =new Rectangle

با این دستور ما شی rect رو تعریف و مقداردهی (Instantiate) کردیم. متد ()Rectangle هم سازنده پیش فرض کلاسه که همنام با کلاس هست. از این متد میتونیم برای مقدار دهی که متغیرهای یک کلاس هم استفاده کرد. توضیحات بیشتر راجع به کلاس ها و اشیا داخل فایل Getting Started with ArcObjects اومده که براتون گذاشتم.

خوب خود کلاس ها توی ArcObject سه نوع هستن:

۱-      Abstract Class: از این کلاس ها که ما نمیتونیم مثل دستور بالا با استفاده از کلمه new ازشون شی بسازیم. کلا بیشترین استفاده از این کلاس ها واسه پیاده سازی وراثت هست.

۲-      CoClass: از این کلاس ها  میتونیم با کلمه new شی بسازیم.

۳-      Class: که از این کلاس ها هم نمیشه مستقیماً شی ساخت ولی یک کلاس دیگه ای وجود داره که یه خصوصیت که  شی از این کلاس رو برمیگردونه یا یه شی داره که با استفاده از اون میتونیم یه شی از این کلاس بسازیم.

یه مفهوم دیگه بنام Interfaceها واسه کلاس ها داریم که اگه بخوام خیلی ساده مفهموشون براتون بگم اینه که وقتی کلاس ها رو ایجاد کردن، دیدن هرکلاس متدها و خصوصیات خیلی زیادی داره که اینجوری واسه پیدا کردن هر متد یا خصوصیت باید کلی میگشتن. واسه حل این مشکل اوناییکه با هم مرتبط بودن رو توی Interfaceهای مختلف دسته بندی کردن. با این کار فقط  کافیه ما بدونیم که برای هر خصوصیت یا متد باید از کدوم Interface استفاده کنیم. و از طریق اون Interface با کلاس ارتباط برقرار کنیم البته فلسفه پیاده سازی Interface ها و نحوه پیاده سازی جزئیات بیشتری داره که من اونو خیلی خودمونی براتون توضیح دادم، بازم مطالعه بیشتر رو به عهده خودتون میزارم.

درس چهارم:

خواندن سند جاری در ArcMap

همون طوری که گفتم فایل های PDF محتوای dllهای نرم افزار رو در موقع نصب نشون میدن. در این فایل ها، کلاس ها در قالب (Object Model Diagram (OMDها نمایش داده شدن. در OMDها هر چیزی با یک نماد مشخص شده مثلاً کلاس ها بصورت مستطیل شکل، خصوصیات بصورت دمبل مانند و رفتارها بصورت فلش. واسه کار کردن با OMDها یک فایل چند صفحه ای برای دوستان گذاشتم. این فایل رو خوب و دقیق مطالعه کنین.

خوب میخوام مستقیم برم سر یه خورده کدنویسی. امیدوارم تا الان فایل هایی رو که گفتم خونده باشین چون خیلی واسه فهم ادامه مطالب مهم هست. واسه سفارشی کردن نرم افزار ArcGIS، نقطه شروع کار ما کلاس Application هست.

Application

این کلاس در فضای ESRI.ArcGIS.ArcMap تعریف شده و همونطور که گفتم OMD آن در PDF هم نامش در پوشه Diagrams از مسیر DeveloperKit در مسیر نصب نصب نرم افزار وجود داره. خوب این تصویر فقط یک تیکه بالای کلاس رو داره نشون میده بهمراه یکسری از Interfaceهای این کلاس. اولین اونا IApplication هست. همونطوری که می بینید قبل از اون عبارت esriFramwork نوشته شده که منظور اینه که این Interface در فضای نام Framwork هست. همچنین بعضی بیضی ها کناره های کلاس وجود دارن که مثلاً بیضی سمت راست میگه توی این کلاس حداقل یه خصوصیت یا متد وجود داره که ما رو به کلاس MXDocument هدایت میکنه (خصوصیت Document) و واسه دیدنه این کلاس باید فایل PDF، با نام ArcMapUI رو ببینیم.

خوب قبلا یکم از کلاس ها براتون گفتم از زمانیکه روی آیکون ArcGIS کلیک میکنیم تا موقعی که نرم افزار باز شه، کلی از شی ها از نوع های مختلف رو می بینیم. از خود نرم افزار ArcMap گرفته تا تمامی منوها، نوارابزارها، ابزارها و حتی تمامی دکمه ها و اصولاً هر چیزی که می بینین یه شی از کلاس خودش هست. تصویر زیر چند تا شی اصلی از ArcGIS رو نشون میده.

Arcmapهمونطوری که تو تصویر میبینید چند تا شی اصلی در نرم افزار ArcMap نشون داده شدن. خوب کلاس متناظر تمام اشیایی که توی نرم افزار می بینید در داخل فایل های pdf وجود دارن حتی کلاس های بیشتری که در داخل خود نرم افزار هم از اونا استفاده نشده.  واسه شروع کار بهتر اینه که کلاس های متناظر اینها رو توی فایل ها یه نگاهی بندازین. نقشه ما اینه که بعد از پیدا کردن این کلاس ها یجوری اونها رو بهم ارتباط بدیم تا بتونیم به اون هدفی که میخواییم برسیم. مثلاً اگه بخواهیم اسم اولین لایه رو بخونیم باید مسیر زیر رو دنبال کنیم:

ArcMap –>Document–>DataFrame–>Layer

خوب کلاس های متناظر اونها رو بصورت زیر هستن:

Application–>MXDocument–>Map–>Layer

حتماً تا الان متوجه شدین یه جورایی باید زنجیره وار مابین کلاس ها حرکت کنین تا در نهایت به کلاس Layer رسیده و اسمش رو بخونیم. میدونم دارید راجع به چی فکر میکنید اما جوابش منفیه. نمیشه از کلاس Application مستقیماً به اسم اولین لایه دسترسی پیدا کرد و حتما باید پله به پله و زنجیره ای حرکت کنیم. خود محیط VS نقطه شروع رو که همون شی از کلاس Application بنام m_Application هست به ما میده. حالا ما باید دنبال یه خصوصیت یا رفتار توی این کلاس باشیم که ما رو به کلاس MXDocument متصل کنه یعنی یک شی از اون کلاس رو برامون برگردونه که بتونیم به اون کلاس متصل بشیم.

اگه کلاس Application رو خوب نگاه بندازین یه خصوصیت بنام Document داره که Interface IDocument رو از کلاس MXDocument برمیگردونه و این همون چیزیه که ما احتیاج داریم. واسه اتصال باید از کد زیر استفاده کنیم.

;IMXDocument pMXDocument =(IMXDocument) m_Application.Document

خوب خصوصیت Document از کلاس Application، یک شی از کلاس MXDocument از نوع واسط IDocument رو برامون برمیگردونه اگه ما بخواییم یه شی از نوع IMXDocument یعنی همون Interfaceی که ما برای اتصال های بعدی بهش نیاز داریم بریم باید یک پرش روی این دو تا Interface از یک کلاس انجام بدیم و چون Interfaceهای IDocument و IMXDocument هر دو مربوط به یک کلاس واحد یعنی MXDocument هستن فقط کافیه ما یه (QueryInterface(QI انجام بدیم.

در واقع اگه بخواییم کد بالا رو بشکنیم این خط کد دو دستور رو شامل میشه:

;IDocument pDocument = m_Application.Document
;IMXDocument pMXDocument = (IMXDocument) pDocument

که دستور اول یک شی pDocument رو مقداردهی میکنه و دستور دوم یک QI رو Interfaceهای کلاس MXDocument انجام میده و شی pMXDocument رو برای ما برمیگردونه. ( چون هر دو این Interfaceها رو یک کلاس قرار دارن نیازی نداریم دنبال یک خصوصیت یا متد در شی pDocument بگردیم و میتونیم خودش رو مستقیماً به شی pMXDocument ارسال کنیم).

همونطوری که از شکل هم پیداست شی pMXDocume برای ما نماینده سند (Document) جاری در نرم افزار ArcGIS هست. گام بعدی رفتن از Document به DataFrame فعال و سپس لایه مورد مرد نظر میشه.خود کلاس MXDocument در فضای نام ESRI.ArcGIS.ArcMapUI قرار داره و اگه بخوایین OMD این کلاس رو ببینین باید فایل pdf همنام با فضای گفته شده در مسیر که قبلاً خدمتتون گفتم رو باز کنین. که من تصویر کوچیک شده رو براتون در ادامه گذاشتم.

MXDocument

اگه شکل رو واضح نمیبینین روش کلیک کنین. خوب همونطوری که میدونین ما توی نرم افزار ArcGIS دو تا View شامل DataView  و LayoutView داریم که ما همیشه در یکی از این حالات نمایشی از نرم افزار قرار داریم. نماد DataView در ArcObject کلاس Map و نماد LayoutView، کلاس PageLayout هست. به شکل بالا دقت کنین ۳ تا بیضی نشون داده شده در شکل دارن همین چیزا رو به ما میگه. بیضی سمت چپ به همون میگه که کلاس Application بعنوان یه کانتینر برای Document ها عمل میکنه (نوع رابطه و سر لوزی تیره اون به این معناست) یعنی همون جایی که ما چند لحظه قبل کدش رو نوشتیم. و بیضی های سمت راست داره به دو تا حالت نمایشی در نرم افزار اشاره میکنه که البته میگه اگه بخوایین OMD اونا رو ببینین باید فضای نام Carto (منظور مخفف کارتوگرافی هست) رو ببینین. در ضمن یه علامت بیضی قرمز رنگ هم خودم روی شکل کشیدم که کلید ارتباطی ما برای رفتن بقیه راه هست.

احتمالاً تا الان فهمیدین چرا ما اون بالا QI انجام دادیم! چون درسته که شی pDocument از نوع کلاس MXDocument بود ولی خصوصیت هایی که ما رو میتونست به Map متصل کنه (FocusMap و Maps) جزو واسط IMXDocument بودن بخاطر همین ما مجبور به ساختن شی pMDDocument از نوع IMXdocument و QI شدیم.

 واسه اینکه اینترفیس IMxDocument در فضای ویژوال استودیو قابل استفاده باشه باید فضای نام ESRI.ArcGIS.ArcMapUI رو به مجموعه فضای نام های موجود اضافه کنیم و همچنین با دستور Using در قسمت بالای برنامه کلاس های موجود توی اون رو بصورت زیر در دسترس قرار بدیم. این دو مرحله رو برای هر اینترفیس یا کلاسی که محیط ویژوال استودیو نمیشناسه باید انجام بدیم.

Using ESRI.ArcGIS.ArcMapUI

درس پنجم:

خواندن دیتافریم فعال در ArcMap

برای رسیدن از Document به DataFrame (که باز توی ArcObject نماد DataFrame هم کلاس Map هست) باید یه خصوصیت توی کلاس MXDocument پیدا کنیم که یه شی از کلاس Map رو برای ما برگردونه. به نماد بیضی شکل قرمز رنگ که براتون کشیدم دقت کنید دو تا خصوصیت رو داره نشون میده که اولی FocusMap هست که به DataFrame فعال در نرم افزار اشاره میکنه (هونطوری که میدونین همیشه تنها یک DataFrame میتونه در نرم افزار ArcGIS فعال باشه) و خصوصیت دوم Maps به مجموعه تمام DataFrameها در نرم افزار اشاره میکنه.

بنابراین برای اتصال به DataFrame فعال فقط کافیه از خصوصیت FocusMap (از اسم خصوصیت هم مشخصه) بصورت زیر استفاده کنیم. واسه اینکه اینترفیس IMap در فضای ویژوال استودیو هم قابل استفاده باشه باید فضای نام ESRI.ArcGIS.Carto رو به مجموعه فضای نام های موجود اضافه کنیم. و با دستور Using در قسمت بالای برنامه کلاس های موجود توی اون رو در دسترس قرار بدیم.

Using ESRI.ArcGIS.Carto

MXDocument

حالا میتونیم از کلاس Map واسه دسترسی به هر کدوم از لایه های مدنظرمون دسترسی داشته باشیم. اما اجازه بدین قبل از اینکه جلوتر بریم یکم بیشتر از اشکال گرافیکی که توی ترسیم کلاس ها از اونا استفاده شده توضیح بدم.

نماد خصوصیات در زبان UML شکل دمبل ماننده که گاهی اوقات یکسر اون سفید رنگه. مربع سمت چپ نماد نوشتن و مربع سمت راست نماد خواندن می باشد.

کد:

;IMXDocument mxDocument = (IMXDocument) m_Application.Document
;()IMap map = mxDocument.FocusMap

درس ششم:

خواندن یک لایه خاص با اندیس

پس از خواندن دیتافریم فعال با استفاده از متد FocusMap()، حالا نوبت به خواندن لایه ها میرسه. برای اینکار باید از خصوصیت Layer در کلاس Map که تا اینجا بهش رسیده بودیم استفاده کنیم. این خصوصیت یک اندیس رو بعنوان پارامتر ورودی گرفته و لایه متناظر با اون رو برمیگردونه. این اندیس در واقع شماره لایه ها  در دیتافریم فعال با شروع از صفر هست. این نکته رو دقت داشته باشین که تمامی اندیس ها در سی شارپ و ArcObjects همه از صفر شروع میشن یعنی اینکه اندیس اولین لایه صفر و دومین لایه یک و … . یک نکته خیلی مهم دیگه اینکه در کلاس های ArcObject، خصوصیت هایی که ورودی از هر نوعی دریافت میکنن در زبان سی شارپ باید قبل از نام خصوصیت موقع خواندن از کلمه کلیدی get_ و موقع نوشتن از کلمه کلیدی set_ استفاده کرد و بعد نام خود خصوصیت رو نوشت (البته در زبان VB.NET این امر لازم نیست). در مثال ما برای خواندن اولین لایه بصورت زیر عمل میکنیم که:

;(ILayer layer = map.get_Layer(0

اگه این خط کد رو تایپ کنین میبینین که VS، اینترفیس ILayer رو میشناسه و در نوشتن این کلمه کمکتون میکنه. خوب معلومه چرا؟ چون این اینترفیس هم مانند IMap جزو فضای نام Carto هست که ما قبلاً رو اضافه کردیم وقتی ما برای استفاده از یک کلاس یا اینترفیس، فضای نام مربوط به اون رو اضافه میکینیم از اونجا به بعد دیگه تمامی کلاس ها و اینترفیس های اون فضای نام قابل دسترسی هستن و ما هر بار نیاز به اضافه کردن اون نداریم.

 با تعریف یک متد GetLayer که دو آرگومان اولی از جنس IApplication و دومی یک عدد صحیح بعنوان شماره لایه در دیتافریم فعال میگیرد میتوان لایه مورد را برگرداند. برای خواندن لایه مورد نظر از خصوصیت Layer از کلاس Map استفاده میشه که همونطوری که گفته شد چون این خصوصیت نیاز به آرگومان عددی دارد از طرفی ما میخواییم یک Layer رو از آن بگیریم (بخوانیم) پس برای استفاده باید بصورت get_Layer مورد استفاده قرار گیرد. (البته همونطوری که در دیاگرام هم میتونین ببینین این خصوصیت یک خصوصیت فقط خواندنی هست).

Private ILayer GetLayer (IApplication m_Application , int indexLayer
}
;IMXDocument mxDocument = (IMXDocument) m_Application.Document
;()IMap map = mxDocument.FocusMap
;(ILayer layer = map.get_Layer(indexLayer
;Return layer
{

دیاگرام زیر این خصوصیت رو که در صفحه اول دیاگرام Carto هست رو نشون میده:

 Get_Layer

خوب مقدار برگشتی این متد از نوع ILayer هست. ILayer اینترفیس پیش فرض کلاس Layer در صفحه سوم همان دیاگرام Carto هست. که تصویر اون رو در ادامه میبینین:

ILayer

همونطور که در دیاگرام بالا میبینین علامت بیضی سمت راست نشون میده که ما کلاس Map و از همین فضای نام به اینجا میایم.

درس هفتم:

خواندن یک عارضه از طریق FID

برای دسترسی به جدول اطلاعات توصیفی یک لایه وکتوری و عوارض آن، باید از کلاس IFeatureLayer استفاده کرد این کلاس هم در فضای نام Carto قرار دارد و از کلاس Layer ارث بری می کند. رابطه ارث بری مابین کلاس های Layer و FeatureLayerBase این امکان QueryInterface را مابین این کلاس ها برای ما فراهم می کند. البته کلاس FeatureLayerBase بطور مستقیم از کلاس Layer ارث بری نمی کند و چندین کلاس این وسط وجود دارند اما چون که در نهایت تمامی این روابط از نوع ارث بری هست پس ما میتونیم بگیم رابطه بین این دو کلاس هم از نوع ارث بری هست و این همان دلیل کافی برای ما به منظور پرش از اینترفیس Ilayer به IFeatureLayerBase هست.

به دیاگرام زیر توجه کنین:

ILayer_IFeatureLayer

خصوصیت FeatureClass در کلاس FeatureLayerBase ارتباط با  فضای نام GeoDatabase و کلاس FeatureClass را امکان پذیر می سازد که از این کلاس میتوان برای خواندن Feature مورد نظر استفاده کرد.IFeatureLayer_FeatureClass

تصویر زیر دیاگرام صفحه اول فضای نام GeoDatabase و کلاس FeatureClass را نشان میده:

Geodatabase

کلاس FeatureClass امکان دسترسی به تمام اطلاعات جدول توصیفی لایه ها در ArcMap را برای ما فراهم میکند. انجام هر عملیاتی از قبیل خواندن، ایجاد، حذف و ویرایش عوارض از طریق این کلاس صورت میگیرد. ما برای خواندن عوارض با یک FID خاص از متد (GetFeature (in ID:Long استفاده میکینم. این متد FID عارضه مورد نظر را گرفته و IFeature مربوطه را برمیگرداند.

GetFeature

متد GetFeatureByFID در ادامه برای همین منظور نوشته شده که دو آرگومان اولی از جنس Iapplication و دومی FID عارضه مورد نظر را می پذیرد.

(Private IFeature  GetFeatureByFID (IApplication m_Application , int FID
}
;IMXDocument mxDocument = (IMXDocument) m_Application.Document
;()IMap map = mxDocument.FocusMap
;(ILayer layer = map.get_Layer(indexLayer
;IFeatureLayer featureLayer = (IfeatureLayer) layer
;IFeatureClass featureClass = featureLayer.FeatureClass
;(IFeature feature =  featureClass.GetFeature( FID
;Return  feature
{

درس هشتم:

خواندن فیلد های یک لایه
به منظور خواندن لیست فیلدهای یک لایه مکانی کافیست از خصوصیت Fields کلاس Table استفاده نمود. این خصوصیت یک شی از کلاس Fields برمیگرداند که میتوان با استفاده از ساختارهای چرخشی از قبیل For آنرا پیمایش نموده و به تک تک فیلدها دسترسی پیدا نمود.
همانطور که در تصویر پایین مشاهده میکنید اینترفیس IFeatureClass از اینترفیس IObjectClass ارث بری میکند و اینترفیس IObjectClass نیز از اینترفیس IClass. بنابراین اینترفیس IFeatureClass می تواند تمامی متدها و خصوصیات دو اینترفیس دیگر را پیاده سازی کند این موضوع را براحتی میتوان در محیط VS فهمید بگونه ای که چنانچه جلوی یک شی از نوع اینترفیس IFeatureClass یک نقطه تایپ کنین نه تنها اعضای خود این اینترفیس بلکه تمامی اعضای دو اینترفیس دیگر از جمله Fields را که در دیاگرام متعلق به کلاس Table هست را نیز نمایش میدهد و این قانون ارث بری است.
1

خصوصیت فقط خواندنی Fields یک شی از نوع اینترفیس IFields برمیگرداند با استفاده از این اینترفیس و خصوصیت فقط خواندنی Field از این اینترفیس میتوان به فیلدها دسترسی پیدا کرد اما همانطور که قبلاً گفته شد چون این خصوصیت اندیس فیلد را بعنوان ورودی دریافت میکند بنابراین باید بصورت get_Field مورد استفاده قرار گیرد.
2متد GetFields فیلدهای یک لایه با اندیس ورودی را خوانده و نام آنها را به یک کنترل بعنوان مثال ComboBox با نام cboFields اضافه می کند.برای این منظور آیتم های یک ComboBox را با استفاده از متد Clear پاک می کنیم.

(Private void  GetFeilds (IApplication m_Application
}
;IMXDocument mxDocument = (IMXDocument) m_Application.Document
;()IMap map = mxDocument.FocusMap
;(ILayer layer = map.get_Layer(indexLayer
;IFeatureLayer featureLayer = (IFeatureLayer) layer
;IFeatureClass featureClass = featureLayer.FeatureClass
;IFieds fields = featureClass.Fields
;()cboFields.Items.Clear
(++For ( int i=0 ; i <= fields.FieldCount ; i
}
;(IField field = fields.get_Field(i
;(cboFields.Items.Add( field.AliasName
{
{

درس نهم:

جستجوی توصیفی عوارض  لایه های مکانی
در آموزش های قبلی تا خواندن جدول اطلاعات توصیفی و فیلدهای یک لایه پیش رفتیم. در این آموزش نحوه نوشتن Query برای جستجوی عوارض را یاد می گیریم. برای انجام یک پرس و جوی توصیفی از کلاس QueryFilter در فضای نام GeoDatabase استفاده می شود. در واقع ما تا الان بعنوان یک کاربر نرم افزار   ArcGIS، بدون آگاهی قبلی بارها بارها از این کلاس استفاده کرده ایم بعنوان مثال پنجره Selection By Attribute با استفاده از همین کلاس عوارض با مقادیر تعیین شده را برای ما یافته و انتخاب می کند که در آموزش های بعدی به نحوه انتخاب عوارض نیز می پردازیم. نحوه کار با این کلاس به این صورت است که همیشه با کلمه New از این کلاس یک نمونه یا شی ایجاد کرده و سپس شرط مورد نظر را تعیین می کنیم. دیاگرام زیر مکان کلاس را در فضای نام  GeoDatabase نشان می دهد:
QueryFilter

خصوصیت های اصلی این کلاس WhereClause و SubFields می باشند که خصوصیت WhereClause یک مقدار از نوع رشته ای، در واقع همان شرط را می پذیرد و خصوصیت اختیاری  SubFields لیست فیلدهای برگشتی را مشخص می کند: QueryFilter

همانطور که گفته شد مقدار دهی به خصوصیت SubFields اختیاری است در صورت تعیین نکردن این خصوصیت تمامی فیلدهای عوارض یافت شده برگشت داده می شوند. طبیعتاً در کار با جداول توصیفی بزرگ این خصوصیت می تواند در بالا بردن سرعت انجام پرس و جو تاثیر بسزایی داشته باشد. در واقع این طور می توان بیان کرد که خصوصیت WhereClause یک برش افقی از عوارض و خصوصیت SubFields یک برش عمودی از عوارض انتخاب شده را برمی گرداند.

چند نکته:

– در نوشتن شرط چنانچه قصد جستجوی یک عبارت رشته ای را دارید باید در دو طرف آن (‘) قرار دهید:

;()IQueryFilter queryFilter = new QueryFilterClass

;'”queryFilter.WhereClause = “TYPE = ‘Restaurant

–  برای مشخص کردن چند فیلد می توان نام فیلد ها را با کاما از هم جدا نمود:

;”queryFilter.SubFields = “NAME, ADDRESS

– در صورت استفاده از SubFields، تنها از مقادیر فیلدهای مشخص شده میتوان استفاده نمود. در غیرصورت برنامه با خطا مواجه می شود.

– مقدار پیش فرض خصوصیت SubFields، برابر با “*” است که به معنی همه فیلدها می باشد. و در صورت مشخص نکردن مقدار همه فیلدهای توصیفی برگشت داده می شوند.

– مواقعی از قبیل انتخاب عوارض که نیازی استفاده از مقادیر برگشتی از عوارض یافت شده نداریم مقداردهی به این خصوصیت ضرورتی ندارد.

– موقع ویرایش عوارض همیشه از مقدار پیش فرض (“*”) استفاده کنید.

– در خصوصیت WhereClause از عمگرهای رابطه ای بصورت جدول زیر می توانید استفاده کنید:QueryFilterادامه دارد …

images (2)

۵۴ نظر

  1. با سلام و تشکر از مطالب بسیار مفیدتون

    یه سوال داشتم راجع به آماده سازی محیط VS برای استفاده از کتابخانه های ARCGIS. چه کتابخانه ای باسد دانلود کنم و اگر امکان داره یه توضیحات کلی بهم بدین که از کجا باید شروع کنم به نوشتن اولین کد. من از سی شارپ و دات نت ۴ استفاده میکنم

    با تشکر فراوان

    • سلام دوست عزیز
      شما باید SDK مربوط به .NET رو که در فایل نصبی خود نرم افزار ArcGIS هست رو نصب کنین و نیازی به دانلود کردن اون ندارین. بعد نصب یکسری template ها از شرکت ESRI به نرم افزار VS اضافه میشن که با استفاده از اونها میتونین شروع به کار کنین.
      موفق باشین

    • ممنون از جوابتون. یک سوال دیگه هم داشتم. یکم سر در گم شدم و نمیدونم اصولا تفاوت بین ARCOBJECT و ARCENGIN چی هست وبرای برنامه نویسی در محیط .NET کدومشون کامل ترن و تفاوت این دو با SDK که در ARCGIS نصب میشه چی هست. من میخوام برنامه ای بنویسم که در اون سوئیچ ها و تجهیزات برقی وجود داره…بهتره که از کدوم راه استفاده کنم.
      بسیار ممنون میشم اگه راهنماییم کنید.

      • سلام
        جواب این سوال تو نظرات قبلی دوستان هست
        آرک آبجکت ها مجموعه وسیعی از کلاس هایی هستن که اساس توسعه کلیه نرم افزارهای مکانی شرکت ESRI رو تشکیل میدن حالا این نرم افزارها میتونن در قالب یک اکستنشن واسه نرم افزارهای ArcGIS for Desktop باشه یا در قالب یک نرم افزار Standalone و یا یک نرم افزار تحت وب.
        حالا اگه شما قصد توسعه یک نرم افزار مستقل یا اصطلاحاً Standalone رو داشته باشین (نرم افزارهایی که برای اجرای اونها نیازی به نصب نرم افزار ArcGIS وجود ندارد) نیاز به نصب نرم افزار ArcEngine رو دارین این نرم افزار یکسری کامپوننت و template رو به نرم افزار Visual Studio اضافه میکنن که برای توسعه نرم افزارهای مستقل ضروری هستن با وجود استفاده از این کامپوننت ها، شما باید باز هم از کلاس های ArcObject استفاده کنین.
        (حتی دوست عزیز تمامی کامپوننت های ErcEngine هم از کلاس های ArcObject نوشته شدن) (شکلک لبخند).
        فرقی نمیکنه که شما برای چه برنامه ای میخوایین استفاده کنین در هر صورت باید sdk رو نصب کنین تا بتونین از ArcObjectها استفاده کنین

        موفق باشین
        قیاسوند

  2. محمد رضا آکوشیده

    با سلام در VS من SDKموجود نیست چطور باید به دست بیارم
    پیشاپیش ممنون

  3. با سلام ببخشید میشه راهنماییم کنید من می خوام از الگوریتم های ابتکاری توی مکانیابی کاربری ها استفاده کنم توی بعضی مقالها نوشته بود از ارک انجین و برنامه نویسی ویژوال دات نت استفاده کردند بعضی از ارک آبجکت و کمی هم با متلب . حالا نمی دونم باید چی کار کنم به نظرتون با چی کار کنم کدوم بهتر و راحتره یاد بگیرم خواهش می کنم جوابموبدید……برای تزم می خوام

    • سلام
      شما دو گزینه دارین یا برنامه نویسی با متلب و یا برنامه نویسی با ArcObject. معمولا برای انجام کارای تز اگه بخوایین برنامه نویسی برای رسترها رو انجام بدین از متلب استفاده میکنن یکی از دلایلش اینه که سرعتش بالاتره وآسونتر هم هست. ولی اگه میخوایین نگاهی به آینده کار در محیط های GISی داشته باشین بهتره برید دنبال ArcObjectها. برای این حالت هم باید در محیط ویژوال استودیو برنامه نویسی کنین و اگر بخوایین یک نرم افزار مستقل طراحی کنین باید ArcEngine رو هم نصب کنین. واسه توضیحات بیشتر میتونین پاسخ با نظرات بقیه دوستان تو سایت رو مشاهده بفرمایین.
      موفق باشین

  4. سلام
    وقتی sdkرا نصب می کنم در قسمت برنامه نویسی c# نمی تونم از کلاس های arcobjectsاستفاده کنم می خواستم ببینم مشکل کجاست؟

    • سلام

      شما نیاز دارین که رفرنس های مربوط به کلاس های ESRI رو به پروژه اضافه (using) کنین تا این کلاس ها برای شما قابل دسترس بشن.

      • سلام
        من رفرنس ها را usingکردم اما باز کلاس ها قابل دسترس نبودن؟می خواستم اگه میشه sdkبرای arcgis10 را روی سایت بگذارید؟ممنون

        • سلام دوست عزیز
          اگه این فایل در فولدر SDK_dotnet از فایل های arcgis 10 قرار داره و براحتی میتونین آن را نصب کنین.
          شما باید دو مرحله رو برای دسترسی کلاس ها انجام بدین
          اول باید رفرنس مربوطه به پوشه reference پروژه اضافه کنین
          دوم اون رفرنس رو using کنین

          مثلا برای دسترسی به IMap باید رفرنس Carto رو اضافه و سپس using کنین
          سعی میکنم توی اولین فرصت یه فایل تصویری برای انجام اینکار توی سایت بزارم میتونین توی قسمت برنامه نویسی ازش استفاده کنین.
          موفق باشین

          • سلام
            اول تشکرمیکنم.خیلی خیلی ممنون با این کار تونستم از کتابخانه های موجود در قسمتcomدر محل نصب نرم افزار استفاده کنم.
            اما می خواستم بدونم چگونه با نصب sdkدر قسمت چپ visual studio یک گزینه ای به نام arc gisمی آیدمثل windows form application .به طوری که با کلیک بر روی arcgisوارد قسمت کدنویسی شویم نه با کلیک بر روی windows form application.

          • سلام
            تصویر مربوط به این صفحه رو براتون ایمیل کردم.

  5. سلام
    چگونه می توان از متد()openfromfile که داخل رابط IworkspaceFactory می باشد در محیط سی شارپ استفاده کرد؟ممنون

    • سلام
      از این متد برای باز کردن GeoDatabase استفاده میشه و یک شی از کلاس Workspace برمیگردونه و دو تا آرگومان میگیره که اولی مسیر GeoDatabase هست و دومی رو که همیشه میتونین ۰ بدین.
      ;()IWorkspaceFactory workspaceFactory = new ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactoryClass-
      ;(IWorkspace = workspaceFactory.OpenFromFile(nameOfFile, 0

      مسیر فایل هم میتونه بصورت زیر باشه:
      “nameOfFile = “E:\\data\\english\\FileGDB\\canada\\canada.gdb

  6. با سلام و خسته نباشید حضور آقای قیاسوند و همکاران
    سوالی که داشتم اینکه بنده تا حدودی با زبان برنامه نویسی پایتون آشنایی دارم و برای استفاده از آن در محیط ArcGIS منابع متعد لاتین را ترجمه و مطالعه کردم. اما تمام کارهایی که با استفاده از توابعArcpy از قبیل تابع Describe، توابع لیست اشیاء و ماژول Mapping و حتی نوشتن اسکریپت و انجام پردازش های مکانی و غیره صورت می گیرد همه شان در محیط ArcGIS Desktop به راحتی و با چند کلیک ساده انجام می گیرند یعنی من قابلیت تازه ای را ندیدم که بتوان با برنامه نویسی پایتون انجام داد که در محیط خود ArcGIS نباشد. آیا برنامه نویسی با پایتون در محیط GIS همین است و یا قابلیت و جنبه های دیگری هم وجود دارد که باید آموخت؟
    خیلی ممنون میشم که وقت بزارین و جواب بدین.تشکر

    • سلام دوست عزیز
      در واقع همین طور هست که فرمودین. تمام اون کارها رو میشه با خود نرم افزار هم انجام داد اما گاهی اوقات انجام یکسری فرآیند های پی در پی میتونه برای یکسری افراد با برنامه نویسی راحتتر باشه تا با کار کردن با نرم افزار. از سوی دیگه به نظر من استفاده از پایتون بیشتر زمانی مطرح میشه که شما بخوایین یکسری عملیات های GeoProccessing انجام بدین اینطوری این کارها با سرعت بیشتری انجام میشن همچنین میشه یکسری عملیات ها رو بصورت خودکار و مثلا در یک بازه مشخص انجام داد (بدون دخالت کاربر).
      امیدوارم تونسته باشم راهنماییتون کنم.
      موفق باشین

  7. به خاطر راهنمایی ارزشمندتان از شما سپاسگزارم. خداوند نگهدارتان باد…

  8. با سلام خدمت شما و تبریک سال نو و همچنین عرض خسته نباشید؛ ببخشید بنده می خواستم بدونم اگر بخواهیم یک اپلیکیشن با engine و در vs بسازیم این مورد حتماً برای نصب رو سیستم ها لایسنس engine یا runtime رو می خواد؟اگر بخواهیم این مورد رو حل کنیم در جایی که لایسنس اونو نداریم و با کرک هم جواب نمیده باید با کامپوننت های یه برنامه اوپن سورس این کار رو بکنیم؟مثلا qgis ؛ اگر اینطور هستش آیا کتاب یا رفرنس خاصی برای راهنمایی ساخت اپلیکیشن با استفاده از کامپوننت های اوپن سورس وجود داره؟باتشکر از راهنماییتون.ممنونم

    • سلام ممنون
      شما برای توسعه اینطور نرم افزارها حتماٌ باید از نرم افزار ArcEngine با لایسنس معتبر استفاده کنین. من هنوز با کامپوننت های اوپن سوسرس کار نکردم و رفرنسی رو هم نمیشناسم اما حدس میزنم توانایی کامپوننت های ArcEngine رو نداشته باشن.
      موفق باشین

  9. باسلام خدمت شما
    ببخشید یه منبع برای یادگیری arc object وجود داره ؟
    ممنون میشم اگه کتابی در اختیار دارید برای بنده ارسال کنید
    با تشکر

  10. باسلام
    ببخشید همه ی کتاب هایی که شما زحمت کشیدید وگذاشتین انگلیسی من می خواستم ببینم منبع فارسی هم وجود داره ؟
    یه سوال دیگه این که شما بالا گفتید که برای مطالعه ی ODM ها یه فایل چند صفحه ای گذاشتم ولی آدرسش رو نگفنید میشه آدرس اون رو هم بگید
    باتشکر فراوان

  11. سلام
    ببخشید m_application توی چه Namespaceی هست؟
    باتشکر

  12. سلام ببخشید آقای قیاسوند بنده دیروز یه ایمیل به شما دادم اگه میشه لطف کنید و به این پاسخ بدید

    • سلام دوست عزیز

      فایلتون رو extract کردم. ولی متاسفانه فایلتون مشکل داشت و فرم Selection_frm قابل خواندن نیست.
      لطفاً دوباره فایل رو بفرستین.

  13. ببخشید آقای قیاسوند من میرم قسمت Document فایل برنامه رو کپی می کنم بعد فشردش می کنم ولی باز هم Selection_frm قابل خوندن نیست

  14. سلام ببخشید مگه این کدهارو توی سی شارپ ننوشتین ؟ من برنامه ی درس هشتم رو می خوام بنویسم خطا میده!! توی خط اول هم خطا میده که متن خطا به صورت پایین هست
    MIxDocument is a ‘type’ but is used like ‘variable
    باسپاس

  15. خیلی ممنون این مشکلم حل شد
    ببخشید فقط الان نمیدونم ورودیش که IApplication m_Application هست چیه؟ یعنی باید چی الان بهش بدم؟

  16. منظور بنده اینه که وقتی فایل رو از فولدر project کپی می کنم و یه جای دیگه مثلا دسکتاپ انتقال میدم دیگه پروژه رو نمی تونم باز کنم همون طور که شما میگید میشه یعنی فرم Selection_frm قابل خواندن نیست

  17. دلیلش رو فهمیدم
    اگه می شه فایل رو وقتی Extract کردین ببرین توی مسیر Documents\Visual Studio 2010\Projects پیست کنید درست میشه البته نباید این طوری باشه ولی من الان امتحان کردم جواب داد
    خیلی ممنون

  18. سلام
    ممنون که این همه زحمت می کشید
    من میخام با arcobject یه نقشه رو grid کنم که وقتی به Graticule mapGrid = new Graticule(); میرسه خطا زیر رو میده می ده , از arcobject 10.2 هم استفاده می کنم, اگه امکانش هست راهنمایی بفرمایین.ممنون.
    Could not load native libraries.
    java.lang.UnsatisfiedLinkError: no ntvauth in java.library.path
    java.lang.UnsatisfiedLinkError: no ntvauth in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1865)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
    at com.esri.arcgis.interop.NativeLoader.loadLibrary(Unknown Source)
    at com.esri.arcgis.interop.NativeAuth.c(Unknown Source)
    at com.esri.arcgis.interop.c.a(Unknown Source)
    at com.esri.arcgis.interop.RpcConnectionHandler.a(Unknown Source)
    at com.esri.arcgis.interop.hb.a(Unknown Source)
    at com.esri.arcgis.interop.Dispatch.createDispatch(Unknown Source)
    at com.esri.arcgis.interop.Dispatch.(Unknown Source)
    at com.esri.arcgis.carto.IMapGridProxy.(Unknown Source)
    at com.esri.arcgis.carto.IGraticuleProxy.(Unknown Source)
    at com.esri.arcgis.carto.Graticule.(Unknown Source)
    at com.esri.arcgis.carto.Graticule.(Unknown Source)
    at BasicViewer.main(BasicViewer.java:142)
    Exception in thread “main” java.lang.UnsatisfiedLinkError: com.esri.arcgis.interop.NativeAuth.getNegociateMessage()[B
    at com.esri.arcgis.interop.NativeAuth.getNegociateMessage(Native Method)
    at com.esri.arcgis.interop.NativeAuth.a(Unknown Source)
    at com.esri.arcgis.interop.tb.b(Unknown Source)
    at com.esri.arcgis.interop.tb.a(Unknown Source)
    at com.esri.arcgis.interop.RpcConnectionHandler.(Unknown Source)
    at com.esri.arcgis.interop.RpcConnectionHandler.a(Unknown Source)
    at com.esri.arcgis.interop.hb.a(Unknown Source)
    at com.esri.arcgis.interop.Dispatch.createDispatch(Unknown Source)
    at com.esri.arcgis.interop.Dispatch.(Unknown Source)
    at com.esri.arcgis.carto.IMapGridProxy.(Unknown Source)
    at com.esri.arcgis.carto.IGraticuleProxy.(Unknown Source)
    at com.esri.arcgis.carto.Graticule.(Unknown Source)
    at com.esri.arcgis.carto.Graticule.(Unknown Source)
    at BasicViewer.main(BasicViewer.java:142)

  19. سلام و عرض ادب آقای مهندس
    من یک وب اپلیکیشن با سیلورلایت و c# نوشتم. نیاز هست که نرم افزار برای بعضی از کاربرا محدودیت داشته باشه طوری که نتونن از یک extent مشخصی خارج بشن. یعنی خارج از یک extent مشخص نتونن pan کنن. چه طور میشه این کارو کرد و extent رو بست و محدود کرد ؟

  20. سلام من ArcGIS desktop و engine و sdk .net را نصب کردم که همه ورژن ۱۰٫۱ هستند
    داخل ویژوال استدیو که میرم ArcGIS وجود داره و داخل windows application (engine) میرم اما اگر از toolbox ابزار مربوط به ArcGIS را داخل فرم بزارم یک ارور میده و authorization میخواد اگر راهنمایی کنید ممنون میشم

    اگر سریعتر به من کمک کنید ممنون میشم یا اینکه شماره ای بدهید تا تماس بگیرم

    • سلام

      تو این مرحله نباید مشکلی داشته باشین این خطا ممکنه زمانی اتفاق میافته که شما میخوایین روی سیستم کاربر دیگه نصب کنید.

  21. چطوری می تونم برای یک پروژه Arc Map با استفاده از ویژوال یه صفحه لاگین بسازم

    • سلام
      با استفاده از واسط IDocumentEvents در فضای نام ArcMapUI و متد OpenDOcument میتونین هر پنجره ای رو که میخوایین قبل از موقع باز Document در ArcMap نمایش بدین و در صورت اطلاعات معتبر اجازه باز شدن اون رو بدین.

  22. با سلام و خسته نباشید
    جناب آقای مهندس قیاسوند من می خواهم یک برنامه برای خطوط انتقال یک مجتمع روستایی تحت gis بنویسم که دارای ویژگی های زیر باشد
    اولا اگر لوله یا هر تاسیسات دیگر در این مجتمع تغییر کرد یک کاربر معمولی بتواند آن را به راحتی وارد نماید.
    دوما اگر تاسیسات دچار مشکل شدند به اپراتور بگوید که کدام شیر را ببندد که آب هدر نرود
    چه کنم واقعا گیج شده ام

    • سلام

      شما نیاز به یک اپلیکیشن GIS دارید که بهتره تحت وب باشه. برای مورد اول که خوب باید فرم های ورود داده ها برای سیستم طراحی کنین و برای تحلیل دوم دنبال نمونه کد برای Isolation Valves در شبکه ها بگردین میتونه کمکتون بکنه.

      موفق باشین

  23. خیلی خیلی ممنون از راهنماییتون
    نرم افزار microsoft visual studio کدام بخش را بایستی نصب کنم چون از یک فرد کامپیوتری که پرسیدم گفتند چند دی وی دی می باشد. کدام دی وی دی بایستی نصب گردد؟
    ایا برای طراحی فرم های ورود داده کتابی است.
    من به تازگی وارد بحث برنامه نویسی شده ام و اصلا سردر نمی آورم بهتر است از کجا شروع کنم
    یک مدت arcpy را خواندم اما همانطور که نوشتید اصلا هیچ برتری به خود toolbox های جی ای اس نداره.
    از چه منبعی استفاده کنم؟
    تقریباً کار با نرم افزار gis را بلدم اما برنامه نویسی را نه
    از همکاریتون متشکرم

  24. سلام آقای مهندس
    یه سوال داشتم ازتون
    یک فرم هست که کاربر بر روی وب اونو پر می کنه . یکی از ورودی های این فرم ژئومتریه که به فرمت json در اومده. این فرم با AJAX به سرور ارسال میشه. سمت سرور چه طور میشه این فرم رو گرفت و در دیتا بیس ذخیره کرد؟ ( نیاز به استفاده از توابع مکانی است سمت سرور). چه برنامه ای چه کدی باید بنویسم سمت سرور. ممنون میشم اگر راهنماییم کنید.

  25. سلام خسته نباشید.من میخواستم بدونم برای مکانیابی از چه طریقی باید الگوریتم ژنتیک رو در جی ای اس استفاده کنم؟واقعا گیج شدم.هیچ منبعی پیدا نکردم

  26. سلام لطفا فایل دانلود arcobject sdk.net برای ورژن ۱۰٫۳ قرار بدید.

جوابی بنویسید

ایمیل شما نشر نخواهد شد.خانه های ضروری نشانه گذاری شده است. *

*