2

アップデート:

はい、それでした!

mloskot が言ったように、テーブル全体をダンプする必要があります。SQL でフィールドを選択すると、燃料幅に関する情報が失われます。

ありがとう、それはそれを修正しました!

こんにちは、みんな、

ogr2ogrに問題があります。PostgreSQL テーブルをシェープファイルにダンプしようとしています。ogr2ogr は、integer や char などのデータ型のサイズを変更するようです。

Shapefile セットが読み込まれた DB 構造の一部を次に示します。

Table "test"
nd_1 - numeric(8,0)
nd_2 - numeric(2,0)
nd_3 - numeric(2,0)
nd_9 - character varying(60)

そしてそれは正しく見えます。

楽しみはここから始まります:

ogr2ogr air5000.shp "PG: [...]" sql 'select
CAST(nd_1 AS INTEGER),
CAST(nd_2 AS INTEGER),
CAST(nd_3 as INTEGER),
CAST(ND_9 AS CHARACTER VARYING(60))
from test' ;

それから

dbview -e test.dbf 

Field Name Type Length Decimal Pos
nd 1 - N - 11 - 0
nd 2 - N - 11 - 0
nd 3 - N - 11 - 0
nd 9 - C - 80 - 0

num-length は8,2,2から11まで、charの長さは10から80までです。

幅(長さ)が指定されていない場合、これらはデフォルトであると読みました。

幅を指定するにはどうすればよいですか?

次のように、キャストの有無にかかわらず、すべてのコンボを試しました。

select
CAST(nd_1 AS NUMERIC),
CAST(nd_2 AS NUMERIC),
CAST(nd_3 as NUMERIC),
CAST(ND_9 AS CHARACTER VARYING(60))

を与えますdbview

Field Name Type Length Decimal Pos
nd 1 - N - 24 - 15
nd 2 - N - 24 - 15
nd 3 - N - 24 - 15
nd 9 - C - 80 - 0

キャストなし ( select * from test) を与える

Field Name      Type    Length  Decimal Pos
nd 1 - N - 24 - 15
nd 2 - N - 24 - 15
nd 3 - N - 24 - 15
nd 9 - C - 80 - 0

どんな場合でも、オリジナルにはほど遠い。

debugfile [--debug on]特別な私見は何も与えません。これは、私が試した3つのogr2ogrコマンドの出力です。

PG: PQexec(DECLARE executeSQLCursor CURSOR for select CAST(nd_1 AS INTEGER), CAST(nd_2 AS INTEGER), CAST(nd_3 as INTEGER), CAST(ND_9 AS CHARACTER VARYING(60)) from test)
PG: PQexec(DECLARE OGRPGResultLayerReader CURSOR for select CAST(nd_1 AS INTEGER), CAST(nd_2 AS INTEGER), CAST(nd_3 as INTEGER), CAST(ND_9 AS CHARACTER VARYING(60)) from test)
PG: PQexec(DECLARE OGRPGResultLayerReader CURSOR for select CAST(nd_1 AS INTEGER), CAST(nd_2 AS INTEGER), CAST(nd_3 as INTEGER), CAST(ND_9 AS CHARACTER VARYING(60)) from test)
PG: 2 features read on layer 'sql_statement'.

PG: PQexec(DECLARE executeSQLCursor CURSOR for select CAST(nd_1 AS NUMERIC), CAST(nd_2 AS NUMERIC), CAST(nd_3 as NUMERIC), CAST(ND_9 AS CHARACTER VARYING(60)) from test)
PG: PQexec(DECLARE OGRPGResultLayerReader CURSOR for select CAST(nd_1 AS NUMERIC), CAST(nd_2 AS NUMERIC), CAST(nd_3 as NUMERIC), CAST(ND_9 AS CHARACTER VARYING(60)) from test)
PG: PQexec(DECLARE OGRPGResultLayerReader CURSOR for select CAST(nd_1 AS NUMERIC), CAST(nd_2 AS NUMERIC), CAST(nd_3 as NUMERIC), CAST(ND_9 AS CHARACTER VARYING(60)) from test)
PG: 2 features read on layer 'sql_statement'.
PG: PQexec(DECLARE executeSQLCursor CURSOR for select * from test)
PG: PQexec(DECLARE OGRPGResultLayerReader CURSOR for select * from test)
PG: PQexec(DECLARE OGRPGResultLayerReader CURSOR for select * from test)
PG: 2 features read on layer 'sql_statement'.

私も試し-dsco precision=noましたが、どちらも役に立ちませんでした。

dbview足を引っ張っているのかもしれませんが、Shapefile のソース .dbf のヘッダーが正しく設定されていることがわかりました。

誰でもアイデアはありますか?

EJ

UpDate: こんにちは、mloskot

ご返信と再フォーマットをありがとうございます。

私はGDAL 1.6.3を使用しています。

幅を指定してみましたが、違いはありません。

ogr2ogr test.shp "PG: [...] " -sql 'select CAST(nd_1 AS INTEGER), CAST(nd_2 AS numeric(2,0)), CAST(nd_3 as NUMERIC(2,0)) from test' ;

与えます:

Field Name  Type    Length  Decimal Pos
nd 1          N    11       0
nd 2          N    24      15
nd 3          N    24      15

はい、次のように、キャストせずにフィールドを指定しようとしました:

ogr2ogr air5000.shp "PG: [...] "-sql 'select nd_1, nd_2, nd_3, ND_9 from test'

与える:

 Field Name Type    Length  Decimal Pos
nd 1          N    24      15
nd 2          N    24      15
nd 3          N    24      15
nd 9          C    80       0

しようとしている

integer(field_length)

お気に入り

CAST(nd_2 AS INTEGER(2))

動作しません、エラーが発生します

ERROR 1: ERROR: current transaction is aborted, commands ignored until end of transaction block

Postgresql と PostGIS のバージョンが古くなっているのではないでしょうか? Postgres = 8.3.5、PostGIS = 1.3.3

Shapelib を確認します。今インストールしました。

4

1 に答える 1

5

まず、使用している GDAL/OGR のバージョンを指定しないため、どこに問題があるかを診断するのが難しい場合があります。バージョンごとに改善が適用されていることに注意してください。

はい、正しい値です。それぞれ整数幅と文字幅の値 11 と 80 です。これは、ESRI シェープファイルの OGR ドライバーによって設定されたデフォルト値です。

問題は、SQL クエリを使用して一部の行フォーム テーブルのみをフェッチしているため、OGR PG ドライバードライバーがフィールド幅を保持しないことです。

次の 2 つの出力を比較します。

テーブル全体をクエリする

$ ogrinfo PG:dbname=test test_ogr
Layer name: test_ogr
Geometry: Point
Feature Count: 1
Extent: (1.000000, 2.000000) - (1.000000, 2.000000)
Layer SRS WKT:
(unknown)
FID Column = id
Geometry Column = geom
n3: String (60.0)
n1: Integer (8.0)
n2: Integer (2.0)
OGRFeature(test_ogr):1
  n3 (String) = abcdefg
  n1 (Integer) = 12345678
  n2 (Integer) = 12
  POINT (1 2)

同じクエリですが、SQL 選択を手動で指定します

$ ogrinfo PG:dbname=test -sql "SELECT n1, n2, n3, geom FROM test_ogr"
Layer name: sql_statement
Geometry: Unknown (any)
Feature Count: 1
Extent: (1.000000, 2.000000) - (1.000000, 2.000000)
Layer SRS WKT:
(unknown)
Geometry Column = geom
n1: Real (0.0)
n2: Real (0.0)
n3: String (0.0)
OGRFeature(sql_statement):0
  n1 (Real) = 12345678
  n2 (Real) = 12
  n3 (String) = abcdefg
  POINT (1 2)

ご覧のとおり、2 番目のオプションではフィールド プロパティが完全に失われ、それが OGR のしくみです。

以下は 2 つの出力の同じ例ですが、Shapefile に変換されています。

test_ogrテーブルからすべてのデータをダンプする

$ ogr2ogr -f "ESRI Shapefile" test.shp PG:dbname=test test_ogr
$ dbfdump -h test.dbf
Field 0: Type=C/String, Title=`n3', Width=60, Decimals=0
Field 1: Type=N/Integer, Title=`n1', Width=8, Decimals=0
Field 2: Type=N/Integer, Title=`n2', Width=2, Decimals=0
n3                                                                 n1 n2
abcdefg                                                      12345678 12

-sql オプションと SELECT クエリを使用する場合:

$ ogr2ogr -f "ESRI Shapefile" test.shp PG:dbname=test -sql "SELECT n1, n2, n3, geom FROM test_ogr"
$ dbfdump -h test.dbf
Field 0: Type=N/Double, Title=`n1', Width=24, Decimals=15
Field 1: Type=N/Double, Title=`n2', Width=24, Decimals=15
Field 2: Type=C/String, Title=`n3', Width=80, Decimals=0
                      n1                       n2 n3
12345678.000000000000000       12.000000000000000 abcdefg

したがって、すべてのプロパティを正確に保持するには、SQL クエリを指定せずにすべてのテーブルをダンプする必要があります。

ところで、dbfview に関して疑わしい場合は、Shapelib の shpdump および dbfdump ユーティリティを使用して、出力 Shapefile ファイル (.shp、.dbf) を調べてください。このソフトウェアは、シェープファイル データを処理するために GDAL/OGR で使用されるものとまったく同じ C コードを使用します。

于 2010-02-03T01:15:24.333 に答える