19. 地理练习

以下是我们到目前为止看到的所有函数的提醒。它们应该对练习有所帮助!

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

  • ST_GeogFromText(text)

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

  • :command:`ST_Transform(geometry, srid)`在新的投影中返回几何图形

  • :command:`ST_Length(geography)`返回行长度

  • 如果对象在平面空间中不是不相交的,则返回true

  • :command:`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))' 在地理坐标系(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)中,该边界实为大圆弧线,从点的**上方**通过,故包含该点。