GIS開発研究所 > PostGISのmixed SRIDエラー原因|SRID混在を直す方法
2026年7月24日
•約5分で読めます
PostGISのOperation on mixed SRID geometriesエラーを、ST_SRID・ST_SetSRID・ST_Transformの違いから切り分けます。SRIDが0のデータや混在データを調査し、座標値を壊さず安全に修正するSQLと再発防止の入力チェックを紹介します。
PostGISで距離や交差を計算したとき、次のようなエラーが出ることがあります。
Operation on mixed SRID geometries
これは、比較しようとしたgeometryに異なるSRIDが設定されている状態です。SRIDは「この座標値がどの座標系で書かれているか」を示す番号です。
エラーを消すだけならSRIDを付け直せますが、間違った関数を使うと地物が別の場所へ表示されます。まずST_SetSRIDとST_Transformの違いを整理しましょう。
ST_SetSRID 座標値は変えず、「この座標系です」という情報だけを設定するST_Transform 指定した座標系へ座標値そのものを変換するたとえば、経度・緯度の値なのにSRIDが0なら、正しいSRIDをST_SetSRIDで設定します。すでに正しく4326と設定されたデータを平面直角座標系へ変えるなら、ST_Transformを使います。
まず列定義を確認します。
SELECT
f_table_schema,
f_table_name,
f_geometry_column,
type,
srid
FROM geometry_columns
WHERE f_table_name IN ('survey_points', 'management_areas');
次に、実データのSRIDを集計します。
SELECT
ST_SRID(geom) AS srid,
count(*) AS record_count
FROM survey_points
GROUP BY ST_SRID(geom)
ORDER BY srid;
同じテーブルに複数のSRIDが入っている場合は、取り込み処理や列型に問題がないか確認します。
次の例では、ポイントが4326、管理区域が6677になっています。
SELECT p.id
FROM survey_points p
JOIN management_areas a
ON ST_Intersects(p.geom, a.geom);
比較する前に、どちらかへ座標系をそろえます。
SELECT p.id
FROM survey_points p
JOIN management_areas a
ON ST_Intersects(
ST_Transform(p.geom, 6677),
a.geom
);
このSQLで結果は確認できますが、大量データに毎回ST_Transformを実行すると負荷が増えます。頻繁に比較するなら、保存する座標系や変換済み列を見直しましょう。
SRIDが0でも、座標値がどの座標系か分からないまま修正してはいけません。値の範囲、作成元の仕様、元ファイルの.prj、QGISのレイヤー情報を確認します。
経度・緯度の4326だと確認できた場合の例です。
UPDATE survey_points
SET geom = ST_SetSRID(geom, 4326)
WHERE ST_SRID(geom) = 0;
更新前に対象件数とサンプル座標を確認しましょう。
SELECT
id,
ST_AsText(geom)
FROM survey_points
WHERE ST_SRID(geom) = 0
LIMIT 20;
データのSRIDが正しく設定済みで、保存先の座標系を変更したい場合はST_Transformを使います。
ALTER TABLE survey_points
ALTER COLUMN geom
TYPE geometry(Point, 6677)
USING ST_Transform(geom, 6677);
この変更はテーブル全体を書き換えるため、データ量によって時間とロックが発生します。次の流れで進めると安全です。
たとえば、メートル単位の平面直角座標を4326としてラベルだけ付け替えても、数値自体は経度・緯度になりません。
-- 座標値は変換されず、SRID情報だけが4326になる
SELECT ST_SetSRID(geom, 4326)
FROM survey_points;
PostGIS公式も、ST_SetSRIDは座標を変換せず、変換にはST_Transformを使うと説明しています。見た目だけエラーが消えても、地物が正しい場所にあるか必ず地図で確認してください。
GeoJSONは一般に経度・緯度で扱われることが多いものの、受信データの仕様を確認してから登録します。
INSERT INTO survey_points (name, geom)
VALUES (
'点検地点A',
ST_SetSRID(
ST_GeomFromGeoJSON('{"type":"Point","coordinates":[139.70,35.68]}'),
4326
)
);
テーブル列をgeometry(Point, 4326)のように型付けしておくと、異なるSRIDやgeometry型の混入を登録時に検知しやすくなります。
SRIDエラーは、関数を足すだけでなく、データがどの座標系で作られたかまで戻って確認するのが大切です。
PostGISの座標系整理や既存GISデータの移行でお困りの場合は、GIS開発を無料相談する。
千葉県出身。10歳の頃からプログラミングを始め、ゲーム、Webサイト、ロボット、スマホアプリなどを制作。大阪大学基礎工学部情報科学科で情報工学と統計学を学び、大学時代はAIを研究。大学在学中にWeb広告代理店でのインターンや人材系Webサービスの立ち上げを経験し、卒業後はフリーランスエンジニアとしてGISシステム、データ基盤構築、Webシステムの開発に従事。10年以上のWebアプリ開発・データ分析経験を基に、2023年9月に株式会社ビットライトを設立し、現場業務の仕組み化からデータ基盤構築、データ活用支援までを一気通貫で支援。