PostGIS
Query
前提
下記のテーブルがあると想定。
CREATE TABLE posts
(
id SERIAL PRIMARY KEY,
geom GEOMETRY(POINT),
);
ST_AsText
テキストで出力する。
ST_AsText(geom) -- => text型 'POINT(139.763995 35.681235)'
ST_X, ST_Y
座標値を数値で得る
ST_X(geom) -- => double型 139.763995
ST_Y(geom)
ST_DWithin
指定したポイント(135 35)から 50km 以内のレコードを抽出する。第 3 引数を false にすることで、メートルでの指定ができる。
SELECT * FROM posts WHERE ST_DWithin(geom, ST_GeomFromText('POINT(135 35)'), 50000, true)
ST_PolygonFromText
テキストからポリゴンを作成する
ST_PolygonFromText('POLYGON((0 10, 10 10, 0 0, 0 10))')
-- => geometry型
ST_Within, ST_Contains
geom が POLYGON の範囲に含まれるレコードを抽出する。なお、Within と Contains は引数の順序が変わるだけ。
SELECT * FROM posts
WHERE ST_Within(geom, ST_PolygonFromText('POLYGON((0 10, 10 10, 0 0, 0 10))'))
SELECT * FROM posts
WHERE ST_Contains(ST_PolygonFromText('POLYGON((0 10, 10 10, 0 0, 0 10))'), geom)
ST_distance, ST_GeomFromText
ST_distance は、2 点間の距離を計る。第 3 引数が true なら degree で、false なら meter で結果を出力する。
ST_GeomFromText はテキストからポイントを作成する。
SELECT ST_distance(geom, ST_GeomFromText('point(145 45)', 4326), false)
FROM posts
-- => double型 10.6890191077222
ST_Transform
座標系を変換する。
ST_Transform(<ジオメトリ>,<変換先SRID>)
Index の作成
CREATE INDEX posts_geom_idx ON posts USING GIST (geom);