19. 地理练习

以下是对我们迄今为止所见所有函数的回顾。它们对练习很有用!

  • Sum(number) 将结果集中的所有数字加起来

  • ST_GeogFromText(text) 返回地理

  • ST_Distance(geography, geography) 返回地理之间的距离

  • ST_Transform(geometry, srid) 返回几何,以新的投影方式

  • ST_Length(geography) 返回线的长度

  • ST_Intersects(geometry, geometry) 如果对象在平面空间中不分离,则返回 true

  • ST_Intersects(geography, geography) 如果对象在球面空间中不分离,则返回 true

还要记住我们可用的表格

  • nyc_streets

    • name, type, geom

  • nyc_neighborhoods

    • name, 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))’ 相交吗?在几何上呢?为什么会有区别?

    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
    

    注意

    正方形的上边缘在几何上是一条直线,并且经过下方该点,因此正方形不包含该点。正方形的上边缘在地理上是一个大圆,并且经过上方该点,因此正方形包含该点。