ogr2ogrを使用してpostgisにシェープファイルをインポートすると、次のようになります。データソースを開くことができません


12

postgisデータベースにシェープファイルをインポートするには、ogr2ogrを使用します。ogr2ogrを正常にインストールし、pgsqlから次のコマンドを実行します。

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=user_1 password=***** dbname=imports" world_boundaries.shp

私が返すのはエラーメッセージです:

Unable to open datasource `world_boundaries.shp' with the following drivers: --a list of drivers follows (ESRI Shape File etc.)

また、シェープファイルの完全なパスを定義しようとしましたが、同じメッセージが表示されました。

また、私は実行しようとしました:

ogrinfo world_boundaries.shp

同じこと。


ファイルの権限に関する問題を修正した後、次のエラーが表示されます。

  ERROR 1: AddGeometryColumn failed for layer world_boundaries, layer creation has failed.
  ERROR 1: Terminating translation prematurely after failed
  translation of layer world_boundaries (use -skipfailures to skip errors)

また、GUI shp2pgsqlからインポートしようとすると、次のエラーが表示されます。

ALTER TABLE "public".""
Failed in pgui_exec(): ERROR:  permission denied for relation spatial_ref_sys
 CONTEXT:  SQL statement "SELECT SRID         FROM spatial_ref_sys WHERE SRID = new_srid"
PL/pgSQL function addgeometrycolumn(character varying,character   varying,character varying,character varying,integer,character varying,integer,boolean) line 50 at SQL statement
 SQL statement "SELECT AddGeometryColumn('',$1,$2,$3,$4,$5,$6,$7)"
 PL/pgSQL function addgeometrycolumn(character varying,character  varying,character varying,integer,character varying,integer,boolean) line 5 at     SQL statement

Shapefile import failed.

今回の問題は、このデータベースユーザーに十分な権限がないことでした。これはそれを修正しました:

GRANT ALL ON TABLE spatial_ref_sys TO my_user_name;

次のエラーメッセージ:

  Warning 1: Geometry to be inserted is of type 3D Multi Polygon, whereas the layer geometry type is 3D Polygon.
 Insertion is likely to fail
 ERROR 1: INSERT command for new feature failed.
 ERROR:  Geometry type (MultiPolygon) does not match column type (Polygon)

したがって、次のパラメーターを使用する必要があるようです。-nlt MULTIPOLYGON

ERROR 1: PostgreSQL driver doesn't currently support database creation.
Please create database with the `createdb' command.
PostgreSQL driver failed to create PG:host=localhost user=my_user_name dbname=my_database password=password -nlt POLYGON

ただし、shp2pgsql GUIを使用してロードされます。


@elrobisのコメントにより、これが最終的に機能するようになりました。データベースに正しくロードされたデータ!

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=geonode dbname=geonode_imports password=geonode" -nlt GEOMETRY wld_bnd_adm0_gaul_2015.shp

シェープファイルが有効ではないようです。他のソフトウェアでも動作しますか?
邪悪な天才

1
はい。QGISに正しくロードされました。
user1919

1
また、DBが既に存在し、ogr2ogr命令で正しいスペルであり、コマンド内のpostgresユーザーが必要な特権(SELECT、INSERT、UPDATE、CREATEなど)を完全に持っていると仮定して、-nln layername引数を追加してみてください。おそらく-overwrite、それが生き返るかどうかを確認するために。また、私があなたならsudo、postgresのスーパーユーザーと一緒にogr2ogrを実行して、許可と特権を除外することを非常に確実にします。スクリプトが完成したら、厄介なアクセス許可と特権を確認できます。:)
elrobis

3
ありがとう。-nlt POLYGONの代わりに-nlt GEOMETRYを追加するとうまくいきました。
user1919

1
良かった。私は先に進み、なぜそれがうまくいったと思うかを説明する答えで適切な応答をします。
エルビス

回答:


17

試行錯誤で発見したように、修正する必要のある厄介な問題はほとんどありませんでしたが、最後の問題はogr2ogrの-nlt GEOMETRY*引数を使用して解決しました。

* @LeeHachadoorianのコメントにある推奨事項に注意してください。前者は補助的な利点に加えてベストプラクティスを促進する-nlt PROMOTE_TO_MULTIためnlt GEOMETRY、デフォルトのソリューションとして使用されます。

ユーザーのアクセス許可とエラーメッセージ

まず、ogr2ogrはシェープファイルを開くことができず、アクセス許可の問題がシェープファイルにアクセスするOSユーザーに実際に影響していることに気付きました。しかし、ここには他の人にとって重要な教訓があります。具体的には、この点に関するogr2ogrのエラーメッセージは誤解を招くものでした。確かに、最初のコメンターの1人はシェイプファイルが無効であると考えていました。確かに、私の最初の推測は、おそらくパス/ファイル名にエラー/タイプミスがあるか、ファイルパスに型破りな文字があったかもしれないということです。スペース-ogr2ogrのシェープファイルを指す機能を破壊していました。あなたが発見したように、それは実際にはユーザー権限の問題にすぎませんでした。エラーメッセージは赤いニシンを作成するため、これは他の人が心の奥に留めておく必要がある可能性です。:)

SQLユーザー特権とミステリーエラー

しばらくの間、2番目のエラーに困惑していましたが、別のインポートユーティリティ(shp2pgsql)を使用してSQLユーザーをテストすると、より正確なエラーメッセージが表示され、SQLユーザーにspatial_ref_sysテーブルに対する必要な権限が与えられました。そのため、ogr2ogrのインポート命令を適切に機能させることが困難な場合は、SQLユーザーがデータベース自体 'spatial_ref_sys'テーブルの両方に対して十分な権限を持っていることを確認する必要があります。

混合ジオメトリタイプとベストプラクティス

最後に遭遇したハードルは、シェープファイルが単一およびマルチパートジオメトリの両方を同じデータセット/ファイルに共存させることを許可しているという事実に関連しているようです。同じフィーチャタイプのシングル/マルチパートであっても、同じテーブルにジオメトリタイプを混在させることは悪い習慣と見なされ、デフォルトでは、ツールチェーンのオープンソースプレーヤーはジオメトリタイプの混在からあなたを保護しようとします。幸いなことに、彼らはいくつかのオプションを提供します。最初に、ogr2ogr命令に-nlt GEOMETRY*引数を設定することをお勧めしました。これにより、ESRIの規則が緩いにもかかわらず、ポリゴンデータセットをインポートできました。ただし、これはおそらくテーブルにシングルパートとマルチパートの両方のジオメトリがあることを意味します。

ogr2ogrには、考慮する必要がある別の-nltオプション、つまりがあることを言及する価値がありますPROMOTE_TO_MULTIドキュメントを引用するには ..

GDAL 1.10以降、PROMOTE_TO_MULTIを使用して、ポリゴンまたはマルチポリゴンをマルチポリゴンに混在させるレイヤー、およびラインストリングまたはマルチラインストリングをマルチラインストリングに混在させるレイヤーを自動的に昇格させることができます。シェープファイルをPostGISや、ジオメトリタイプの厳密なチェックを実装する他のターゲットドライバーに変換する場合に役立ちます。

つまり、PROMOTE_TO_MULTIフラグを使用すると、すべてのフィーチャは、単一のパーツで構成されていても、マルチパートフィーチャに変換されます。コメントで@LeeHachadoorianが指摘しているように(そして、ほとんどの人が同意するはずです)、テーブルのフィーチャジオメトリを統一するためPROMOTE_TO_MULTI、より緩いGEOMETRYフラグよりも優先することをお勧めします。基本的に、記述するコードはマルチパートジオメトリを想定する必要があります。確かに、これはクリーンで開発の一部を簡素化できます。

インポートをPOSTするためにSHPに問題がある人のための一般的なアドバイス

  1. パスにファンキーな文字が含まれていないこと、およびパスまたはファイル名のいずれかにタイプミスやスペルミスがないことを確認してください
  2. @ user1919が発見したように、OSユーザーがシェープファイルにアクセスするための十分な権限を持っていることを確認してください!彼らが示したように、QGISのような別のソフトウェアでシェープファイルを開くことは役立ちます。1つのソフトウェアで動作する場合は破損せず、他のソフトウェアでも動作するはずです。

最初に、sudo特定のスクリプトが意図したとおりに機能していることがわかった後まで、許可の問題を除外するためにogr2ogrコマンドを実行することを検討してください。

  1. また、@ user1919が認識したように、SQLユーザーが、スクリプトの対象となるデータベースとspatial_ref_sysテーブルの両方に対して十分な権限を持っていることを確認してください。

繰り返しますが、最初は、ここでPostGRESqlスーパーユーザーを使用して、スクリプトが機能するまでSQL特権の問題を除外することを検討してください。スクリプトがスーパーユーザーで動作し、優先する自動化ユーザーで失敗する場合、問題はSQLユーザーに関連しており、データや環境(gdal / ogrインストールなど)に関連していないことがわかります。

  1. -nltフラグをPROMOTE_TO_MULTIまたはに設定してみてくださいGEOMETRY。シェープファイルでは、より緩やかな機能タイプの規則が許可されているため、オープンソースユーティリティにもっと対応するよう指示する必要がある場合があります。

  2. あなたは、PostgreSQLやMySQLにインポートしている場合は、設定してみてください-lco PRECISION=no私は、まさにこの引数が何をするのか理解していない、..fair警告が、しかし、ここで私が経験してきたものだ..あなたが知っているように、シェープファイルは、しばしば含まSHAPE_LENGTHSHAPE_AREAフィールドを、そしてI謎の失敗を経験しているときに時々気づきました。これらのフィールドを削除すると、データを正しくインポートできます。ただし、を使用すると-lco PRECISION=no、これらのフィールドを削除せずにインポートするデータを取得できます。トラブルシューティングの手順としてこのパラメーターを使用することをお勧めしますが、実稼働ソリューションでインポートを受け入れる前に、どのパラメーターが本当に解決するのかを理解することです。

  3. 最後に、MySQLを使用している場合、いくつかの非常に大きなフィーチャジオメトリがMySQLのmax_allowed_packetパラメーターを害する可能性があることに注意してください。これについては、MySQLドライバーのドキュメントで詳しく読むことができます。しかし、解決策は、MySQL構成を変更して、デフォルト値よりも大きくすることです。

ogr2ogrのSHPからPostGISへのインポートコマンドの例

ここをさまようかもしれない初心者のために、これはほとんどの私のHPからPostへのインポートがogr2ogrを使用するように見えるものです。ファイルのパス/名前を引用符で囲むと、スペース、奇妙な文字、端末間の改行を防ぐことに注意してください。また、ジオメトリ名フィールドのオーバーライドに加えて、上記の引数のほとんどを含めました。 FIDフィールド、およびレイヤー名:

ogr2ogr -f "PostgreSQL" "PG:host=127.0.0.1 user=myuser dbname=mydb password=mypassw0rd" "C:/path/to/some_shapefile.shp" -lco GEOMETRY_NAME=the_geom -lco FID=gid -lco PRECISION=no -nlt PROMOTE_TO_MULTI -nln new_layername -overwrite


3
に関して-nlt PROMOTE_TO_MULTI、これは実際にポリゴンジオメトリのベストプラクティスです。これを強力なデフォルトの選択肢としてアドバイスするように回答を変更することをお勧めしますが、慎重に検討した後に違反する必要があります。またgeometry、ユーザー/開発者が自分が何をしていて、ポリゴン、ライン、およびポイントタイプを混合する必要があるかを本当に理解していない限り、汎用タイプを使用してポリゴン/マルチポリゴンの混合を処理することも強くお勧めします。
リーハチャドリアン

1
@LeeHachadoorian、同意した。回答を推奨どおりに編集しました。私の防御でPROMOTE_TO_MULTIは、これですべてを始めたときに利用できた元のソリューションにデフォルトのままであるという十分な新機能(GDAL 1.10)です。:) ..公平に言えば、シェープファイルはシングルとマルチパートタイプのみを結合するため、ogr2ogrがshpをプッシュして、-nlt GEOMETRYポイント、ラインポリでテーブルを構築するシナリオはありません:)))))しかし、私はこの問題に関するあなたの立場に完全に同意します。
-elrobis

1
シェープファイルでは、Polygonタイプで複数のポリゴンを使用できます。MultiPolygonタイプもありません。そのため、この種のシェープファイルに遭遇した場合でも、-nlt PROMOTE_TO_MULTIこの作業を行うために使用する必要があります。
CMCDragonkai
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.