استفاده از داده های مکانی در EFCore -قسمت اول

استفاده از داده های مکانی در EFCore  -قسمت اول
فهرست مقاله [نمایش]

    امروزه در اکثر برنامه­ ها ما مجبوریم از داده­های مکانی یا SpatialData برای پیشبرد اهداف خود استفاده و منطق برنامه را بر اساس این نوع داده­ ها پیاده سازی کنیم.ما با داده های مکانی میتوانیم امکاناتی نظیر یافتن نزدیک ترین کاربران به یک محل خاص و یا نمایش رانندگانی که وارد محدوده طرح ترافیک شده اند را به برنامه های خودمان اضافه کنیم. برای مثال اپلیکیشن­ های تاکسی­ یاب نظیر اسنپ و تپسی را در نظر بگیرید هنگامی که درخواست خود را در اپلیکیشن مسافر ثبت می ­کنیم با استفاده از داده­ های مکانی نزدیک ترین راننده ها به موقعیت مکانی ما را پیدا می­کند و درخواست را به آنها ارسال میکند و ادامه ماجرا.

     درکشور خودمان هم می ­بینیم که استارتاپ­ های خیلی زیادی بر اساس داده­ های مکانی و Location-base نظیر اسنپ , نت بار , چلیوری , الوپیک و... راه اندازی شده ­اند و تغیرات بزرگی در سبک زندگی مردم ایجاد کرده­اند، و همه این ها بدون استفاده از داده های مکانی امکان پذیر نبودند.

    در این مقاله ما به موارد زیر میپردازیم

    1. آشنایی با داده های مکانی
    2. معرفی سیستم Coordinate
    3. دسته بندی داده های مکانی
    4. معرفی DataType های Geometry  و Geography

    آشنایی با دادها­ی مکانی

    داده مکانی به انواع اشیاء و داده ها یا عناصر فیزیکی موجود در یک فضای جغرافیایی اشاره دارد. مانند ساختمان ها، جاده­ ها ،کوه ها و یا دریاچه ­ها در سطح زمین. به طور کلی داده مکانی نشان دهنده مکان،اندازه و شکل یک شئ درسیاره زمین است.

    معرفی سیستم Coordinates 

    یک سیستم مختصات جغرافیایی است که با استفاده از این سیستم موقعیت هر نقطه بر روی سطح کره زمین را با دو عدد میتوان مشخص کرد.که به این دو عدد طول جغرافیایی   و عرض جغرافیایی یا Lat,Long  گفته می ­شود. مقادیری که برای  Long میتوانیم ثبت کنیم عدی از -180 تا 180  و برای Lat  عددی از -90 تا 90  می ­باشد.

     

     

     coordinate  سیستم مختصات جغرافیایی

    دسته بندی داده های مکانی

    برای ذخیره سازی داده ­های مکانی شش نوع مختلف وجود دارد که با استفاده از این انواع داده ای هر شئ که روی کره زمین است را می­توان در بانک های اطلاعاتی ذخیره کرد.

    • Point
    • LineString
    • Polygon
    • MultiPoint
    • MultiLineString
    • MultiPolygon

     

    Point    

    محل فیزیکی اشیاء را با نوع داده­ای Point  می­توان نمایش داد. به عنوان مثال محل یک سوپرمارکت در شهر تهران را با یک نقطه که دو عدد Lat,Long  را دارد نمایش داده می­شود.

     

    point

     

    LineString

    جاده­ ها، خیابان­ ها، کوچه­ ها  و برخی دیگر از موجودیت­ های روی کره زمین را با LineString   یا مسیر می­توان نمایش داد.هر مسیر حداقل یک نقطه شروع و یک نقطه پایان دارد و در این بین نیز میتواند نقاط دیگری داشته باشد.برای مثال یک جاده از یک نقطه شروع  و در یک نقطه خاتمه می­یابد و پیچ خم ­های بین جاده را با نقاط میانی مشخص میکنیم.

    LineString in Spatial Data

     

     

    Polygon

    محدوده­ ی ساختمان ها، شهرها، استان­ها و هرکجا که محیط یا مساحت اهمیت داشت میتوانیم از نوع داده­ای Polygon  یا چند ضلعی استفادهکنیم.هر چند ضلعی از چندین نقطه تشکیل شده است که نقطه شروع و پایان آن دارای مختصات یکسانی است.

    MultiPoint

    در این دسته بندی می­توانیم چندین نقطه را با هم ذخیره کنیم، برای مثال رستورانی را در نظر بگیرید که دارای چندین شعبه می­باشد.و ما برای ذخیره این رستوران چندین نقطه را مشخص می­کنیم که نشان دهنده شعب این رستوران در سطح شهر است.

    MultiLineString

    در این دسته بندی می­توانیم چندین مسیر را ذخیره کنیم.به عنوان مثال یک آزاد راه را درنظر بگیرید یک مسیر رفت دارد و یک مسیر برگشت که برای ذخیره این دو باید دو مسیر متفاوت را ترسیم کنیم.

     

     

    MultiPolygon

    در این دسته نیز میتوانیم چندین محدوده را ذخیره کنیم.به عنوان مثال محدوده یک استان را مشخص می­کنیم و محدوده شهرهای داخل استان نیز مشخص می­شود.

     

    انواع Data Type  برای SpatialData

    تا به امروز اکثر دیتابیس­ های موجود از داده ­های مکانی پشتیبانی می­ کنند.مایکروسافت هم در سال 2008 پشتیبانی از داده­ های مکانی را به SQL Server  خود اضافه کرد.برای ذخیره سازی داده­ های مکانی در دیتابیس  دو نوع داده­ای موجود است.

    • Geometry
    • Geography   

     

    Geometry

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

    Geography

    این نوع داده­های مکانی را با استفاده از سیستم مختصات بیضوی نمایش می­دهد.که برای محاسبات انحنای کره زمین نیز در نظر گرفته می­شود.پس فاصله ­ی دو نقطه ای که با این نوع داده­ای به دست میاوریم بیشتر از نوع داده­ای geometry است زیرا انحنای کره زمین که بخشی از یک دایره است رو هم محاسبه کرده است.

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

     

     برای ذخیره داده های مکانی از  geometry استفاده کنیم یا geography ؟

    اگر داده ­های که می­خواهید با آنها کار کنید  حداکثر فاصله آنها در حد یک یا چند شهر است بهتره که از نوع داده ای geometry  استفاده کنید در غیر این صورت میتوانید از نوع داده ای geography  استفاده کنید.ما در تیم نت بار به این دلیل که بیزینس اصلی ما بار برون شهری است و یک سفارش حمل بار ممکن است از جنوبی ترین نقطه ایران ثبت و درخواست ارسال به شمالی ترین نقطه ایران را داشته باشد از نوع داده geography استفاده کرده ایم.

     

    چگونه از داده های مکانی (SpatialData) در EfCore استفاده کنیم؟

    EFCore   از نسخه 2.2 به بعد با استفاده از کتابخانه NetTopolohySuite   از داده های مکانی پشتیبانی می­کند. NetTopologySuite  یک  کتابخانه برای کار با داده­ های مکانی در فریم ورک Dot Net  است.

    این کتابخانه از نوع های داده ای  geometry,geography  و شش دسته بندی داده های مکانی که در همین مقاله به معرفی آنها پرداختیم پشتیبانی میکند.در قسمت بعدی به آموزش استفاده از این کتابخانه برای ذخیره سازی انواع داده­ی مکانی در دیتابیس Sql Server  با  EFCore  می­پردازیم.


    • نویسنده: احسان بابائی

    ارسال دیدگاه

    برای افزودن دیدگاه خود، نیاز است ابتدا وارد حساب کاربری‌تان شوید


    دیدگاه کاربران

    avatar
    ناصر
    1400/11/18

    با تشکر؛ عالی بود.