получение dxf-файлов из PostgreSQL

10

Я успешно загрузил кучу шейп-файлов в базу данных PostGIS. Я хотел бы иметь возможность получать определенную геометрию и слои в виде файлов DXF на основе запросов SQL.

Я использую PostGIS, GDAL, PostgreSQL и Python из пакета OSGeo4W для Windows.

Я представляю, что я должен использовать ogr2ogr немного так:

$ ogr2ogr -sql "SELECT * FROM some_table" -f "dxf" outputfile.dxf -overwrite "PG:dbname=mydb user=dbusername password=dbpassword"

но когда я делаю это с соответствующими значениями, я получаю ряд ошибок, подобных этой:

ERROR 1: DXF layer does not support arbitrary field creation, field 'objectid' not created. 

В результате возникает ошибка для каждого столбца атрибута в слое, some_tableно я получаю файл DXF.

Если я уже создал файл .dxf и повторно ввел команду выше (включая -overwriteопцию), вместо этого я получаю эту ошибку:

Layer sql_statement not found, and CreateLayer not supported by driver. ERROR 1: Terminating translation prematurely after failed translation from sql statement.

Я уже проверил, чтобы убедиться, что GDAL_DATAпеременная окружения установлена ​​правильно. (к C:\OSGeo4W\share\gdal)

Вполне возможно, что я неправильно подхожу к этой задаче, потому что я новичок во всех этих инструментах, поэтому я открыт для любых предложений и советов о том, как создавать файлы .dxf из данных ГИС, хранящихся в PostgreSQL, на основе запросов SQL.

BenjaminGolder
источник
нашел соответствующую ссылку: fwarmerdam.blogspot.com/2010/07/ogr-dxf-upgrade.html
BenjaminGolder

Ответы:

9

Benjamin,

DXF (как предполагается OGR) не поддерживает произвольные атрибуты ГИС. Он имеет фиксированную схему, которая выглядит следующим образом:

Слой: строка (0.0)
Подклассы: Строка (0.0)
ExtendedEntity: String (0.0)
Тип линии: строка (0.0)
EntityHandle: String (0.0)

и только некоторые из них фактически проверяются при записи. Самый простой способ - просто использовать метод -skipfailures, хотя кажется, что перевод продолжается, несмотря на ошибки, даже без этого.

Что касается -overwrite - это применимо для форматов, которые поддерживают удаление слоя, которые не поддерживает DXF. Просто предварительно удалите существующий файл DXF перед запуском ogr2ogr.

Фрэнк Вармердам
источник
Это, вероятно, лучший ответ на данный момент, но для меня это все равно, что сказать, что функция экспорта в dxf OGR не экспортирует dxfs. Я надеюсь на ответ, который на самом деле дает мне пригодные для использования dxfs с данными атрибутов, а не большой список ошибок. Я посмотрю, смогу ли я помочь улучшить экспорт OGR.
БенджаминГолдер
2

с ответом от Фрэнка и подсказкой от «ГИС-Компетенцентрум» города Устер (только на немецком языке)

http://gis.uster.ch/dokumentation/datenkonvertierung/ogr

Я понял, что PostGIS для dxf можно сделать так:

ogr2ogr -f DXF $TITLE$.dxf PG:"dbname='$DBNAME$' host='$HOST$' port='$PORT$' user='$USER$' password='$PASSWORD$'" -sql "select $COLUMN$ as Layer, the_geom from $TABLE$"

В конце sql-оператор создается для каждой строки в $ COLUMN $ a Layer. Поэтому лучше выбрать идентификатор типа $ COLUMN $ или соответствующее имя.

Я попробовал это с 2D-таблицей полигонов. Файл dxf не имеет закрытых полилиний. Возможно, можно добавить что-то вроде «$ polygon $ as Linetype» в строку sql.

Если вы хотите, чтобы все геометрические фигуры из вашей таблицы находились на одном слое, вы можете использовать код из "ГИС-Компетенцентрум" от Uster

ogr2ogr -select '' -f DXF DXF $TITLE$.dxf PG:"dbname='$DBNAME$' host='$HOST$' port='$PORT$' user='$USER$' password='$PASSWORD$' schemas=$SCHEMA$ tables=$TABLE$(the_geom)"

В оба утверждения вы можете добавить следующую опцию:

-spat xmin ymin xmax ymax

если вы хотите пространственное ограничение.

mk.archaeo
источник
1

То, что сказал Фрэнк, будет моим предложением.
Создайте dxf с уже имеющимися именами слоев и используйте его в качестве шаблона.

Брэд Несом
источник