گاها پیش میاد نیاز داریم در پروژه های نرم افزاری، داده ها را به صورت مختصات جغرافیایی ذخیره کنیم و همچنین نیاز داریم بروی داده های ذخیره شده از آن نوع اعمالی داشته باشیم برای مثال:
به این نوع Data ها و Data Type ها Geo Data گفته میشود.
پیش تر به روش های ابداعی و سلیقه ای این کار انجام میشد برای مثال اگر کسی نیاز داشت مختصات یک نقطه را ذخیره کند دو Field در Database با نام های Lat, Lng ساخته میشد و مختصات اون نقطه در اون Field ها ذخیره میشد و اگر اعمالی نیاز بود تا روی Data ها انجام بشه باید فورمول های جهت انجام این نوع محاسبات نوشته بشود
برای مثال فورمول محاسبه برای یافتن نزدیک ترین نقاط به شکل زیر هست:
(POW(ABS((lat - lng)), 2) + POW(ABS((user_lat - user_lng)), 2))
فرض کنید که برای محاسبه موارد مختلف هر شخص فورمول های مختلف میسازد علاوه بر فورمول ممکن است هر شخص یا هر شرکت روشی برای ذخیره داده های Geo استفاده کند. نتیجه این عمل عدم یکپارچگی داده ها است و اگر نیاز به استفاده داده ها در پروژه دیگری باشد می بایست تبدیلات مختلف روی Data اعمال شود.
برای حل این مشکل استانداردی تحت عنوان Geo JSON RFC 7946 تدوین شده که هدفش یکپارچه سازی Data های Geographic هست این استاندارد در سیستم های Database هم از نوع RDBMS (از جمله mySQL, SQL Server, Oracle و..) و همچنین از نوع noSQL (از جمله MongoDB و..) و همچنین در مهد اولیه خود یعنی JSON نیز پشتیبانی میشود.
در Geo JSON نوع های مختلفی برای ذخیره مختصات وجود که نوع های زیر هستند:
همچنین اگر نوع داده شما پیچیده است و یا مجموعه از همه این Data Type ها است دو نوع ضمنی هم وجود دارد:
همون طور که در بالا میبینید Data Type ها کامل هستند و برای هر ذخیره سازی مختصاتی یک نوع وجود دارد.
مثال کلی:
{ "another_key": "key value", "location": { "type: "GEO_JSON_TYPE", "coordinates": "GEO_JSON_COORD_TYPE" } }
برای ذخیره هر کدام از این نوع داده ها میتوانید یک فیلد در JSON خود ایجاد کنید برای مثال location در آن یک key با نام type و یک key دیگر با نام coordinates بسازید، به عنوان type نوع داده خود را وارد کنید و coordinates را طبق راهنمای زیر تنظیم کنید.
همان طور که اسمش پیداست برای ذخیره یک نقطه خاص بروی کره زمین مورد استفاده قرار میگیرد بر فرض مثال شما میخواهید مختصات محل یک رستوران را ذخیره کنید.
مثال:
{ "type": "Point", "coordinates": [30, 10] }
همانطور که مشاهده میکنید به عنوان Coordinates یک آرایه جفتی میگیرد که نشان دهنده آن نقطه است عضو اول این آرایه Lat و عضو دوم Lng می باشد.
برای ذخیره چندین نقطه استفاده میشود برای مثال در یک فیلد که مربوط به یک بانک است میخواهید پراکندگی شعب آن بانک را نشان دهید.
مثال:
{ "type": "MultiPoint", "coordinates": [ [10, 40], [40, 30], [20, 20], [30, 10] ] }
به عنوان Coordinates آرایه از نقاط دریافت میکند که عضو اول این آرایه ها Lat و عضو دوم Lng می باشد.
برای ذخیره یک خط یا یک مسیر مورد استفاده قرار میگیرد عموما برای نمایش مسیر منتهی از یک مبدا به یک مقصد استفاده میشود.
{ "type": "LineString", "coordinates": [ [30, 10], [10, 30], [40, 40] ] }
به عنوان Coordinates آرایه از نقاط دریافت میکند که طبعا هر نقطه شامل دو عضو Lat و Lng می باشد.
برای ذخیره چندین مسیر مورد استفاده قرار میگیرد. موارد استفاده:
{ "type": "MultiLineString", "coordinates": [ [[10, 10], [20, 20], [10, 40]], [[40, 40], [30, 30], [40, 20], [30, 10]] ] }
به عنوان Coordinates چندین آرایه از خطوط دریافت میکند که طبعا هر خط خود آرایه ای از نقاط است.
برای ذخیره یک چند ضلعی مورد استفاده قرار میگیرد. موارد استفاده:
{ "type": "Polygon", "coordinates": [ [[30, 10], [40, 40], [20, 40], [10, 20], [30, 10]] ] }
به عنوان Coordinates آرایه ای از نقاط دریافت میکند و اگر از ابزار های ترسیم geoJSON استفاده کنید بدین صورت عمل میکنند که آخرین نقطه را به صورت اتوماتیک به آخرین نقطه متصل میکنند.
برای نمایش چندین چند ضلعی مورد استفاده قرار میگیرد. موارد استفاده:
{ "type": "MultiPolygon", "coordinates": [ [ [[30, 20], [45, 40], [10, 40], [30, 20]] ], [ [[15, 5], [40, 10], [10, 20], [5, 10], [15, 5]] ] ] }
به عنوان Coordinates آرایه از Polygon ها دریافت میکند.
با انواع Data Type های GeoJSON آشنا شدیم در قسمت بعد در مورد استفاده از Geo Data ها در SQL و توابع کمکی SQL برای کار با Geo Data ها خواهم نوشت.