Jep, und den Admin-Level müsstest anpassen, je nachdem, ob Du Kreise, Kreisfreie Städte, Gemeinden… suchst. Ich hab hier kein Kassel, aber z.B. Starnberg gibt es mehrfach, als Kreis, als Stadt und als See(?):
osm=> select ST_AsText(ST_Transform(ST_PointOnSurface(way),4326)),name, admin_level,boundary from osm_polygon WHERE admin_level = '6' AND name Like '%Starnberg%';
st_astext | name | admin_level | boundary
-----------------------------------------+-----------+-------------+----------------
POINT(11.2904976148817 47.978756976312) | Starnberg | 6 | administrative
(1 row)
osm=> select ST_AsText(ST_Transform(ST_PointOnSurface(way),4326)),name, admin_level,boundary from osm_polygon WHERE admin_level = '8' AND name Like '%Starnberg%';
st_astext | name | admin_level | boundary
------------------------------------------+-----------------+-------------+----------------
POINT(11.3355299176134 48.0063018366477) | Starnberg | 8 | administrative
POINT(11.3085309744874 47.9094240771543) | Starnberger See | 8 | administrative
(2 rows)
Jo. Bezirke, und Orte wahlweise als Polygon mit boundary=administrative und admin_level wie oben oder als Node mit place=city/town:
select ST_AsText(ST_Transform(way,4326)),name,place from osm_point where place is not null and name='Starnberg';
st_astext | name | place
------------------------------------------+-----------+-------
POINT(11.3499952984201 48.0000033948902) | Starnberg | town
(1 row)
Strassen in line (oder vielleicht manchmal in Polygon, falls es Plätze sind):
osm=> select ST_AsText(ST_Transform(ST_PointOnSurface(way),4326)),name,highway from osm_line where name like '%Weg' limit 2;
st_astext | name | highway
------------------------------------------+-----------------+-------------
POINT(11.4622591327655 47.2904587764759) | Thaurer Weg | track
POINT(10.4540800690612 47.9813705644259) | Lichtenauer Weg | residential
(2 rows)
Postleitzahlen hängen oft an Hausnummern (in node oder in polygon am Gebäudeumriss) oder sie gibts in Polygonen mit den Postleitzahlengrenzen:
osm=> select ST_AsText(ST_Transform(way,4326)),tags->'addr:street' as strasse from osm_point where tags->'addr:postcode'='80801' limit 2;
st_astext | strasse
------------------------------------------+--------------------
POINT(11.5850942983874 48.1594083948839) | Hohenzollernstraße
POINT(11.5849299983874 48.1594452948839) | Hohenzollernstraße
(2 rows)
osm=> select (point(centroid(way))) as mittelpunkt,tags->'postal_code' as plz from osm_polygon where boundary='postal_code' limit 3;
mittelpunkt | plz
---------------------------+-------
(1185629.4375,6154102.25) | 86850
(1183396.9375,6144518.75) | 86866
(1185854.3125,6182498.25) | 86465
Als Kombination daraus z.B. Straßen(stücke) mit “x” in Starnberg:
osm=> select name from osm_line where highway='residential' and name like '%x%' and exists (select way from osm_polygon where admin_level = '8' and name like '%Starnberg%' and st_contains(osm_polygon.way,osm_line.way));
name
-----------------------
Felixweg
Waxensteinstraße
Nixenweg
Max-Josef-Park
Max-Zimmermann-Straße
Max-Emanuel-Straße
Max-Emanuel-Straße
Maximilianstraße
Waxensteinstraße
(9 rows)
Das dauert übrigens ewig, “st_contains” ist recht aufwändig zu rechnen. Ein Optimierungsansatz wäre, erstmal nur Straßen mit ‘x’ im 10x10km-Rechteck um die Ortsmitte von Starnberg auszuwählen (das geht schnell, weil dafür hat “way” seinen spatial index bekommen). Und man sieht schön, dass es mehrere “Max-Emanuel-Straße” gibt. Das sind alles Stücke einer grossen geteilten Straße.
Die Daten sind vermutlich schon die richtigen, aber es gibt verschiedene Arten, seine DB zu organisieren. Alles was ich hier getippt hab bezog sich auf osm2pgsql mit hstore. SunCobalt hat wohl ungefähr die gleiche wie ich, nur dass er seine Daten in lat/lon speichert, ich in mercator (was aber hier keinen Unterschied macht, man muss nur irgendwo umrechnen).
Was willst eigentlich machen? Ortspläne haben üblicherweise einmalig vorher ausgewertete Straßenlisten mit hinterlegtem Punkt zum hinzoomen. Eine Quiz für die Ortskundeprüfung müsste nicht nach PLZ prüfen und hätte keine “Ortsmittelpunkte”, für die Adresssuche müsstest nicht die Koordinate ausgeben…
Grüße, Max