19. تمارين Geography¶
إليك تذكيرًا بجميع الدوال التي رأيناها حتى الآن. ستكون مفيدة في التمارين!
Sum(number) تجمع كل الأرقام في مجموعة النتائج
ST_GeogFromText(text) تُعيد كائن geography
ST_Distance(geography, geography) تُعيد المسافة بين كائني geography
ST_Transform(geometry, srid) تُعيد geometry بالإسقاط الجديد
ST_Length(geography) تُعيد طول الخط
ST_Intersects(geometry, geometry) تُعيد true إذا لم تكن الكائنات منفصلة في الفضاء المستوي
ST_Intersects(geography, geography) تُعيد true إذا لم تكن الكائنات منفصلة في الفضاء الإهليلجي
وتذكّر أيضًا الجداول المتاحة لدينا:
nyc_streetsname (الاسم)، type (النوع)، geom (الشكل الهندسي)
nyc_neighborhoodsname (الاسم)، boroname (اسم الحي الإداري)، geom (الشكل الهندسي)
19.1. التمارين¶
كم تبعد نيويورك عن سياتل؟ وما وحدات الإجابة؟
ملاحظة
نيويورك =
POINT(-74.0064 40.7142)وسياتل =POINT(-122.3331 47.6097)SELECT ST_Distance( 'POINT(-74.0064 40.7142)'::geography, 'POINT(-122.3331 47.6097)'::geography );
3875538.57141352ما الطول الكلي لجميع الشوارع في نيويورك، محسوبًا على الشكل الإهليلجي؟
SELECT Sum( ST_Length(Geography( ST_Transform(geom,4326) ))) FROM nyc_streets;
10421999.666ملاحظة
الطول المحسوب في الإسقاط المستوي "UTM Zone 18" هو 10418904.717، أي بفارق 0.02%. يحافظ UTM جيدًا على المساحة والمسافة ضمن حدود النطاق.
هل تتقاطع ‘POINT(1 2.0001)’ مع ‘POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))’ في geography؟ وفي geometry؟ ولماذا الاختلاف؟
SELECT ST_Intersects( 'POINT(1 2.0001)'::geography, 'POLYGON((0 0,0 2,2 2,2 0,0 0))'::geography ); SELECT ST_Intersects( 'POINT(1 2.0001)'::geometry, 'POLYGON((0 0,0 2,2 2,2 0,0 0))'::geometry );
true and false
ملاحظة
الحافة العلوية للمربع خط مستقيم في geometry، وتمر أسفل النقطة، لذا لا يحتوي المربع على النقطة. أما في geography فالحافة العلوية للمربع دائرة عظمى، وتمر أعلى النقطة، لذا يحتوي المربع على النقطة.