Europa Extrahieren in die Datenbank

Hallo,

ich will Europa in eine Postgresql Importieren. Ich habe gesehen das man bei geofabrik PBF Dateien runterladen kann und dann mit Osmosis verschiedene Daten extrahieren.

Und genau da komme ich jetzt nicht weiter. Ich habe z.B. mit erstmal nur Deutschland geladen: germany-latest.osm.pbf
Ich würde jetzt gerne, ab Bundesländer bis Städte die in eine Postgresql Datenbank laden. Und zwar würde ich gerne auch eine Hierarchy in der Datenbank aufbauen. Hier ein Beispiel:

Wichtig dabei ist admin_level und der rpath, So weiß ich dann per SQL das Bielefeld in Regierungsbezirk Detmold ist.

Mit welchem Befehl kriege ich die Daten so raus?

Siehe hier: https://switch2osm.org/serving-tiles/manually-building-a-tile-server-20-04-lts/

PS: Was soll dein Screenshot aussagen?

Also auf jeden Fall osm2pgsql statt osmosis für den Import nehmen, wie toc-rox schon gesagt hat. Wenn Du nur die Grenzen brauchst und sonst nichts, dann kannst Du auch das “style-File” von osm2pgsql anpassen, so dass nicht alle Gebäude usw. auch importiert werden. Danach musst du mit Postgresql-Geometrieoperationen arbeiten, zum Beispiel könntest Du wie folgt erstmal die Grenzen in eine separate Tabelle ziehen:


SELECT osm_id,name,admin_level,way
INTO grenzen 
FROM planet_osm_polygon 
WHERE boundary='administrative';

Index erstellen, damit es keine drei Tage rechnet:


CREATE INDEX grenzen_geom ON grenzen USING GIST(way);

und unter der Annahme, dass Dein “rpath” einfach eine durch Kommata getrennte Liste aller darüberliegenden Verwaltungseinheiten ist

ALTER TABLE grenzen ADD COLUMN rpath VARCHAR(255);
UPDATE grenzen a
SET rpath = (
   SELECT string_agg(b.name, ',' ORDER BY admin_level desc) 
   FROM grenzen b 
   WHERE st_contains(b.way, a.way) 
   AND a.admin_level::integer > b.admin_level::integer
);

Sorry war ein falsches Screenshot drin :frowning:

Leider sind im rpath die Namen drin, ich brauche Komma separiert die Id’s. Und warum ist die osm_id negativ? Hat das ein Grund?
Des Weiteren zeigt er mir way als POLYGON. Ich brauche aber von der Stadt die Latitude und Longitude. Kriege ich diese auch irgendwie raus?

Als Befehl nutze ich: osm2pgsql -d gis --create --slim -G --hstore --tag-transform-script ~/src/openstreetmap-carto/openstreetmap-carto.lua -C 2500 --number-processes 6 -S ~/src/openstreetmap-carto/openstreetmap-carto.style ~/data/azerbaijan-latest.osm.pbf

Wenn ein zusätzlicher Node gesetzt ist, wären das die gesuchten Wert. Ansonsten muss du eine fiktive Stadtmitte (wenn es das ist was du suchst) errechnen.

Zuerst mal eine mMn wichtige Sache:

Trenne den Import der Rohdaten mittels osm2gpsql von deren weiteren Verwendung. D.h ändere so wenig wie möglich am Style-File und mach alle Umwandlungen später.
Du wirst immer wieder in die Situation kommen, dass dir Datenfelder in dem Import fehlen, da du sie vorher einfach nicht für wichtig gehalten hast. Und dann du mußt das Style-File ändern und von vorne anfangen (:

Muttu halt die PostGIS-Befehle anpassen.

Ja, alles hat hier seinen Grund :wink:

Beim Import mit osm2pgsql werden aus Ways (genauer gesagt, geschlossenen Ways) Polygone. Und aus Relationen, die geschlossene Flächen definieren (Z. B. Grenzen) werden auch Polygone. Um diese voneinander zu unterscheiden, werden die Ids von Polygonen, die aus Relationen stammen, negativ gesetzt.

schau mal hier: http://postgis.net/docs/manual-2.0/reference.html
im Kapitel http://postgis.net/docs/manual-2.0/reference.html#Spatial_Relationships_Measurements gibt es
ST_Centroid(geom) bzw noch besser ST_PointOnSurface(geom)

Das ist erstmal ok, ich würde aber noch was für die Tags tun. Ich verwende da noch --hstore-all --extra-attributes
Dafür musst du aber noch mit psql 1x “create extension hstore;” eingeben, damit die Hstores auch erstellt werden können.

Gruss
walter

Vielen Dank euch schon mal. Ich glaube ich komme langsam der Sache näher.
postgis ist ein Addon für postgresql um die ganzen Maps Sachen Berechnungen zu machen.

Ich habe jetzt folgendes gemacht:

SELECT poly.osm_id,poly.name,poly.admin_level,
ST_X(ST_CENTROID(poly.way))  AS long,
ST_Y(ST_CENTROID(poly.way)) AS lat
FROM planet_osm_polygon poly
WHERE poly.boundary='administrative' and poly.name = 'Bielefeld';

Ich kriege das zurück:

-62646 Bielefeld 6 950765.0610361845 6802113.144173126

Wie kann ich die Koordinaten jetzt in “echte” Lat und Lon umwandeln? Das die in der nähe wenigsten von den oben im Screenshot sind.

Ich glaube ich habe es rausgefunden:

3

Result:

-62646 Bielefeld 6 950765.0610361845 6802113.144173126 8.540869582538368 52.010914803896334

Was ist das 4326? Irgendeine Norm?

https://de.wikipedia.org/wiki/SRID
https://spatialreference.org/ref/epsg/4326/

Ich habe ja germany-latest.osm.pbf importiert. Wenn ich jetzt Europa importieren will, muss ich die vorhanden Tabelle leeren/löschen? Ich kann ich einfach Europa importieren und für Deutschland sind die Einträge dann nicht doppelt drin?

Und wie sieht es mit Mehrsprachigkeit aus was die Städte und Länder Namen angeht? Kriegt man irgendwie auch Informationen raus?

Nö, die Option “-c” bei osm2pgsql legt immer neue OSM-Tabellen an.
Und wenn du beides parallel haben willst, nimmst du halt einen anderen Prefix.

Klaro, schau dir mal tags->‘name:xxx’ an (ich hoffe, du hast Hstore inzwischen aktiviert. Wenn nicht: aber dalli ;))

Abfrage der Namen, die mit name:xxx getaggt wurden, ist natürlich auch möglich, ist aber net einfach.

Gruss
walter


select osm_id,key,value
  from (
       select osm_id,(each(tags)).*          -- hier macht EACH die Arbeit
         from osm_gf_point
       ) foo
 where key like 'name:%' 
limit 10;
   osm_id   |   key    |               value               
------------+----------+-----------------------------------
 3655507170 | name:BVG | Potsdam, Johannes-Kepler-Platz
  544731043 | name:BVG | Potsdam, Johannes-Kepler-Platz
 5392792074 | name:BVG | Potsdam, Stern-Center/Nuthestraße
 5392792075 | name:BVG | Potsdam, Johannes-Kepler-Platz
 3880837801 | name:BVG | Potsdam, Stern-Center/Nuthestraße
 3553632163 | name:BVG | Potsdam, Stern-Center/Nuthestraße
 5678263852 | name:BVG | Potsdam, Johannes-Kepler-Platz
 3642430487 | name:BVG | Potsdam, Lilienthalstraße
 1259873951 | name:BVG | Potsdam, Jagdhausstraße
 1416616496 | name:BVG | Potsdam, Chopinstraße
(10 rows)

Time: 51,750 ms