21. تمارين إنشاء الأشكال الهندسية

إليك تذكيرًا ببعض الدوال التي رأيناها. تلميح: ستكون مفيدة في التمارين!

  • sum(expression) دالة تجميعية تُعيد مجموع مجموعة من السجلات

  • ST_Area(geometry) تُعيد مساحة الشكل الهندسي

  • ST_Centroid(geometry) تُعيد مركز geometry

  • ST_Transform(geometry, srid) تحوّل geometries إلى أنظمة مرجعية مكانية مختلفة

  • ST_Buffer(geometry, radius) تُعيد شكل geometry موسّعًا

  • ST_Contains(geometry1, geometry2) تُعيد true إذا كان geometry1 يحتوي على geometry2

  • ST_Union(geometry[]) تُعيد الاتحاد التجميعي لجميع الأشكال الهندسية في المجموعة

  • ST_GeometryType(geometry) تُعيد نوع الشكل الهندسي

  • ST_NumGeometries(geometry) تُعيد عدد الأشكال الهندسية في المجموعة، أو 1 للأشكال الهندسية البسيطة

  • ST_Intersection(geometry, geometry) تُعيد المساحة المشتركة بين الشكلين الهندسيين المُدخلين

تذكّر الجداول المتاحة لدينا:

  • nyc_census_blocks

    • name (الاسم)، popn_total (إجمالي السكان)، boroname (اسم الحي الإداري)، geom (الشكل الهندسي)

  • nyc_streets

    • name (الاسم)، type (النوع)، geom (الشكل الهندسي)

  • nyc_subway_stations

    • name (الاسم)، geom (الشكل الهندسي)

  • nyc_neighborhoods

    • name (الاسم)، boroname (اسم الحي الإداري)، geom (الشكل الهندسي)

21.1. التمارين

  • كم عدد الكتل الإحصائية التي لا تحتوي على مركزها الخاص؟

    SELECT Count(*)
      FROM nyc_census_blocks
      WHERE NOT
        ST_Contains(
          geom,
          ST_Centroid(geom)
        );
    
    481
    
  • ادمج جميع الكتل الإحصائية في مخرج واحد. ما نوع الشكل الهندسي الناتج؟ وكم عدد أجزائه؟

    CREATE TABLE nyc_census_blocks_merge AS
      SELECT ST_Union(geom) AS geom
      FROM nyc_census_blocks;
    
    SELECT ST_GeometryType(geom)
      FROM nyc_census_blocks_merge;
    
    ST_MultiPolygon
    
    SELECT ST_NumGeometries(geom)
      FROM nyc_census_blocks_merge;
    
    63
    
  • ما مساحة نطاق عازل بمقدار وحدة واحدة حول نقطة الأصل؟ وكم تختلف عما تتوقعه؟ ولماذا؟

    SELECT ST_Area(ST_Buffer('POINT(0 0)', 1));
    
    3.121445152258052
    

    ملاحظة

    يُفترض أن تكون مساحة دائرة الوحدة (دائرة نصف قطرها واحد) مساوية لـ pi، أي 3.1415926... ويرجع الفرق إلى التمثيل الخطي لحواف النطاق العازل؛ فللنطاق العازل عدد محدود من الحواف. وزيادة عدد الحواف في النطاق العازل تقرّب القيمة من pi، لكنها ستظل دائمًا أصغر منها بسبب التمثيل الخطي.

  • حيّا ‘Park Slope’ و ‘Carroll Gardens’ في بروكلين على وشك الحرب! أنشئ مضلعًا يحدد منطقة منزوعة السلاح (DMZ) بعرض 100 متر على الحدود بين الحيّين. ما مساحة المنطقة منزوعة السلاح؟

    CREATE TABLE brooklyn_dmz AS
      SELECT
        ST_Intersection(
          ST_Buffer(ps.geom, 50),
          ST_Buffer(cg.geom, 50))
        AS geom
      FROM
        nyc_neighborhoods ps,
        nyc_neighborhoods cg
      WHERE ps.name = 'Park Slope'
      AND cg.name = 'Carroll Gardens';
    
    SELECT ST_Area(geom) FROM brooklyn_dmz;
    

    ملاحظة

    من السهل إنشاء نطاق عازل حول كلا الحيّين المعنيين، لكن الحصول على التقاطع يتطلب ربطًا ذاتيًا (self-join) للجدول، بإنشاء علاقة ( ps ) تحتوي على سجل "Park Slope" فقط، وأخرى ( cg ) تحتوي على سجل "Carroll Gardens" فقط. لاحظ أن مساحة التقاطع بالمتر المربع لأننا ما زلنا نعمل في UTM 18 (EPSG:26918).

    180990.964207547