GIS開発研究所 > PostGISのmixed SRIDエラー原因|SRID混在を直す方法

PostGISのmixed SRIDエラー原因|SRID混在を直す方法

2026年7月24日

5分で読めます

PostGISのOperation on mixed SRID geometriesエラーを、ST_SRID・ST_SetSRID・ST_Transformの違いから切り分けます。SRIDが0のデータや混在データを調査し、座標値を壊さず安全に修正するSQLと再発防止の入力チェックを紹介します。

PostGIS
SRID
ST_Transform
座標系

PostGISで距離や交差を計算したとき、次のようなエラーが出ることがあります。

Operation on mixed SRID geometries

これは、比較しようとしたgeometryに異なるSRIDが設定されている状態です。SRIDは「この座標値がどの座標系で書かれているか」を示す番号です。

エラーを消すだけならSRIDを付け直せますが、間違った関数を使うと地物が別の場所へ表示されます。まずST_SetSRIDST_Transformの違いを整理しましょう。

先に結論:SetSRIDとTransformを使い分ける

  • ST_SetSRID 座標値は変えず、「この座標系です」という情報だけを設定する
  • ST_Transform 指定した座標系へ座標値そのものを変換する

たとえば、経度・緯度の値なのにSRIDが0なら、正しいSRIDをST_SetSRIDで設定します。すでに正しく4326と設定されたデータを平面直角座標系へ変えるなら、ST_Transformを使います。

PostGISテーブル内のSRIDを調べる

まず列定義を確認します。

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が入っている場合は、取り込み処理や列型に問題がないか確認します。

mixed SRIDエラーが出るSQL例

次の例では、ポイントが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のデータを修正する

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

この変更はテーブル全体を書き換えるため、データ量によって時間とロックが発生します。次の流れで進めると安全です。

  1. 元テーブルをバックアップする
  2. 検証用テーブルで変換する
  3. 件数、位置、範囲を比較する
  4. 関連するビューやAPIを確認する
  5. メンテナンス時間に本番へ反映する

ST_SetSRIDで位置がずれる理由

たとえば、メートル単位の平面直角座標を4326としてラベルだけ付け替えても、数値自体は経度・緯度になりません。

-- 座標値は変換されず、SRID情報だけが4326になる
SELECT ST_SetSRID(geom, 4326)
FROM survey_points;

PostGIS公式も、ST_SetSRIDは座標を変換せず、変換にはST_Transformを使うと説明しています。見た目だけエラーが消えても、地物が正しい場所にあるか必ず地図で確認してください。

APIから受け取るgeometryのSRIDを固定する

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型の混入を登録時に検知しやすくなります。

mixed SRIDエラーの再発を防ぐ

  • データソースごとに元の座標系を記録する
  • インポート時にSRIDを明示する
  • geometry列へ型とSRIDを指定する
  • APIの入力仕様に座標順とSRIDを書く
  • 変換前後の範囲を自動テストする
  • 本番更新前にQGISで位置を目視確認する

SRIDエラーは、関数を足すだけでなく、データがどの座標系で作られたかまで戻って確認するのが大切です。

PostGISの座標系整理や既存GISデータの移行でお困りの場合は、GIS開発を無料相談する

参考資料

GISシステム開発・改善支援

既存GISの改善から新規開発まで相談できます

QGIS、PostGIS、GeoServer、MapLibre、GeoDjangoを使った現地調査基盤、Web地図、データ処理を支援します。

GIS開発の無料相談

同期・性能・地図表示の問題を相談できます

QGIS、PostGIS、GeoServer、MapLibre、GeoDjangoの構成を確認し、原因の切り分けと改善順を整理します。

著者
守高 成悟
守高 成悟

代表取締役 CEO

千葉県出身。10歳の頃からプログラミングを始め、ゲーム、Webサイト、ロボット、スマホアプリなどを制作。大阪大学基礎工学部情報科学科で情報工学と統計学を学び、大学時代はAIを研究。大学在学中にWeb広告代理店でのインターンや人材系Webサービスの立ち上げを経験し、卒業後はフリーランスエンジニアとしてGISシステム、データ基盤構築、Webシステムの開発に従事。10年以上のWebアプリ開発・データ分析経験を基に、2023年9月に株式会社ビットライトを設立し、現場業務の仕組み化からデータ基盤構築、データ活用支援までを一気通貫で支援。

運営会社
株式会社ビットライト
株式会社ビットライト

顧客が本当に必要だった価値を、実装する。

現場業務の仕組み化からデータ基盤構築、データ活用支援までを一気通貫で支援しています。

コーポレートサイトを見る