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) );