SRID 4326で定義された2つのジオメトリ列を持つPostGISテーブルがあります。次のINSERT
ステートメントを使用して問題なくテーブルに挿入できます(ここでlng
およびlat
はプログラムで渡される値です)。
INSERT INTO pad_meta (
uuid, created, updated, name, origin, radius, area, expiry, creator
) VALUES (
$1, now(), now(), $2, ST_GeomFromText('POINT(lng, lat)', 4326), $3,
ST_Buffer(ST_GeomFromText('POINT(lng, lat)', 4326), $4), $5, $6
)
しかし、ST_Intersectsを使用して交差点を照会すると、取得するポイントの値に依存しますERROR: Operation on mixed SRID geometries
。
たとえば、次のクエリは機能します。
SELECT * FROM pad_meta where ST_Intersects(
'POINT(-122.334172173172 46.602634395263560)'::geometry, area::geometry
) ORDER BY created DESC;
そして、これはエラーです:
SELECT * FROM pad_meta where ST_Intersects(
'POINT(-122.334172173172 47.602634395263560)'::geometry, area::geometry
) ORDER BY created DESC;
これらは、経度の値を除いて同一のクエリであることに注意してください。さまざまな値を試しましたが、機能するクエリと機能しないクエリとの間の明確な移行ポイントを特定していません。
私は基本的に何かを誤解していると思います。今のところ、使用するクエリを再フォーマットしST_GeomFromText
、SRIDを明示的に指定することで、問題を解決/修正/回避しました。
SELECT * FROM pad_meta where ST_Intersects(
ST_GeomFromText('POINT(-122.334172173172 47.602634395263560)', 4326), area
) ORDER BY created DESC;
しかし、正直なところ、違いが何であるか、またはこの「本当に」解決策であるかどうかを本当に理解していません。
私の質問は次のとおりです。特定の値についてのみエラーが発生するのはなぜですか。このクエリをフォーマットする適切な方法は何ですか?
参照用のテーブル定義は次のとおりです。
CREATE TABLE IF NOT EXISTS pad_meta (
uuid CHAR(32),
created TIMESTAMP,
updated TIMESTAMP,
name VARCHAR(128),
origin GEOMETRY(Point, 4326),
radius INTEGER,
area GEOMETRY(Polygon, 4326),
expiry TIMESTAMP,
creator CHAR(32),
PRIMARY KEY (uuid)
);
また、geometry_columnsにSRIDのタイプが1つしかないことも確認しました。
SELECT f_table_name, f_geometry_column, srid FROM geometry_columns;
f_table_name | f_geometry_column | srid
--------------+-------------------+------
pad_meta | origin | 4326
pad_meta | area | 4326
ヘルプ/アドバイスに感謝します。ありがとうございました!(注:この質問も確認しましたが、テーブルに挿入するときにジオメトリSRIDを既に明示的に定義しているため、それが起こっていないようです。)
SRID=4326
(上記で行ったように)ステートメントの残りの部分にSRIDを設定する正しい方法がありますか?(ST_GeomFromText
単にSRIDを指定する方法がわからなかったために使用するのとは対照的に...?)クエリのデフォルトSRIDを設定する方法はありますか?毎回明示的に設定するのはかなり冗長なようです。もう一度、ありがとう!