أكثر

هل يوجد أي مولد بيانات عشوائي يدعم الهندسة في PostGIS؟

هل يوجد أي مولد بيانات عشوائي يدعم الهندسة في PostGIS؟


لقد وجدت عددًا قليلاً من مولدات البيانات العشوائية لـ PostgreSQL (مثل هذا) ، لكن لا يوجد أي منها يدعم نوع هندسة PostGIS ، بخلاف النقطة. سيكون من السهل جدًا تحديد النقاط ، ولكن بالنسبة للخطوط ذات العقد المتعددة والمضلعات (أحتاج إلى مضلعات أكثر تعقيدًا من المستطيلات البسيطة) سيكون من الجحيم كتابة الوظيفة بنفسي. أفضل استخدام أدوات الآخرين (مجانية ومفتوحة المصدر ، إن أمكن) بدلاً من صنعها بنفسي.

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

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


لقد صنعت واختبرت الوظائف التي أحتاجها. لتوليد النقاط ، استخدمت نسخة مبسطة من الوظائف في trac.osgeo.org/postgis/wiki/UserWikiRandomPoint:

إنشاء أو استبدال FUNCTION random_point (x_min عدد صحيح DEFAULT 13 ، y_min عدد صحيح DEFAULT 49 ، x_max صحيح DEFAULT 16 ، y_max صحيح DEFAULT 51 ، srid عدد صحيح افتراضي 4326) RETURNS geometry AS $ func $ BEGIN RETURN (SELECT ST_Set) $ BEGIN RETURN (SELECT ST_Set) x_max - x_min) + x_min ، عشوائي () * (y_max - y_min) + y_min) ، srid)) ؛ END $ func $ LANGUAGE plpgsql VOLATILE؛

لست بحاجة إلى أن يكون الموضع دقيقًا للغاية ، لذلك أستخدم الإحداثيات التقريبية لجمهورية التشيك.

لست بحاجة إلى إنشاء خطوط الآن. بالنسبة للمضلع الذي بدأت به من الصفر ، باستخدام الخوارزمية التي وصفتها في السؤال (بناء المضلع حول شبه رباعي):

- max_dist الافتراضي هو WGS84 (EPSG4326) - أقل بقليل من 200 متر. هندسة العقد [] ؛ زاوية تعويم زاوية_بداية عائمة ؛ توزيع عائم - بالنسبة للمناطق القطبية ، سنقوم أيضًا بعمل مسافة منفصلة لكل من خطوط العرض والخط - ستكون المسافة الوحيدة قصيرة جدًا وإلا ابدأ - يمكننا تخطي هذه الخطوة إذا كنا متأكدين من أنه يمكننا الحصول على نقاط فقط - يمكنها التعامل مع النقاط المتعددة أيضًا ، ولكن لن تكون النتائج جيدة إذا كانت ST_geometryType (qcen)! = 'ST_Point' ثم إرجاع NULL ؛ إنهاء إذا؛ - PI / 3 و 2/3 PI تعني أن angle_start: = (عشوائي () * 1/3 * PI ()) :: INTEGER ؛ الزاوية: = angle_start ؛ بالنسبة إلى i IN 1 ... 20 LOOP - نادرًا ما نصل إلى 20 عقدة ، لكننا الآن في مأمن من توزيع الحلقة اللانهائية: = random () * max_dist ؛ حدد array_append (العقد ، ST_Translate (qcen ، الخطيئة (الزاوية) * dist ، cos (الزاوية) * dist)) INTO العقد ؛ زاوية: = زاوية + عشوائي () * 2/3 * PI () ؛ إذا كانت الزاوية> 2 * PI () ثم الخروج ؛ إنهاء إذا؛ نهاية الحلقة ؛ حدد array_append (العقد ، العقد [1]) في العقد ؛ - بافتراض أن 1 هو الحد الأدنى RETURN ST_MakePolygon (ST_MakeLine (العقد)) ؛ END $ func $ LANGUAGE plpgsql VOLATILE؛

اخترت القليل من الأشكال الهندسية الناتجة للصورة التالية:

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


شاهد الفيديو: PostGIS مقدمة لتقنية الـ