ОБНОВЛЕНИЕ:
Да, это было!
Как сказал mloskot, вся таблица должна быть сброшена. выбор полей с помощью sql теряет информацию о ширине фуилда.
Спасибо, что исправили!
Привет всем,
У меня проблема с ogr2ogr . Я пытаюсь вывести табель PostgreSQL в Shapefile. ogr2ogr, похоже, меняет размер типов данных, таких как integer и char.
Вот часть структуры БД, в которую был прочитан набор Shapefile:
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 , длина символа увеличивается от 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
тянет меня за ногу, но он показывает, что заголовок исходного файла .dbf Shapefile установлен правильно.
У кого-нибудь есть идеи?
EJ
Обновить:
привет, млоскот,
спасибо за ваш ответ и переформатирование, высоко ценится!
Я нахожусь на 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
1089 * пытается *
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, я установил его только сейчас.