21. تمارين إنشاء الأشكال الهندسية¶
إليك تذكيرًا ببعض الدوال التي رأيناها. تلميح: ستكون مفيدة في التمارين!
sum(expression) دالة تجميعية تُعيد مجموع مجموعة من السجلات
ST_Area(geometry) تُعيد مساحة الشكل الهندسي
ST_Centroid(geometry) تُعيد مركز
geometryST_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_blocksname (الاسم)، popn_total (إجمالي السكان)، boroname (اسم الحي الإداري)، geom (الشكل الهندسي)
nyc_streetsname (الاسم)، type (النوع)، geom (الشكل الهندسي)
nyc_subway_stationsname (الاسم)، geom (الشكل الهندسي)
nyc_neighborhoodsname (الاسم)، 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_MultiPolygonSELECT 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