GeoJSON هو الصيغة القائمة على JSON التي تستطيع كل خريطة ويب حديثة قراءتها. إن كنت قد رسمت يومًا مضلعًا على خريطة Leaflet، أو نسّقت طبقة متجهية في MapLibre، أو خزّنت منطقة خدمة في PostGIS، فأنت تعمل بـGeoJSON، حتى لو قال امتداد الملف شيئًا آخر.
يشرح هذا الدليل ما هو GeoJSON فعلًا، وما تعنيه أنواع الهندسة فيه، وأين يظهر في الأنظمة الحقيقية، والعقبات التي تنال من الفرق حين تغادر ملفات GeoJSON كمبيوتر مطوّر وتدخل الإنتاج.
ما هو GeoJSON فعلًا
GeoJSON صيغة مفتوحة لترميز هياكل البيانات الجغرافية، مُعتمدة من IETF كـRFC 7946 في 2016. هي مجموعة جزئية صارمة من JSON: كل وثيقة GeoJSON هي JSON صالح، لكن المواصفة تُضيف قواعد حول أي مفاتيح مسموح بها، وكيف تُهيكل الهندسة، وكيف تُرتَّب الإحداثيات.
الصيغة صغيرة عمدًا. لا توجد سوى تسعة أنواع كائنات على المستوى الأعلى في كامل المواصفة، ويستطيع مطوّر كفء أن يحتفظ بها كلها في رأسه. تلك الصغر هي السبب في أن GeoJSON أصبح اللغة المشتركة لخرائط الويب: سهل القراءة، سهل الكتابة، سهل التحقق منه.
الإحداثيات تُكتب دائمًا كـ[longitude, latitude] (مع ارتفاع اختياري كقيمة ثالثة)، ونظام الإسناد للإحداثيات ثابت على WGS84، نفس المرجع الذي يستخدمه GPS هاتفك. لا توجد مفاوضة، ولا بيانات وصفية للإسقاط، ولا نقاش حول ترتيب المحاور. مرجع واحد، ترتيب واحد، في كل مكان.
أنواع الهندسة
يُعرّف GeoJSON سبعة أنواع هندسة. الأنواع الثلاثة الأولى هي الأوّليّات:
- Point: إحداثية واحدة، تُستخدم للدبابيس والعناوين والمستشعرات الفردية
- LineString: قائمة مرتبة من إحداثيتين أو أكثر، تُستخدم للمسارات والطرق والأنهار
- Polygon: حلقة مغلقة من الإحداثيات (النقطة الأولى والأخيرة متطابقتان)، تُستخدم للمباني والقطع الأرضية والحدود الإدارية
الأنواع الثلاثة التالية هي ببساطة مجموعات من تلك الأوّليات:
- MultiPoint: نقاط كثيرة في هندسة واحدة، مفيدة لتمثيل سلسلة متاجر كمعلَم واحد
- MultiLineString: عدة LineStrings، تُستخدم للمسارات المُجزَّأة أو أنظمة الأنهار
- MultiPolygon: عدة مضلعات، الخيار الصحيح لأي دولة بها جزر (وهي تقريبًا كلها)
السابع، GeometryCollection، يستطيع حمل خليط من أيٍّ مما سبق. تُثبط المواصفة استخدامه لأن معظم المستهلكين يتعاملون معه بشكل سيئ، وأنت تقريبًا لا تحتاجه. إن لجأت إلى GeometryCollection، فعادةً ما يكون ذلك إشارة إلى أن النموذج يريد أن يكون FeatureCollection.
Feature وFeatureCollection
الهندسة وحدها نادرًا ما تكون مفيدة. تحتاج إلى معرفة ما تُمثّله. لذلك يُستخدم Feature: Feature يُغلّف الهندسة بكائن properties يحمل بيانات وصفية اعتباطية.
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [4.8952, 52.3702]
},
"properties": {
"name": "Amsterdam Centraal",
"type": "station",
"platforms": 15
}
}
FeatureCollection هو قائمة من Features. تقريبًا كل ملف GeoJSON حقيقي ستصادفه في الميدان هو FeatureCollection، لأن مجموعات البيانات الحقيقية تحتوي على أشياء كثيرة.
الخيار التصميمي الحاسم هو أن properties مفتوح. لا تقول المواصفة شيئًا عن أي مفاتيح يمكن أن يحتويها أو أي أنواع يجب أن تكون عليها تلك القيم. هذا ميزة لا عيب: يعني أن GeoJSON يعمل لأثاث الشوارع والحدود الانتخابية ومناطق التوصيل ومسارات السفن AIS دون الحاجة إلى توسيع الصيغة. كما يعني أن على المستهلكين الحذر: إن كنت تعتمد على وجود properties.population، فتحقق منه بنفسك، لأن RFC 7946 لن يتحقق.
أين يظهر GeoJSON
بمجرد أن تبدأ بالبحث، تجد GeoJSON في كل مكان في الحزمة الجغرافية المكانية:
- مكتبات الخرائط: MapLibre GL وMapbox GL وLeaflet وOpenLayers، كلها تستهلك GeoJSON بشكل أصلي كمصدر بيانات للطبقات
- خطوط معالجة المربعات المتجهية: أدوات مثل Tippecanoe تأخذ GeoJSON وتُنتج مجموعات MVT (Mapbox Vector Tile)
- مواصفات أنماط الخرائط: Mapbox Style Specification، المستخدمة من قِبل MapLibre، تشير إلى GeoJSON كنوع مصدر من الدرجة الأولى
- قواعد البيانات المكانية: PostGIS وBigQuery GIS وSnowflake، كلها تستورد وتُصدّر GeoJSON عبر دوال مخصصة
- مخرجات API: معظم واجهات API الترميز الجغرافي والأيزوكرون والتوجيه الحديثة تُعيد GeoJSON Features للنتائج، فيمكن إسقاط الاستجابة مباشرة على خريطة
- الخطوط المتعددة للمسارات: استجابات الملاحة تتضمن عادةً هندسة LineString للمسار، جاهزة للعرض
- مشاركة البيانات: بوابات البيانات المفتوحة وصادرات OpenStreetMap وإصدارات الحدود الحكومية، تُعدّ GeoJSON الافتراضي حين تستهدف مستخدمي الويب
إن كانت أداة تستطيع التحدث بأي صيغة جغرافية مكانية، فهي تقريبًا حتمًا تتحدث GeoJSON.
عقبات في الإنتاج
GeoJSON متسامح في اليوم الأول وغير متسامح في اليوم التسعين. الفخاخ التي تُمسك بالفرق:
خط الطول أولًا. RFC 7946 يُحدد الترتيب كـ[lon, lat]. البشر والعناوين ومعظم الوثائق تكتب lat, lon. تبديلهما هو الخطأ الأكثر شيوعًا في GeoJSON، وستنتهي نقطتك في المحيط الخاطئ.
ترتيب لف المضلع. RFC 7946 يُحدد أن الحلقات الخارجية يجب أن تكون عكس عقارب الساعة، والحلقات الداخلية (الفجوات) مع عقارب الساعة. كثير من ملفات GeoJSON القديمة تتجاهل هذا. بعض المُعارِضين لا يهتم، وآخرون (لا سيما Mapbox GL مع المضلعات العابرة لخط التاريخ) يرسمون المضلع كعكس ما أردت: جزيرة صغيرة تصبح فجوة في محيط يُغطي بقية العالم.
التعامل مع خط التاريخ. الهندسة العابرة لخط الطول 180/-180 تحتاج إلى التقسيم وفقًا للمواصفة. المضلعات الساذجة المرسومة عبر المحيط الهادئ تُعرض كشريط رفيع ملفوف بالطريق الطويل حول الكوكب.
لا يوجد دعم أصلي لنظم إسناد إحداثيات غير WGS84. RFC 7946 أزال عمدًا عضو crs القديم. إن كانت بياناتك على شبكة وطنية (British National Grid، RD New، EPSG:3857)، فعليك إعادة إسقاطها إلى WGS84 قبل التسلسل. الأدوات التي تُصدر GeoJSON غير WGS84 غير مطابقة تقنيًا.
حجم الملف. FeatureCollection بملايين المضلعات المفصلة قد ينتفخ إلى غيغابايتات. للتسليم في المتصفح، انتقل إلى المربعات المتجهية، أو بسّط الهندسة باستخدام Douglas-Peucker، أو ابثّ بـGeoJSON مفصول بأسطر جديدة (.ndjson).
التحقق. استخدم مُدقّقًا مثل GeoJSONLint أو مكتبة geojson-validation في CI. اكتشاف ترتيب لف غير صالح أو إحداثيات مُبدَّلة وقت البناء أرخص من اكتشافها من تذكرة عميل.
GeoJSON في MapAtlas
GeoJSON هو الصيغة الافتراضية لتبادل البيانات عبر منصة MapAtlas. منتج Dynamic Maps يقبل مصادر GeoJSON مباشرة لطبقات التراكب المخصصة والتنسيق والطبقات التفاعلية، دون الحاجة إلى معالجة مسبقة.
Geocoding API تُعيد العناوين المُطابَقة كـGeoJSON Features، فيمكن إسقاط نتيجة ترميز جغرافي أمامي مباشرة على خريطة أو تخزينها في PostGIS دون إعادة تعيين الحقول. Isochrone API تُعيد مناطق زمن السفر كمضلعات GeoJSON، ما يعني أن استعلام "الأماكن التي يمكن الوصول إليها خلال 15 دقيقة" يبعد طلب fetch واحد واستدعاء addSource واحد عن أن يكون على الشاشة.
GeoJSON ليس لافتًا. هو مجموعة جزئية صغيرة وذات رأي من JSON بترتيب إحداثيات ثابت وحفنة من أنواع الهندسة. لكنه الصيغة التي تُتيح لكل طبقة من حزمة موقع حديثة، من قاعدة البيانات المكانية إلى لوحة الخريطة، الاتفاق على ما هو المكان. اضبط ترتيب خط الطول، وتحقق من اللف، والباقي من الحزمة يميل إلى الاعتناء بنفسه.
الأسئلة الشائعة
ما هو GeoJSON؟
GeoJSON هو صيغة مفتوحة قائمة على JSON لترميز البيانات الجغرافية، مُعتمدة كـRFC 7946 من قِبل IETF. تُعرّف مجموعة صغيرة من أنواع الهندسة (Point، LineString، Polygon، ومتغيراتها المتعددة) إضافة إلى كائنات Feature وFeatureCollection التي تُغلّف الهندسة بخصائص اعتباطية. الإحداثيات تُكتب دائمًا كخط طول، خط عرض على مرجع WGS84، وهو ما تتوقعه كل مكتبة خرائط ويب حديثة.
ما الفرق بين GeoJSON وJSON؟
GeoJSON هو مجموعة جزئية صارمة من JSON بقواعد إضافية. كل وثيقة GeoJSON هي JSON صالح، لكن ليست كل وثيقة JSON هي GeoJSON صالح. تُحدد المواصفة أنواع كائنات المستوى الأعلى، وبنية كائنات الهندسة، وترتيب الإحداثيات (خط الطول أولًا)، ونظام الإسناد للإحداثيات (WGS84). أي شيء خارج تلك القواعد هو مجرد JSON يصادف أنه يحتوي بيانات جغرافية.
متى ينبغي استخدام GeoJSON بدلًا من shapefile أو KML؟
استخدم GeoJSON كلما احتاجت البيانات إلى التدفق عبر حزمة ويب: واجهات API أو متصفحات أو قواعد بيانات مثل PostGIS، أو أيٍّ من MapLibre وLeaflet وMapbox GL أو OpenLayers. ملفات shapefile لا تزال شائعة في GIS سطح المكتب لكنها تُشحن في أربعة ملفات أو أكثر وتستخدم صيغة ثنائية من التسعينات. KML جيد لـGoogle Earth لكنه مُسهَب وقائم على XML. GeoJSON يفوز لأي شيء يلامس واجهات API بصيغة JSON.
لماذا تكون إحداثيات GeoJSON بترتيب خط الطول أولًا؟
RFC 7946 يُحدد الترتيب كخط طول، خط عرض، ارتفاع اختياري. هذا يطابق اصطلاح x وy وz المستخدم في معظم أنظمة الرسوميات وGIS. هو عكس كيفية كتابة البشر للإحداثيات (خط العرض أولًا، كما في 51.5, -0.1) وهو الخطأ الأكثر شيوعًا حين تصنع GeoJSON يدويًا: بدِّل القيمتين وستهبط نقطتك في النصف الخاطئ من الكرة. دائمًا خط الطول أولًا في GeoJSON.

