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