SQL-Anfrage für Elemente einer Stadt

Hallo zusammen,

ich habe mich schon ein wenig durchs Wiki und durchs Forum gelesen, aber leider keine wirklichen Hinweise auf das gefunden was ich suche.
Ich habe mir einen Teil der OSM-Daten (NRW) in eine lokale PostgreSQL/PostGIS-DB importiert und möchte nun per SQL-Anfrage z.B. alle Straßen oder alle Parkplätze einer Stadt finden. Die Suche nach dem Element an sich über die Tags ist dabei weniger das Problem, als die Suche auf die Stadt einzugrenzen.
Wie kann ich also eine solche SQL-Anfrage auf eine Stadt, z.B. Köln eingrenzen?
Geht das evtl. über Ortsgrenz-Koordinaten?

Ich würde mich über jede Hilfe oder Links zum Thema freuen.

Viele Grüße!
Tobi

hi toby,

willkommen im klub,

das wird z.b. bei osmosis (ein tool zum verarbeiten von osm-daten) mit den sogn. polygonen gemacht. das ist ein poly-file, das man aus den grenzen einer stadt generieren kann. schau mal bei osmosis im wiki rein.

nicht dass du das mit osmosis macht - das ist der falsche tool für dich.

ist hier aber erstmal nur zum reinschauen gedacht, da du ja an deine datenbank ranwillst. dort wird das aber ebenso mit den poly-files gemacht. mehr weiss ich selber noch nicht aber dann hast du schon mal was zum “reindenken”. einen tool zum umwandlung von grenz-relationen in poly-files gibt es natürlich auch - aber wo, ist mir derzeit entfallen.

die kollegen helfen dir (und mir) dann sicher weiter.

wambacher

Danke schon mal für die Antwort.
So richtig weiter bringt mich das aber auch noch nicht.
Kann man nicht vielleicht über eine Relation wie z.B. http://www.openstreetmap.org/browse/relation/62539 alle Parkplätze innerhalb dieses Bereiches herausfinden?
Ich wäre für jeden Hinweis oder Link dankbar.

hi,

nochmal zur klarstellung:

relationen in osm sind nicht zu vergleichen mit ähnlichen konstrukten in datenbanken (index).

es gibt daher PER DEFINITION keine relation, die objekte mit gleichen eigenschaften (z.b. relation=liste aller parkplätze) zusammenfassen - daher kannst du die hier auch nicht verwenden.

wenn du was aus der db rausfiltern willst, mußt du im ersten schritt sagen, welchen geographischen bereich du haben willst. das geht ueber verschiedene mehoden (z.b. BBOX bounding box mit eck-koordinaten des zielgebietes oder über die sache mit den poly-files)

verfahren 1 ist einfach, schnell und “unscharf” - verfahren 2 ist schwieriger, etwas langsamer und “messerkanten-scharf”. poly-files sind extrem wichtig bei auswertungen für bereiche mit komplizierten konturen (staedte, länder)

im 2 schritt sagst du dann, WELCHE objekte du haben willst - über die tags.

gruss

wambacher

p.s. manche packen immer noch objekte in relationen, olbwohl das nicht sein soll. das ist aber ein andres thema.

@wambacher: Kann man die Elemente innerhalb eines poly-files direkt aus der Datenbank abrufen?
Wenn ja, bitte eine kurze Anleitung.
Bisher hab ich immer eine BBOX bounding box abgeholt und dann mit OSMOSIS auf das poly-files zugeschnitten.

Ich kann dir nicht wirklich helfen, da ich die Syntax fuer die postgis SQL nicht kenne. Aber ich kann dir sagen das es gehen sollte. Osm2Pgsql legt objekte die eine korrekte geschlossene Flaeche bilden, wie z.B. die boundary=administrative relation von Duesseldorf (vorausgesetzt die Daten sind korrekt), als postgis polygon objecte in der planet_osm_polygon Tabelle der datenbank ab.

Es sollte also so etwas wie “Select A.* from planet_osm_point as A, planet_osm_polygon as B where A.way isin B.way and B.name == Duesseldorf” machbar sein, wobei das offensichtlich die falsche syntax ist. Die Postgis documentation sollte aber hoffentlich weiter helfen.

hi fx99,

amm hat es unten schon sehr gut “angedeutet”. das entspricht in etwa auch meinem wissensstand.

ich hab von ca 2 wochen in talk-de für ein neues projekt nachgefragt

→ “incremental update einer osm sql-database - geht das?”

hier ein auszug von florians antwort:

"… Das kann postgis schneller … Dafuer muss man sich
nen bischen mit sql auseinandersetzen und den poly als multipolygon
in der Datenbank ablegen.

Wenn es aber darum geht bestimmte elemente in dem ausschnitt
zu identifizieren dann geht das in der postgis effizienter und schneller. "

weiter bin ich auch noch nicht, aber das sollte fuer alle der richtige weg sein.

gruss

wambacher

Danke an amm und wambacher, das hat mich dann letztendlich doch drauf gebracht.
Ich muß mir die zurückgelieferten Tupel jetzt zwar nochmal genauer ansehen, aber anscheinend ist es mittels “select A.* from planet_osm_point as A, planet_osm_polygon as B where ST_Intersects(A.way,B.way) and B.name=‘Düsseldorf’;” möglich. :slight_smile:

Hallo Tobi,

ich habe hier noch einen nicht ganz uninteressanten Link von Oracle
Da gibt es einige Beispiele, vor allen Dingen jede Menge Script. Eventuell hilft dir das weiter.
Georg

thanks georg,

klasse link. werde die brüder jetzt wieder öfters ins auge nehmen :slight_smile:

die meissten tun sich ja mit oracle etwas schwer, da die ja “nur” high-end-datenbanken machen, die sich ja keiner leisten kann (osm erst recht nicht). die “brüder” haben aber vor einigen monaten SUN übernommen und betreuen jetzt einige “kleinere” softwareprodukte, die man doch irgendwie kennt:

von sun kan: MYSQL, OpenOffice, java, OpenSolaris und noch noch so andere “kleinigkeiten” aus der opensource-ecke. und oracle macht da fleißig weiter :slight_smile:

dass die “brüder” aber in der geo-szene auch mitmischen, ist höchst interessant.

gruss

wambacher

p.s. das soll jetzt kein appell sein, osm auf mysql umzukrempeln sondern dass man mal wieder über den tellerrand blickt

Ich denke auch das sie die Zeichen der Zeit erkannt haben (Open Source) denn immerhin findet sich unter den Punkten 6 und 7 OpenStreetMap. :slight_smile:
Georg