QGIS、Postgis:ジオメトリタイプが列タイプと一致しません


30

SPITを介してQGISのPostgisにいくつかのポリゴンシェープファイルをインポートしようとしています。そのうちの1つはインポートできず、このエラーを返します。

ERROR: Geometry type (Polygon) does not match column type (MultiPolygon)

SPIT widnowのそのテーブルの属性「Feature Class」をMULTIPOLYGONからPOLYGONに変更しようとしましたが、何も起こりませんでした。

Postgisに両方のタイプ(ポリゴンとマルチポリゴン)を受け入れるようにする方法はありますか?または、どういうわけかシェイプファイルジオメトリをポリゴンからマルチポリゴンに変換できますか?何か案は?

Qgis 2.0.1をWindowsで試し、Qgis 2.3をArchLinuxで試しました。

回答:


14

スピットは維持されておらず、推奨されなくなりました。処理ツールボックスを使用して、「PostGISにインポート」アルゴリズムを選択することをお勧めします。私はそのルーチンを使ってずっと幸運に恵まれました。注意すべきいくつかの点:

  • データベース(接続名)パラメーターは、[PostGISレイヤーの追加]ダイアログで指定したデータベース接続の名前と一致する必要があります。
  • スキーマは既に存在している必要があります-自動的に作成されません

完璧に機能します。ありがとう。また、このシェープファイルをDBマネージャーでロードしました。最初にSPITでMultipolygonを使用して他のレイヤーをロードし、次にDBMのPOLYGONレイヤーで上書きしました(レイヤー/ファイルのインポート)。それも動作します。
dmh126 14

データベースは表示されません(Windows上のQGIS 2.10で同じ名前であっても)
Menelaos Kotsollaris

19

これは修正されない既知の問題のようです。http//hub.qgis.org/issues/5328を参照してください

回避策が必要な場合は、テーブルのジオメトリ列タイプを一般的な「ジオメトリ」に変更してみてください。

ALTER TABLE my_table ALTER COLUMN geom SET DATA TYPE geometry;

インポートが完了したら、元に戻すことができますMultiPolygon

ALTER TABLE my_table ALTER COLUMN geom 
    SET DATA TYPE geometry(MultiPolygon) USING ST_Multi(geom);

または、ogr2ogrを使用してデータをロードしてみてください。


あなたの答え@dbastonを支持します。私のものよりはましです。:)
sfletche 14

19

ogr2ogrを使用して、シェープファイルのPostGISデータベースへの取り込みを自動化します。特に質問に関しては、オプションを使用します。

-nlt PROMOTE_TO_MULTI

これにより、ogr2ogrは強制的にPOLYGONジオメトリをMULTIPOLYGONに昇格させ、エラーを回避します。非常に簡単な例:

ogr2ogr -f "PostgreSQL" PG:"dbname='<my_db>'" -nlt PROMOTE_TO_MULTI <shapefile>

pgsqlホスト/認証の詳細を省略しました。複数のシェープファイルをバッチ処理するには、次のようにします。

find ./ -name *.shp | xargs -n1 ogr2ogr <ogr2ogr args omitting the shapefile>

これは機能し、他の回答よりも簡単です。それは賛成に値する。
ジョーゲルムスカ

5

「Import to PostGis」アルゴリズムで解決しようとしましたが、成功しませんでした(データベースがリストに表示されませんでした-QGIS 2.10を使用しています)。

代わりに、以下で説明する単純なコマンドプロンプトタスクであるshp2pgsqlを使用しました

  • コマンドプロンプトを開きます(管理者として
  • 次のようなPostgreSQL / binフォルダーに移動します。 C:\Program Files\PostgreSQL\9.4\bin>
  • .shpファイルをこのディレクトリにコピーして貼り付けてください。(フォルダー全体を.shpファイルとともにコピーしました。
  • コマンドプロンプト、次の場合:ディレクトリ、4326はWGS84のあるSRIDを使用すると、異なるSSIDを使用している場合は変更して、あなたの特定のファイル(自動的に作成されます)。明らかに、変換したいすべてのファイルに対してこれを行います。ファイルは現在のディレクトリに保存されます(私の場合)shp2pgsql -s 4326 MyShpDir/MySHPFile.shp> MYSQLFile.sqlMyShpDirMySHPFile.shpMYSQLFileC:\Program Files\PostgreSQL\9.4\bin

次に、SQLファイルをPLSQLデータベースにコピーして貼り付けます。

さらに、もう1つの素晴らしい点は、次のようにコマンドにパラメーターを追加するだけで、テーブルにインデックスshp2pgsql即座に作成できるという事実です。I

shp2pgsql -s 4326 -I MyShpDir/MySHPFile.shp> MYSQLFile.sql

利益!:)


3

はい、次の制約をテーブルに追加することで、PostGISに任意のジオメトリタイプ(ポリゴン、マルチポリゴン、ポイント、ラインストリングなど)を受け入れるように指示できます。

PostGIS 2.xの場合(一般的なGeometry typemodを使用)

ALTER TABLE my_table ALTER COLUMN geom TYPE geometry(Geometry,4326);

前の回答(制約を使用したPostGIS 1.xの場合)

CONSTRAINT enforce_geometry_type CHECK (geometrytype(geom) = 'MULTIPOLYGON'::text OR geometrytype(geom) = 'POLYGON'::text OR geom IS NULL)

CONSTRAINTまたはその近くの構文エラー。SET CONSTRAINTSを試しましたが、代わりにCHECKの近くで同じエラーが発生しました。
dmh126 14

どのバージョンのpostgisを使用していますか?
sfletche 14

Postgis 2.1 for PostgreSQL 9.3
dmh126 14

enforce_geotype_geomではなくを使用してみてくださいenforce_geometry_type。それが機能するかどうかをお知らせください。機能する場合は回答を編集します。
sfletche 14

機能しません。同じエラー。
dmh126 14

2

「PostGISへのインポート」アルゴリズムソリューションを試しましたが、それでも機能しないことがわかりました。私が見つけた最も簡単な解決策は、に行くことにしたデータベース > DBマネージャ、データベースに移動し、クリックしてくださいインポート層/ファイル(下矢印)ボタンを。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.