حمید فرجی
حمید فرجی
خواندن ۵ دقیقه·۶ سال پیش

داده های Geographic - قسمت اول - مقدمات

گاها پیش میاد نیاز داریم در پروژه های نرم افزاری، داده ها را به صورت مختصات جغرافیایی ذخیره کنیم و همچنین نیاز داریم بروی داده های ذخیره شده از آن نوع اعمالی داشته باشیم برای مثال:

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

به این نوع 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 نیز پشتیبانی میشود.

نوع داده های - Data Type ها

در Geo JSON نوع های مختلفی برای ذخیره مختصات وجود که نوع های زیر هستند:

  • نقطه - Point
  • چند نقطه - Multipoint
  • مسیر - LineString
  • چند مسیر - MultiLineString
  • چند ضلعی - Polygon
  • چندین چند ضلعی - MultiPolygon

همچنین اگر نوع داده شما پیچیده است و یا مجموعه از همه این Data Type ها است دو نوع ضمنی هم وجود دارد:

  • مشخص نیست - Geometry
  • مجموعه از داده ها - GeometryCollection

همون طور که در بالا میبینید Data Type ها کامل هستند و برای هر ذخیره سازی مختصاتی یک نوع وجود دارد.

مثال کلی:

{ "another_key": "key value", "location": { "type: "GEO_JSON_TYPE", "coordinates": "GEO_JSON_COORD_TYPE" } }

برای ذخیره هر کدام از این نوع داده ها میتوانید یک فیلد در JSON خود ایجاد کنید برای مثال location در آن یک key با نام type و یک key دیگر با نام coordinates بسازید، به عنوان type نوع داده خود را وارد کنید و coordinates را طبق راهنمای زیر تنظیم کنید.




نقطه - Point

نحوه نمایش نقطه
نحوه نمایش نقطه

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

مثال:

{ "type": "Point", "coordinates": [30, 10] }

همانطور که مشاهده میکنید به عنوان Coordinates یک آرایه جفتی میگیرد که نشان دهنده آن نقطه است عضو اول این آرایه Lat و عضو دوم Lng می باشد.




چند نقطه - Multipoint

نحوه نمایش چندین نقطه
نحوه نمایش چندین نقطه

برای ذخیره چندین نقطه استفاده میشود برای مثال در یک فیلد که مربوط به یک بانک است میخواهید پراکندگی شعب آن بانک را نشان دهید.

مثال:

{ "type": "MultiPoint", "coordinates": [ [10, 40], [40, 30], [20, 20], [30, 10] ] }

به عنوان Coordinates آرایه از نقاط دریافت میکند که عضو اول این آرایه ها Lat و عضو دوم Lng می باشد.




مسیر - LineString

نحوه نمایش مسیر
نحوه نمایش مسیر

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

{ "type": "LineString", "coordinates": [ [30, 10], [10, 30], [40, 40] ] }

به عنوان Coordinates آرایه از نقاط دریافت میکند که طبعا هر نقطه شامل دو عضو Lat و Lng می باشد.




چند مسیر - MultiLineString

نحوه نمایش چندین مسیر
نحوه نمایش چندین مسیر

برای ذخیره چندین مسیر مورد استفاده قرار میگیرد. موارد استفاده:

  • نمایش مسیر های منتهی به یک نقطه
  • نمایش تفاوت دو مسیر
  • نمایش تمام خطوط مترو، اتوبوس در کنار هم و...
{ "type": "MultiLineString", "coordinates": [ [[10, 10], [20, 20], [10, 40]], [[40, 40], [30, 30], [40, 20], [30, 10]] ] }

به عنوان Coordinates چندین آرایه از خطوط دریافت میکند که طبعا هر خط خود آرایه ای از نقاط است.




چند ضلعی - Polygon

نحوه نمایش چند ضلعی
نحوه نمایش چند ضلعی

برای ذخیره یک چند ضلعی مورد استفاده قرار میگیرد. موارد استفاده:

  • مساحت یک محل
  • نمایش محدوده یک محل خاص
{ "type": "Polygon", "coordinates": [ [[30, 10], [40, 40], [20, 40], [10, 20], [30, 10]] ] }

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



چندین چند ضلعی - MultiPolygon

نحوه نمایش چندین چند ضلعی
نحوه نمایش چندین چند ضلعی

برای نمایش چندین چند ضلعی مورد استفاده قرار میگیرد. موارد استفاده:

  • محل های تحت پوشش یک اپراتور یک شرکت یا ...
  • نمایش محل های مجاز یا غیر مجاز و...
{ "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 ها خواهم نوشت.


نقشهgeo dataمختصات جغرافیاییgeo jsonجی سان
برنامه نویس
شاید از این پست‌ها خوشتان بیاید