سننظر هنا في طريقة لتقسيم السطح الكروي لكوكب مولود إجرائيًا بواسطة البلاط غير المنتظم ، ونتيجة لذلك ، تقسيم المحيط والقارات إلى أقسام (قطاعات) منفصلة. نفترض أن بنية مناطق الأرض قد تم تعيينها بالفعل على سطح الكوكب باستخدام بعض نظم المعلومات الجغرافية ومن الممكن تصدير بيانات المتجه إلى ملفات ESRI أو مباشرة إلى قاعدة بيانات PostgreSQL مع امتداد
PostGIS . تتم عملية إنشاء القطاعات باستخدام PostGIS.
انظر الرابط إلى النص البرمجي مع كود SQL في أسفل المنشور ، هنا سيكون الشرح أكثر على الأصابع. يوفر الشرح الوظائف الأساسية من البرنامج النصي ، ويفترض أيضًا توفر البيانات للقارات والأنهار من الكواكب التي تم إنشاؤها إجرائيًا المأخوذة من
forgedmaps.com .
يتيح لنا اختيار البلاط غير المنتظم تقسيم سطح الكوكب بدقة
في قطاعات ، بشكل عام لا تختلط أراضي المحيط والأرض في أي مكان. البحيرات والبحار الداخلية
نعتبرها جزء من الأرض. سنرى أيضًا كيف يمكن استخدام الأنهار كحدود طبيعية للقطاعات. سيتم بناء القطاعات نفسها على أساس بعض التقسيم الأساسي للكرة بواسطة المضلعات.
عندما يتعلق الأمر بتقسيم منطقة مسطحة ، فعادة ما يلجأون إلى
مخطط Voronoi للحصول على بلاط غير منتظم. بتطبيق أيضًا
خوارزمية Lloyd ، يمكننا أن نصل إلى شكل جذاب بصريًا من المضلعات المحدبة التي لا تختلف كثيرًا في الحجم (التغطية بالفسيفساء المركزية Voronoi). جوهر خوارزمية لويد هو تكرار بناء مخطط Voronoi ، في كل تكرار لاحق ، مع أخذ مراكز المضلعات التي تم الحصول عليها في التكرار السابق كنقاط توليد.
سنفرض متطلبات معينة على التقسيم الأساسي بواسطة مضلعات المجال:
تقارب المضلعات الكروية وانحرافاتها غير الكبيرة جدًا عن متوسط حجم معين.
يتم استخدام
قطاع الاسم بدلاً من
التجانب نظرًا لحقيقة أن التجانب عادة ما يكون له معنى أولي ، على سبيل المثال ، كجزء من بطاقات التجانب للألعاب الاستراتيجية ، أو كجزء من وحدة معينة من سطح معين. يوجد داخل القطاع هيكل داخلي: التضاريس والأشياء الجغرافية المختلفة فيه. يمكن للقطاعات بدورها أن تكون بمثابة بلاط أساسي: إن بناء رسم بياني للتحولات المحتملة بين القطاعات يخدم هذا الغرض.
التقسيم الأساسي للكرة وشرائح المحيطات.
يحتوي
ST_VoronoiPolygons
على وظيفة
ST_VoronoiPolygons
، والتي تبني رسمًا
ST_VoronoiPolygons
في مساحة مربعة. دعونا نرى كيف يمكننا استخدامه لأغراضنا.
ماذا يحدث إذا حاولت استخدام نهج مباشر؟ يمكن تحويل الإسقاط المستطيل للكوكب إلى مربع بواسطة الإحداثيات ، وبناء المضلعات هناك وإجراء التحويل العكسي للإحداثيات. ولكن ، سيتم توسيع المستطيلات التي تم إنشاؤها بهذه الطريقة في اتجاه واحد ، وهو أمر غير مرغوب فيه. وإذا حاولت تطبيق خوارزمية Lloyd ، فستكون المستطيلات القريبة من أعمدة الكرة أصغر بكثير في المنطقة (على الكرة) من القريبة من خط الاستواء.
دعونا نحاول تكييف هذه الطريقة مع القضاء على العيوب. يتم اختيار نقاط البداية العشوائية لمخطط فورونوي بحيث يتم توزيعها بالتساوي على الكرة. في إسقاط ميركاتور ، يعني هذا أنه يجب أن تظهر في القطبين بشكل أقل في كثير من الأحيان مع احتمال يتناسب مع جيب تمام خط العرض. نحن نبني مخطط Voronoi في مضلع "العالم" - هذا إما الإسقاط المستطيل بالكامل للكوكب أو جزء منه فقط. وظيفة
ST_VoronoiPolygons
نفسها تكمل المستطيل إلى مربع ، نحتاج فقط لقص الرسم البياني الناتج وفقًا لمضلع "العالم".
ننظر إلى صورة مضلعات Voronoi التي تم الحصول عليها بطريقة متكيفة. فيما يلي جزء من خريطة كوكب الاختبار من خط الاستواء عند الحافة العلوية إلى خط عرض 73 درجة جنوبًا عند الحافة السفلية. (هنا تم قطع مساحة الأرض بالفعل من مدافن النفايات.)

كما يمكن رؤيته في إسقاط ميركاتور ، عادةً ما تكون المضلعات أكبر عند الاقتراب من القطبين ، ولكن سيتم توزيعها بشكل متساو تقريبًا على الكرة من حيث حجم المنطقة. هذا ما نحتاجه. ولكن ، يُلاحظ أيضًا أن المضلعات لديها انتشار كبير جدًا للمناطق والصورة العامة قبيحة إلى حد ما.
دعونا نحاول تطبيق عدة تكرارات لخوارزمية لويد. كنقاط جديدة
للتكرارات اللاحقة لمخطط Voronoi ، سنختار مراكز القطع المشذبة بالفعل
مضلعات "العالم" Voronoi. ولمنع انخفاض كبير في مساحة المضلعات بالقرب من القطبين ، نقوم فقط بعدد صغير من التكرارات (3 أو نحو ذلك).
للحصول على أجزاء المحيط ، يتم استبعاد المنطقة المحتلة من مدافن النفايات التي تم الحصول عليها. ونتيجة لذلك ، يمكن تشكيل مضلعات صغيرة ، ومن المستحسن إرفاقها بالمضلعات المجاورة. قد تكون المضلعات الصغيرة أيضًا بالقرب من حدود مضلع "العالم". نقوم بتوصيل المضلعات بطريقة لاختيار الجار "الأقرب" وعدم إفساد الصورة الكبيرة.
بعد تطبيق هذه الخوارزمية المعدلة ، نحصل على الصورة التالية ، والتي قد تكون مقبولة بالفعل. تشير المقاطع الحمراء في الشكل إلى الدمج المطلوب للمضلعات.

يمكن اختيار المضلعات للدمج بطرق مختلفة. في البرنامج النصي المذكور ، يتم تنفيذ طريقتين: على الحدود الأطول وعلى أقرب مركز. يوضح الشكل التالي نتيجة الاندماج بالطريقة الثانية.

بشكل عام ، حققنا ما يمكن تحقيقه من قطاعات المحيطات. منطقتهم هي نفسها تقريبًا (على الكرة) ، وهي إما محدبة أو مع انحرافات صغيرة عن محدبة.
الوظيفة الرئيسية لتوليد قطاعات المحيطات:
map.makeOceanSectors( world Geometry, avg_vp_areaKM Double Precision, merging_ratio Double Precision, merging_method Int ) RETURNS Void
world
- أرض تدريب "العالم" بمثابة حدود العالم.
avg_vp_areaKM
- متوسط المساحة (كم
2 ) للمضلعات التي تُصنع منها قطاعات المحيطات.
merging_ratio
- حصة
avg_vp_areaKM
، بحيث أنه إذا كانت مساحة القطاع أقل منه ، فسيتم إرفاقها بالمنطقة المجاورة.
merging_method
- طريقة الدمج ("1" أو "2").
مثال. نحن نبني قطاعات في مكب "عالمي" معين بمساحة مدافن نفايات أساسية تبلغ 1،000،000 كيلومتر
مربع . سيتم ضم القطاعات التي تقل مساحتها عن نصف هذا الحجم إلى قطاعات أخرى. يتم استخدام الطريقة الثانية للدمج - في أقرب مركز.
SELECT * FROM map.makeOceanSectors( ST_GeomFromText( 'POLYGON((-75 -85, 75 -85, 75 85, -75 85, -75 -85))', 4326 ), 1000000, 0.5, 2 );
شرائح القارات.
في البر الرئيسي ، يمكنك إدخال تقسيم أكثر إثارة للاهتمام ، من جهة ، على إجمالي المضلعات الأساسية الصغيرة ، ومن ناحية أخرى ، على الأشياء الطبيعية مثل الأنهار ومستجمعات المياه. الهيكل الذي تم الحصول عليه بهذه الطريقة يشبه إلى حد كبير خريطة الولايات والمقاطعات فيها. أي أن هذه هي عملية
توليد الخريطة السياسية للعالم من الناحية الإجرائية .
على عكس أجزاء المحيط ، يصبح الانتفاخ اختياريًا تمامًا.
لا توجد مستجمعات مائية في forgedmaps.com حتى الآن ، ولكن هناك بالفعل أنهار. يتطلب استخدام الأنهار في البرنامج النصي تمثيلها في
MultiLineString . لديهم هذه الفكرة في ملف
الشكل الأنهار . عند الاستيراد إلى قاعدة البيانات ، يمكنك على الفور التخلص من إحداثيات z الزائدة في هذه العملية. البيانات المطلوبة الأخرى ، وهي حدود مناطق الأراضي ، موجودة في ملف أشكال
الأراضي . لكل منطقة برية معرّف
aid
(معرف المنطقة) وقد تتكون من القارة وأقرب الجزر ، أو فقط جزر صغيرة تقع في مكان قريب.
على سبيل المثال ، نختار متوسط حجم القطاع 40،000 كيلومتر
مربع ومتوسط حجم المضلع الأساسي 5،000 كيلومتر
مربع . هذا حجم كبير إلى حد ما ، تم اختياره للتوضيح فقط. الأحجام الصغيرة مقبولة أيضًا (حتى بضعة أمتار
مربعة ) ، ولكن تتبع وقت الحساب واستخدم التكوين المناسب لقاعدة البيانات.
في هذه الصورة ، مثال لكيفية ظهور المضلعات الأساسية داخل مساحة الأرض.

الخطوة التالية هي دمج المضلعات الأساسية في قطاعات. للقيام بذلك ، حدد عشوائيًا من المضلعات الأساسية العديد من القطاعات التي نريد صنعها وقم بإرفاق المضلعات المجاورة تدريجياً بالقطاعات المتراكمة.

حان الوقت الآن لأخذ النهر بعين الاعتبار. نستخدمها لتقسيم القطاعات إلى
أجزاء منفصلة بواسطة الدالة
ST_Split
. يمكن إجراء مثل هذا التقسيم اعتمادًا على بعض الشروط: التدفق النهري النهائي أو منطقة الجزء المنفصل.
الآن يمكننا أن نرى كيف تسير بعض الحدود على طول الأنهار.

نربط أجزاء صغيرة من القطاعات بقطاعات كبيرة. لكن يجب أن نحاول
لا تعلق أجزاء على نفس القطاعات التي قطعت منها.

مع مساحات كبيرة من الأراضي التي قمنا بإدارتها ، لكنها لا تزال جزر صغيرة. نجعل من هؤلاء الذين لديهم منطقة قريبة من متوسط مساحة القطاع كقطاعات منفصلة في وقت واحد. ولكن مع أولئك الذين تكون مساحتهم أصغر بكثير من متوسط القطاع ، نقوم بعمل شيئين.
1. إذا كانت هذه الجزر بعيدة نسبياً عن القطاعات القائمة ، فإننا نجعلها قطاعات منفصلة. يعتمد "Farness" هنا على متوسط المساحة المعطاة للقطاع: فكلما كانت هذه المنطقة أصغر ، زادت احتمالية تحول الجزيرة إلى قطاع منفصل.
2. إذا كانت الجزيرة قريبة من قطاعات أخرى تم إنشاؤها بالفعل ، يتم دمجها مع أحدها. وهي تلك التي تحتوي على أكبر مساحة في مضلع معين تم الحصول عليها باستخدام
ST_Buffer
من هذه الجزيرة.

هنا تقع أربع جزر في قطاعين مختلفين. إذا قمت بزيادة متوسط المساحة المحددة للقطاع ، فستقع جميع الجزر عاجلاً أم آجلاً في قطاع واحد.
الوظيفة الرئيسية لتوليد القطاعات على الأرض:
map.makeLandSectors( aid BigInt, avg_vp_areaKM Double Precision, avg_sector_areaKM Double Precision, max_sector_cut_area_ratio Float, pref_min_island_area_ratio Float, min_streamflow Int ) RETURNS Void
aid
- معرف قطعة الأرض.
avg_vp_areaKM
- متوسط المساحة (كم
2 ) للمضلعات الأساسية.
avg_sector_areaKM
- متوسط مساحة القطاعات (كم
2 ).
max_sector_cut_area_ratio
- حصة
avg_sector_areaKM
، التي تحدد أقصى مساحة يمكن قطعها بواسطة النهر.
pref_min_island_area_ratio
- حصة
avg_sector_areaKM
، التي تحدد الحد الأدنى للمساحة ، حيث تصبح الجزيرة على الفور قطاعًا منفصلاً.
streamflow
- إذا كان للنهر تدفق نهائي لا يقل عن هذه القيمة ، فإنه يشارك في قطع القطاعات.
في المثال التالي ، سيؤدي استخدام الوظيفة إلى إنشاء قطاعات على قطعة أرض بمساعدة = 5. في هذه الحالة ، سيتم استخدام المضلعات الأساسية التي تبلغ مساحتها 5000 كيلومتر
مربع لإنشاء قطاعات بمساحة 40 ألف كيلومتر
مربع . أيضًا ، في نفس الوقت ، سيكون الحد الأقصى للأراضي التي تقطعها الأنهار 0.125 * 40،000 كيلومتر
مربع ، و 0.25 * 40،000 كيلومتر
مربع هي الحد الأدنى للمنطقة التي تصبح فيها الجزر قطاعات على الفور. لقطع الأنهار ، يتم استخدام الأنهار بحد أدنى للجريان السطحي النهائي 2.
SELECT * FROM map.makeLandSectors(5, 5000, 40000, 0.125, 0.25, 2);
المراجع
يتوفر
كود البرنامج النصي لـ SQL الذي يقوم بكل العمل ، بما في ذلك إنشاء القطاعات وبناء الرسوم البيانية الانتقالية بين القطاعات المجاورة. يمكن أخذ بيانات نظم المعلومات الجغرافية من الكواكب التي تم إنشاؤها إجرائيا من
forgedmaps.com . يمكنك استخدام
بيانات GIS Earth ، مما يقودها إلى بنية مماثلة. يمكنك أيضًا ، باستخدام أي
نظم معلومات جغرافية حديثة ، إنشاء البيانات يدويًا من الصفر أو الحصول على بيانات جديدة عن طريق تحويل البيانات المستلمة من أي مصدر آخر. يمكن العثور على المزيد من التعليمات الكاملة للبرنامج النصي في
الدليل .