pobieranie plików dxf z PostgreSQL

10

Z powodzeniem załadowałem kilka plików kształtów do bazy danych PostGIS. Chciałbym móc pobierać określoną geometrię i warstwy jako pliki dxf na podstawie zapytań SQL.

Używam PostGIS, GDAL, PostgreSQL i Python z pakietu OSGeo4W w systemie Windows.

Wyobrażam sobie, że powinienem używać ogr2ogr trochę tak:

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

ale kiedy robię to z odpowiednimi wartościami, pojawia się szereg błędów takich jak ten:

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

Powoduje błąd dla każdej kolumny atrybutu w warstwie some_tableAle dostaję plik dxf.

Jeśli już utworzyłem plik .dxf i ponownie uruchomiłem powyższe polecenie (w tym -overwriteopcję), zamiast tego pojawia się ten błąd:

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

Sprawdziłem już, aby upewnić się, że GDAL_DATAzmienna środowiskowa jest ustawiona poprawnie. (do C:\OSGeo4W\share\gdal)

Z pewnością możliwe jest, że podchodzę do tego zadania niepoprawnie, ponieważ jestem nowy we wszystkich tych narzędziach, dlatego jestem otwarty na wszelkie sugestie i wskazówki dotyczące tworzenia plików .dxf z danych GIS przechowywanych w PostgreSQL na podstawie zapytań SQL.

BenjaminGolder
źródło
znalazł odpowiedni link: fwarmerdam.blogspot.com/2010/07/ogr-dxf-upgrade.html
BenjaminGolder

Odpowiedzi:

9

Benzoes,

DXF (jak przypuszcza OGR) nie obsługuje dowolnych atrybutów GIS. Ma ustalony schemat, który wygląda następująco:

Warstwa: Ciąg (0,0)
Podklasy: Ciąg (0,0)
ExtendedEntity: String (0.0)
Rodzaj linii: String (0.0)
EntityHandle: String (0.0)

i tylko kilka z nich jest sprawdzanych podczas pisania. Najprościej jest po prostu użyć metody -skipfailures, chociaż wydaje się, że tłumaczenie trwa mimo błędów, nawet bez tego.

Podobnie jak w przypadku -overwrite - dotyczy formatów obsługujących usuwanie warstw, których DXF nie obsługuje. Po prostu wstępnie usuń istniejący plik DXF przed uruchomieniem ogr2ogr.

Frank Warmerdam
źródło
To prawdopodobnie najlepsza jak dotąd odpowiedź, ale dla mnie jest to podobne do powiedzenia, że ​​funkcja eksportu dxf OGR nie eksportuje dxfs. Mam nadzieję na odpowiedź, która faktycznie da mi użyteczny dxfs z danymi atrybutów, a nie dużą listą błędów. Zobaczę, czy mogę pomóc w poprawie eksportu OGR.
BenjaminGolder
2

z odpowiedzią Franka i wskazówką z „GIS-Kompetenzzentrum” miasta Uster (tylko w języku niemieckim)

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

Doszedłem do wniosku, że PostGIS na dxf można wykonać w następujący sposób:

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$"

Instrukcja sql na końcu utworzona dla każdego wiersza w $ COLUMN $ an Layer. Dlatego najlepiej będzie wybrać identyfikator $ COLUMN $, jak identyfikator lub odpowiednią nazwę.

Wypróbowałem to na stole wielokątnym 2D. Plik dxf nie zamknął polilinii. Być może można dodać coś takiego jak „$ polygon $ as Linetype” do ciągu sql.

Jeśli chcesz mieć wszystkie geometrie z tabeli na jednej warstwie, możesz użyć kodu z „GIS-Kompetenzzentrum” 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)"

Do obu instrukcji możesz dodać następującą opcję:

-spat xmin ymin xmax ymax

jeśli chcesz ograniczenia przestrzenne.

mk.archaeo
źródło
1

To, co powiedział Frank, będzie moją sugestią.
Utwórz dxf z nazwami warstw już w nim używanymi i użyj go jako szablonu.

Brad Nesom
źródło