Fragen zu Postgis / PostgreSQL

linestring und bbox sind Objekte in der DB, die für Geographische Abfragen verwendet werden (GIS). So ist es ganz einfach abzufragen, welche Objekte sich in welcher Stadt befinden oder was im Umkreis von 10 Metern rechts und links einer Strasse liegt (welche Bäume müssen weg, wenn die Straße breiter wird, …)
Es geht auch ohne, aber dann dauern die Abfragen erheblich länger.

na klar. Der OSM-Server ist auch nur eine Postgresql-DB und die API/XPAI macht auch “nur” Abfragen - also das Selbe in Grün.
Mit einer funktionierenden DB (egal ob simple oder osm2pgsql) hast du sowas wie deinen eigenen xapi-server. Nur die Syntax ist anders - sql halt.
Gruss
Walter

p.s. Du brauchst dann zwar keinen XAPI-Server mehr, hast aber verdammt viel Arbeit, das Kind am Leben zu halten. Hat alles seinen Preis.

Frag mich was leichteres :wink: Ich weiß nur, dass es so durchläuft.

Du kannst alles, was du mit osmosis aus einem Extrakt filtern kannst, direkt aus der Datenbank abfragen. Also z.B. eine bbox ausschneiden, und mit kosmos oder mapritive rendern, oder nach beliebigen tag-Kombinationen filtern.

Gruß,
ajoessen

mir ist leider keine Gegenüberstellung bekannt. :frowning:
Der große Unterschied liegt in der internen Tabellsenstruktur.
osm2pgsql erstelle eine db, die primär zum Rendern von Karten (z.b. mit mapnik) gedacht sind. simple ist da etwas “neutraler” aber nicht so gut zum Rendern gemacht.
es gibt sogar einige Kollegen (z.b. ajoessen), die beide Verfahren parallel verwenden - je nachdem was gerade “anliegt”.
Such dir halt eine der beiden aus UND VERWECHSEL DIE NICHT :wink:
Gruss
Walter

Bei beiden DBs werden die Tabellen von den jeweiligen Programmen osmosis bzw. osm2pgsql erzeugt.

Simple DB (osmosis)

  • Die Struktur bei simple DB (osmosis) ist fest.

osm2pgsql

  • Beim Import kann man einen Prefix angeben (z.B. planet), diesen erhalten dann die Tabellen. Hier kann man also mehrere Importen in verschiedene Tabellen ablegen.
  • Außerdem kann man bei dieser DB über eine Konfigurationsdatei beim Import angegeben, welche OSM Tags in extra Tabellen-Spalten abgelegt werden sollen (Standard-Style z.B. addr:housenumber, amenity etc. und getrennt nach den
  • drei Arten Knoten, Linien und geschlossene Wege. Die Unterscheidung zwischen Linie und geschlossenem Weg ist eine weitere Besonderheit dieser DB.
  • Außerdem gibt es noch eine extra Tabelle für Roads mit den highway= Arten (nicht geprüft, ob alle).
  • Durch die Konfigurationsdateien kann man besser auf gewünschte Tags zugreifen. Aber der Zugriff auf alle Tags ist mir als SQL-Newbie nicht wirklich gelungen. So ist auch der Zugriff auf die Relations-Tags schwieriger (für mich) als bei der simple DB (Spaltenformat text statt hstore).

Insgesamt ist die simple DB näher am Original OSM-Datenmodell.

Eine Frage an die SQL-ler:

bei der simple-DB frage ich so nach einem Tag Key/Value
select tags->‘name’ as strassenname from ways where ( tags @> ‘highway=>“residential”’);
wie ist die entsprechende Anfrage bei der osm2pgsql-DB, wenn wir mal davon ausgehen, daß highway nicht extra vorliegt, sondern nur über tags ausgewertet werden kann (real will ich andere, seltene Tags abfragen und nicht extra viele Spalten definieren)?

Viele Grüße

Dietmar

ganz dünnes Eis bei mir. In der Mapserver Render-Config werden Straßen so rausgeholt
select way, osm_id ,highway,ref, name, tunnel from osm_line where highway is not null order by z_order

Als Renderer verwende ich derzeit maperitive, an mapnik traue ich mich noch nicht ran. Bis jetzt ist mir noch kein Unterschied aufgefallen ob ich nun mir die highways aus simple oder osm2pgsql DB extrahiere, aber das liegt vielleicht an meinen (noch) einfachen Übungsbeispielen. Man fängt halt kein an :slight_smile:

mapfriend70

Hab noch einen Link gefunden, wo noch ein bisschen zu den Unterschieden von osm2pgsql / osmosis steht. http://blazejaksgis.wordpress.com/2010/07/16/osm-daten-in-postgis-und-qgis-nachtrag/

mapfriend70

Wir haben alle mal klein angefangen - die meissten sogar als Baby :wink:

Soweit ich aus der Theorie weiss, macht osm2pgsql einige Sachen, die sehr wichtig beim Rendern sind, bereits bei der Datenübernahme.
Und für das Routing - die dritte große Anwendung für OSM - ist das auch der Fall.
Ich vermute, dass osm2pgsql aus relationen eventuell ways macht, inden es die “zusammenpfriemelt” - bin mir aber nicht ganz sicher.
Die stehen dann in der db fertig drin und brauchen nicht erst zusammengesucht werden. Damit ist das dann mit den Landuse-Flächen und den Routen einfacher für mapnik und co. Aber alles nur Spekulation.

Gruss
Walter

Hallo!

Der Import von kleineren Gebieten (Bundesland) hat geklappt. Für ganz Deutschland bekomme ich immer einen Out-Of-Memory-Fehler.

Es gibt ja neben --write-pgsql auch noch --write-pgsql-dump, welches die Daten zunächst in Text-Datein schreibt, die dann mittels SQL-Befehlen die Datenbank kopiert werden. Für ein einzelnes Bundesland klappt es, genau wie das anschliessende Kopieren in die Datenbank. Probiere ich das Ganze mit einem Deutschland-Extrakt, gibts aber auch damit Probleme

Das Ganze habe ich unter Windows 7 Prof. 64 Bit gemacht.

Der erste Versuch mit direktem Schreiben in die Datenbank:

c:\OSM\osmosis>call osmosis --read-xml file=“c:\osm\planet\germany.osm.bz2” --b bufferCapacity=50000 --lp --write-pgsql user=“xxx” database=“osm_ger”


[...]
INFO: Processing Way 97719199, 4366.014376996805 objects/second.
07.02.2011 19:22:17 org.openstreetmap.osmosis.core.progress.v0_6.EntityProgressLogger process
INFO: Processing Way 97878026, 4303.774715398442 objects/second.
07.02.2011 19:22:22 org.openstreetmap.osmosis.core.progress.v0_6.EntityProgressLogger process
INFO: Processing Relation 363743, 13120.621019108281 objects/second.
07.02.2011 19:22:29 org.openstreetmap.osmosis.core.progress.v0_6.EntityProgressLogger process
INFO: Processing Relation 1178704, 8805.22674865488 objects/second.
07.02.2011 19:22:31 org.openstreetmap.osmosis.core.progress.v0_6.EntityProgressLogger complete
INFO: Processing completion steps.
07.02.2011 19:43:19 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinition
s
INFO: Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-er
ror-codes.xml]
07.02.2011 19:43:19 org.springframework.jdbc.support.SQLErrorCodesFactory <init>
INFO: SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Syba
se]
07.02.2011 19:43:20 org.openstreetmap.osmosis.core.pipeline.common.ActiveTaskManager waitForCompleti
on
SCHWERWIEGEND: Thread for task 2-b failed
org.springframework.dao.DataAccessResourceFailureException: StatementCallback; SQL [ALTER TABLE ONLY
 nodes ADD CONSTRAINT pk_nodes PRIMARY KEY (id)]; ERROR: out of memory
  Detail: Failed on request of size 536870912.; nested exception is org.postgresql.util.PSQLExceptio
n: ERROR: out of memory
  Detail: Failed on request of size 536870912.
        at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorC
odeSQLExceptionTranslator.java:253)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(Abstrac
tFallbackSQLExceptionTranslator.java:72)
        at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:406)
        at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:518)
        at org.springframework.jdbc.core.simple.SimpleJdbcTemplate.update(SimpleJdbcTemplate.java:24
8)
        at org.openstreetmap.osmosis.pgsnapshot.v0_6.impl.IndexManager.completeAfterLoad(IndexManage
r.java:130)
        at org.openstreetmap.osmosis.pgsnapshot.v0_6.impl.CopyFilesetLoader.run(CopyFilesetLoader.ja
va:111)
        at org.openstreetmap.osmosis.pgsnapshot.v0_6.PostgreSqlCopyWriter.complete(PostgreSqlCopyWri
ter.java:108)
        at org.openstreetmap.osmosis.core.progress.v0_6.EntityProgressLogger.complete(EntityProgress
Logger.java:61)
        at org.openstreetmap.osmosis.core.buffer.v0_6.EntityBuffer.run(EntityBuffer.java:77)
        at java.lang.Thread.run(Unknown Source)
Caused by: org.postgresql.util.PSQLException: ERROR: out of memory
  Detail: Failed on request of size 536870912.
        at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062
)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:
353)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:299
)
        at org.apache.commons.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:228)
        at org.apache.commons.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:228)
        at org.springframework.jdbc.core.JdbcTemplate$1UpdateStatementCallback.doInStatement(JdbcTem
plate.java:508)
        at org.springframework.jdbc.core.JdbcTemplate$1UpdateStatementCallback.doInStatement(JdbcTem
plate.java:1)
        at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:395)
        ... 8 more
07.02.2011 19:43:20 org.openstreetmap.osmosis.core.Osmosis main
SCHWERWIEGEND: Execution aborted.
org.openstreetmap.osmosis.core.OsmosisRuntimeException: One or more tasks failed.
        at org.openstreetmap.osmosis.core.pipeline.common.Pipeline.waitForCompletion(Pipeline.java:1
46)
        at org.openstreetmap.osmosis.core.Osmosis.run(Osmosis.java:92)
        at org.openstreetmap.osmosis.core.Osmosis.main(Osmosis.java:37)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launchStandard(Launcher.java:329)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:239)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
        at org.codehaus.classworlds.Launcher.main(Launcher.java:31)

c:\OSM\Osmosis>

Als zweiten Versuch habe nun zunächst mit --write-pgsql-dump die Daten in Textdateien geschrieben, das ging auch soweit durch. Dann scheiterte aber das Kopieren in die Datenbank:

c:\OSM\Data>psql -d osm_ger -f C:\OSM\Osmosis\osmosis-SNAPSHOT-r25162\script\pgsnapshot_load_0.6.sql


    ALTER TABLE
    ALTER TABLE
    ALTER TABLE
    ALTER TABLE
    ALTER TABLE
    DROP INDEX
    DROP INDEX
    DROP INDEX
    DROP INDEX
    DROP INDEX
              dropgeometrycolumn
    ---------------------------------------
     public.ways.bbox effectively removed.
    (1 row)

                 dropgeometrycolumn
    ---------------------------------------------
     public.ways.linestring effectively removed.
    (1 row)

    psql:C:/OSM/Osmosis/osmosis-SNAPSHOT-r25162/script/pgsnapshot_load_0.6.sql:146688457: NOTICE:  ALTER
     TABLE / ADD PRIMARY KEY will create implicit index "pk_nodes" for table "nodes"
    psql:C:/OSM/Osmosis/osmosis-SNAPSHOT-r25162/script/pgsnapshot_load_0.6.sql:146688457: ERROR:  out of
     memory
    DETAIL:  Failed on request of size 536870912.
    psql:C:/OSM/Osmosis/osmosis-SNAPSHOT-r25162/script/pgsnapshot_load_0.6.sql:146688458: NOTICE:  ALTER
     TABLE / ADD PRIMARY KEY will create implicit index "pk_ways" for table "ways"
    ALTER TABLE
    psql:C:/OSM/Osmosis/osmosis-SNAPSHOT-r25162/script/pgsnapshot_load_0.6.sql:146688459: NOTICE:  ALTER
     TABLE / ADD PRIMARY KEY will create implicit index "pk_way_nodes" for table "way_nodes"
    psql:C:/OSM/Osmosis/osmosis-SNAPSHOT-r25162/script/pgsnapshot_load_0.6.sql:146688459: ERROR:  out of
     memory
    DETAIL:  Failed on request of size 536870912.
    psql:C:/OSM/Osmosis/osmosis-SNAPSHOT-r25162/script/pgsnapshot_load_0.6.sql:146688460: NOTICE:  ALTER
     TABLE / ADD PRIMARY KEY will create implicit index "pk_relations" for table "relations"
    ALTER TABLE
    psql:C:/OSM/Osmosis/osmosis-SNAPSHOT-r25162/script/pgsnapshot_load_0.6.sql:146688461: NOTICE:  ALTER
     TABLE / ADD PRIMARY KEY will create implicit index "pk_relation_members" for table "relation_member
    s"
    ALTER TABLE
    CREATE INDEX
    psql:C:/OSM/Osmosis/osmosis-SNAPSHOT-r25162/script/pgsnapshot_load_0.6.sql:146688463: ERROR:  out of
     memory
    DETAIL:  Failed on request of size 536870912.
    CREATE INDEX
                    addgeometrycolumn
    --------------------------------------------------
     public.ways.bbox SRID:4326 TYPE:GEOMETRY DIMS:2
    (1 row)

                       addgeometrycolumn
    --------------------------------------------------------
     public.ways.linestring SRID:4326 TYPE:GEOMETRY DIMS:2
    (1 row)

    psql:C:/OSM/Osmosis/osmosis-SNAPSHOT-r25162/script/pgsnapshot_load_0.6.sql:146688476: ERROR:  out of
     memory
    DETAIL:  Failed on request of size 268435456.
    psql:C:/OSM/Osmosis/osmosis-SNAPSHOT-r25162/script/pgsnapshot_load_0.6.sql:146688484: ERROR:  out of
     memory
    DETAIL:  Failed on request of size 268435456.
    CREATE INDEX
    CREATE INDEX

Physiches RAM Sollte eigentlich genug vorhanden sein (12 GB). Wahrscheinlich hat PostgreSQL (Version 8.3.12, 32 Bit) aber ein Problem sich genug Speicher zu holen.

Soweit ich weiß gibt es aber für Windows nur PostgreSQL 9.0in der 64-Bit Version vorliegt, für welches es aber kein PostGIS gibt.

Gibt es sonst einen Trick?

Könnte man sonst die DB unter Linux erstellen und dann ins Windows-PostgreSQL kopieren? Käme die Windows-Version dann überhaupt mit der Datenbank klar, wenn man z.B. Diffs einspielt, oder ist das Kritische nur der Erstimport?

Christian

Also ich würde einmal probieren die 64 Bit Postgresinstalliation aufzusetzen und dann mit dem Stackbuilder Postgis zu installieren. Natürlich alles nur wenn du derzeit keine anderen wichtigen Daten in der Datenbank hast.

Ich bezweifle stark, daß es klappt; denn auf der Internetseite steht zu den Windows-Binaries:

und im ‘Experimental’-Bereich noch ausdrücklicher:

Christian

hi,
zwei Sachen sind mir aufgefallen:
a) bufferCapacity ist nur dann notwendig/sinnvoll, wenn du hier mit pipes arbeitest - tust du aber nicht, also raus damit.
b) irgenwo tief unten in dem osmosis-batch steht der eigentliche Aufruf von Osmosis. Im Endeffekt steht da “java -jar osmosis.jar …”
mach da mal irgendwie "java -Xmx512M -jar osmosis.jar … " draus.
das war bei meinem germany-import nicht notwendig (linux) aber dann haben wir java schonmal ausgeschlossen.

aber erstmal nur a.

null probleme. db unter linux (ubuntu 10.10 in virtueller maschine) erstellen, einen Full-Dump mit pg_dump erstellen und mit pg_restore einlesen.
Brauchst halt nur viel Platte.

Gruss
Walter

ps: abschliessend ubuntu real installieren und windows in eine vm auslagern :wink:

Das Ganze scheitert daran, daß ich das Datenverzeichnis von Postgres unter Ubuntu (in einer Virtual-Box-VM) nicht auf meiner Windows-Partirtion erstellen kann. initdb bricht immer ab.


erzeuge Konfigurationsdateien ... ok
erzeuge Datenbank template1 in /home/osm/osm/data/pg2/base/1 ... FATAL:  konnte Datei »pg_xlog/xlogtemp.1601« nicht nach »pg_xlog/000000010000000000000000« linken (Initialisierung von Logdatei 0, Segment 0): Operation not permitted

Ubuntu kann wohl keinen Link auf einem NTFS-Laufwerk erstellen. :frowning:

Kennt jemand einen Trick? Ansonsten muß ich wohl warten, bis es ein 64-Bit-Postgis für Windows gibt.

Christian

warum denn den Q…?
erstelle die DB komplett in der VM, dumpe sie und dann hast du ein einfaches ASCII-File, dass du ja wohl irgendwie nach Windows rüberschaufeln kannst.

geht dann über ntfs; zur Not mit FTP (samba unter Ubuntu ginge natürlich auch)

Versuchst du etwa, die DB im Binärformat unter Ubuntu zu erstellen und dann ganz “einfach” unter Windows zu benutzen? Dann lies dir bitte nochmal durch, was ich oben geschrieben habe.
Postgresql-DBs sind NICHT binärkompatibel, du musst immer Dump/Restore machen wenn du die Platform wechseln willst.

Gruss
Walter

Hallo!
Bin grade dabei ein osm file in eine postgis DB mit osmosis zu laden.
Jetzt bin ich aber daraufgekommen, das osmosis, automatisch die Daten immer in das public schema lädt.
Finde ich jetzt nicht so vorteilhaft wenn ich sie in ein anderes schema haben will!
Hat sich da jemand schon mal damit beschäftigt und gibts möglichkeiten das Ziel-Schema zu ändern?

hi,

welchen Typ von db willst du denn anlegen?
a) mit osm2pgsql - Schwerpunkt Rendern
b) “simple”-db mit hstore direkt mit osmosis

bei b kann ich dir sicher helfen, bei a sollte es aber ähnlich sein.

welche table die software wo anlegt, wird beim Erzeugen der Table bestimmt - reine postgresql-sache

gruss
walter

Hey, danke schon mal für die Antwort! :slight_smile:
Wenn, dann will ich es mit Variante b machen, also mit osmosis. Wenn die Daten nämlich in der PostGIS DB gespeichert sind, will ich daraus verschiedene Views erzeugen und über ArcSDE in ArcGIS darstellen.
Nachdem ich mit Osmosis ja schon ein Schema erzeugt habe gehe ich davon aus das es für diesen Zweck die bessere Variante wäre.

Die neueste Version von osmosis kann schon mal zwei Schemen:
http://wiki.openstreetmap.org/wiki/Osmosis/Detailed_Usage_0.40#PostGIS_Tasks_.28Snapshot_Schema.29
http://wiki.openstreetmap.org/wiki/Osmosis/Detailed_Usage_0.40#PostGIS_Tasks_.28Simple_Schema.29

Das erste ist vielleicht das, was du suchst.

BTW ist 0.39 die neueste Version, auch wenn das Wiki schon bei 0.40 ist.

Gruß,
ajoessen

ok,

dann mal los:

die scripte zum Anlegen der tabellen liegen in …/osmosis/script


walter@wno-server:/opt/programme/osmosis/osmosis-latest/script$ ls
contrib                             pgsql_simple_schema_0.6_linestring.sql
fix_line_endings.sh                 pgsql_simple_schema_0.6.sql
munin                               pgsql_simple_schema_0.6_upgrade_4-5.sql
pgsql_simple_load_0.6.sql           pgsql_simple_schema_0.6_upgrade_5-6.sql
pgsql_simple_schema_0.6_action.sql  pgsql_simple.txt
pgsql_simple_schema_0.6_bbox.sql    str.sql

müsste alles in pgsql_simple_schema_0.6.sql drinstehen. da werden die tabellen angelegt. etwas sql und die sache sollte klar sein.

gruss
walter

und für die Konkurrenz mit dem Fensterbetriebssystem:

%ProgramFiles%\PostgreSQL\8.4\bin\createdb -U postgres -E UTF8 -O osmuser osmosisdb
%ProgramFiles%\PostgreSQL\8.4\bin\createlang -U postgres plpgsql osmosisdb
%ProgramFiles%\PostgreSQL\8.4\bin\psql -U postgres -d osmosisdb -f “%ProgramFiles%\PostgreSQL\8.4\share\contrib\postgis-1.5\postgis.sql”
%ProgramFiles%\PostgreSQL\8.4\bin\psql -U postgres -d osmosisdb -f “%ProgramFiles%\PostgreSQL\8.4\share\contrib\postgis-1.5\spatial_ref_sys.sql”
%ProgramFiles%\PostgreSQL\8.4\bin\psql -U postgres -d osmosisdb -f “%ProgramFiles%\PostgreSQL\8.4\share\contrib_int.sql”
%ProgramFiles%\PostgreSQL\8.4\bin\psql -U postgres -d osmosisdb -f “%ProgramFiles%\PostgreSQL\8.4\share\contrib\hstore.sql”
%ProgramFiles%\PostgreSQL\8.4\bin\psql -U postgres -d osmosisdb -f “D:\Karten\OpenStreetMap\osmosis\script\pgsql_simple_schema_0.6.sql”
%ProgramFiles%\PostgreSQL\8.4\bin\psql -U postgres -d osmosisdb -f “D:\Karten\OpenStreetMap\osmosis\script\pgsql_simple_schema_0.6_action.sql”
%ProgramFiles%\PostgreSQL\8.4\bin\psql -U postgres -d osmosisdb -f “D:\Karten\OpenStreetMap\osmosis\script\pgsql_simple_schema_0.6_bbox.sql”
%ProgramFiles%\PostgreSQL\8.4\bin\psql -U postgres -d osmosisdb -f “D:\Karten\OpenStreetMap\osmosis\script\pgsql_simple_schema_0.6_linestring.sql”

ist jetzt noch das simple schema von osmosis 0.38.

Gruß,
ajoessen