17. 投影法演習¶
これまでに見た全ての関数のリマインダです。演習に役立つはずです!
sum(expression) はレコードの集合の合計を返す集約関数です
ST_Length(linestring) はラインストリングの長さを返します
ST_SRID(geometry) はジオメトリの SRID を返します
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) );