17. تمارين الإسقاط

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

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

  • ST_Length(linestring) تُرجع طول الخط (linestring)

  • ST_SRID(geometry) تُرجع SRID الشكل الهندسي

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

  • ST_GeomFromText(text) تُرجع geometry

  • ST_AsText(geometry) تُرجع text بصيغة WKT

  • ST_AsGML(geometry) تُرجع text بصيغة GML

تذكّر الموارد المتاحة لك على الإنترنت:

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

  • nyc_census_blocks

    • الأعمدة: name, popn_total, boroname, geom

  • nyc_streets

    • الأعمدة: name, type, geom

  • nyc_subway_stations

    • الأعمدة: name, geom

  • nyc_neighborhoods

    • الأعمدة: name, boroname, geom

17.1. التمارين

  • ما طول جميع الشوارع في نيويورك مقيسًا بنظام UTM 18؟

    SELECT Sum(ST_Length(geom))
      FROM nyc_streets;
    
    10418904.7172
    
  • ما تعريف WKT لـ SRID 2831؟

    SELECT srtext FROM spatial_ref_sys
    WHERE SRID = 2831;
    

    أو عبر https://epsg.io/2831

    PROJCS["NAD83(HARN) / New York Long Island",
      GEOGCS["NAD83(HARN)",
        DATUM["NAD83 (High Accuracy Regional Network)",
          SPHEROID["GRS 1980", 6378137.0, 298.257222101,
            AUTHORITY["EPSG","7019"]],
          TOWGS84[-0.991, 1.9072, 0.5129, 0.0257899075194932, -0.009650098960270402, -0.011659943232342112, 0.0],
          AUTHORITY["EPSG","6152"]],
        PRIMEM["Greenwich", 0.0,
          AUTHORITY["EPSG","8901"]],
        UNIT["degree", 0.017453292519943295],
        AXIS["Geodetic longitude", EAST],
        AXIS["Geodetic latitude", NORTH],
        AUTHORITY["EPSG","4152"]],
      PROJECTION["Lambert Conic Conformal (2SP)",
        AUTHORITY["EPSG","9802"]],
      PARAMETER["central_meridian", -74.0],
      PARAMETER["latitude_of_origin", 40.166666666666664],
      PARAMETER["standard_parallel_1", 41.03333333333333],
      PARAMETER["false_easting", 300000.0],
      PARAMETER["false_northing", 0.0],
      PARAMETER["scale_factor", 1.0],
      PARAMETER["standard_parallel_2", 40.666666666666664],
      UNIT["m", 1.0],
      AXIS["Easting", EAST],
      AXIS["Northing", NORTH],
      AUTHORITY["EPSG","2831"]]
    
  • ما طول جميع الشوارع في نيويورك مقيسًا بـ SRID 2831؟

    SELECT Sum(ST_Length(ST_Transform(geom,2831)))
      FROM nyc_streets;
    
    10421993.706374
    

    ملاحظة

    الفرق بين قياسات UTM 18 وState Plane Long Island هو (10421993 - 10418904)/10418904، أي 0.02%. وعند الحساب على الشكل الإهليلجي باستخدام الإحداثيات الجغرافية (Geography) يكون الطول الكلي للشوارع 10421999، وهو أقرب إلى قيمة State Plane. وهذا ليس مستغربًا، لأن إسقاط State Plane Long Island معايَر بدقة لمنطقة صغيرة جدًا (مدينة نيويورك)، بينما يجب أن يقدّم UTM 18 نتائج معقولة لمنطقة إقليمية واسعة.

  • كم شارعًا يعبر خط الطول 74؟

    SELECT Count(*)
    FROM nyc_streets
    WHERE ST_Intersects(
      ST_Transform(geom, 4326),
      'SRID=4326;LINESTRING(-74 20, -74 60)'
      );
    
    223
    

    "خط الطول 74" طريقة منمّقة لقول "خط رأسي في الإحداثيات الجغرافية قيمة X فيه هي -74". يمكننا إنشاء خط كهذا ثم مقارنته بالشوارع بعد إسقاطها هي أيضًا إلى الإحداثيات الجغرافية. أما إسقاط الخط إلى UTM والمقارنة هناك فسيُرجع إجابة مختلفة قليلًا. وللحصول على الإجابة نفسها، تحتاج إلى "تقسيمه إلى أجزاء" (segmentize) ليحتوي على نقاط أكثر، قبل التحويل.

    SELECT Count(*)
    FROM nyc_streets
    WHERE ST_Intersects(
      geom,
      ST_Transform(ST_Segmentize('SRID=4326;LINESTRING(-74 20, -74 60)'::geometry,0.001), 26918)
      );