17. 投影练习

这里提醒一下我们见过的一些功能。提示:它们应该对练习有用!

  • :command:`sum(expression)`聚合函数用于对一组记录进行求和并返回总和

  • ST_Length(linestring) 返回线串的长度

  • :command:`ST_SRID(geometry)`返回几何体的 SRID

  • :command:`ST_Transform(geometry, srid)`将几何图形转换为不同的空间参考系

  • ST_GeomFromText(text)`返回 ``geometry`

  • ST_AsText(geometry) 返回 WKT 格式的``text``

  • ST_AsGML(geometry)`返回 GML 格式的``text`

请记住您可以使用的在线资源:

当然!我们有以下表可用:

  • 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
    
  • SRID 2831 的 WKT 定义是什么?

    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 与国家平面长岛测量值之间的差异为 (10421993 - 10418904)/10418904,即 0.02%。使用地理在球体上计算得出,街道总长度为 10421999,这更接近国家平面值。这并不奇怪,因为国家平面长岛投影是针对非常小的区域(纽约市)进行精确校准的,而 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 中并进行比较将返回略有不同的答案。为了获得相同的答案,您需要在转换之前对其进行“分段”,以便它具有更多的点。

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