[imposm3] Mapping-Definition

Ich spiel grad mit imposm3 als angedachten Ersatz für osm2pgsql, hauptsächlich wegen der unglaublichen Geschwindigkeit beim Verarbeiten von Changesets von imposm3 rum. OSMSuspects ist von der Laufzeit her einfach viel zu langsam, das möchte ich mittelfristig ändern.

Leider hänge ich jetzt etwas beim Mapping. Ich würde gerne u.a. Mapping um eine Spalte “poi” ergänzen, in der eines der values der tags “amenity”, “shop”, “tourism” (u.a.) übernommen wird. Wenn mehrere tags an dem Objekt hängen, ist es egal, welches dann genommen wird, es ist auch egal, wenn keines dieser tags vorhanden ist, dann kommt halt “” in die Spalte rein.

Leider fehlt mir da der Durchblick. Wenn mir jemand auf die Sprünge helfen könnte?


        "lookup_address": {
            "columns": [
                {
                    "type": "id",
                    "name": "osm_id",
                    "key": null
                },
                {
                    "type": "geometry",
                    "name": "geometry",
                    "key": null
                },
                {
                    "type": "mapping_value",
                    "name": "addr:housenumber",
                    "key": null
                },
                {
                    "type": "string",
                    "name": "addr:housename",
                    "key": "addr:housename"
                },
                {
                    "type": "string",
                    "name": "addr:street",
                    "key": "addr:street"
                },
                {
                    "type": "string",
                    "name": "addr:postcode",
                    "key": "addr:postcode"
                },
                {
                    "type": "string",
                    "name": "addr:city",
                    "key": "addr:city"
                },
                {
                    "type": "string",
                    "name": "addr:suburb",
                    "key": "addr:suburb"
                },
                {
                    "type": "string",
                    "name": "addr:place",
                    "key": "addr:place"
                },
                {
                    "type": "string",
                    "name": "addr:hamlet",
                    "key": "addr:hamlet"
                },
                {
                    "type": "string",
                    "name": "addr:country",
                    "key": "addr:country"
                }
            ],
            "type": "geometry",
            "type_mappings": {
                "points": {
                    "addr:housenumber": ["__any__"]
                },
                "polygons": {
                    "addr:housenumber": ["__any__"]
                }
            },
            "filter": {
                "require":  {
                    "addr:housenumber": ["__any__"]
                }
            }
        }

Was soll in der Spalte “poi” dann als Inhalt drin stehen?
a) die Tagnamen, wie “amenity”, “shop”, “tourism”
b) die Taginhalte, wie “parking”, “bakery”, “guidepost”
Grüße
Andreas

b) hätte ich gerne.

Ich glaube das geht in Richtung “mapping_value” siehe https://imposm.org/docs/imposm3/latest/mapping.html

So in etwa (habs nicht getestet)


tables:
  pois_table:
    type: point
    mapping:
      'amenity': [__any__]
      'tourism': [__any__]
      'shop': [__any__]
    columns:
    - name: osm_id
      type: id
    - name: way
      type: geometry
    - name: poi
      type: mapping_value

Danke. Leider ist type:mapping_value in der Definition oben schon belegt:

{
  "type": "mapping_value",
  "name": "addr:housenumber",
  "key": null
},

weil ich die Polygone und Points ja zusammen in eine Spalte “geometry” werfe. Das soll auch so bleiben.
Ich glaube, das ist recht tricky… Ich probiers morgen mal aus.

Sorry, Hatte ich übersehen, dass du “mapping_value” schon verwendest :frowning:

Geht das in die gewünschte Richtung?


tables:
  pois_table:
    type: geometry
    type_mappings:
      points:
        'amenity': [__any__]
        'tourism': [__any__]
        'shop': [__any__]
      polygons:
        'amenity': [__any__]
        'tourism': [__any__]
        'shop': [__any__]
    filters:
      require:
         "addr:housenumber": [__any__]
    columns:
    - name: osm_id
      type: id
    - name: poi
      type: mapping_value
    - name: "addr:housenumber"
      key: "addr:housenumber"
      type: string

Fast. So bekomme ich nur Objekte, die amenity, tourism oder shop sind. Kein amenity/tourism/shop am Objekt > Datensatz wird nicht übernommen.

Ziel soll sein, alle Objekte mit addr:housenumber in der Tabelle zu haben, unabhängig von anderen Tags. Wenn amenity, tourism und/oder shop an diesem Objekt vorhanden sind, möchte ich einen dieser Werte (wenn mehrere vorhanden sind wie amenity und shop, ist es egal welcher) in einer Spalte mitführen.

Ich glaube so langsam, dass das so gar nicht zu realisieren ist.

Ah, jetzt glaube ich, dass ich kapiere, was du möchtest. Zumindest in einem einzelnen Schritt und mit einer einzigen Tabelle wird das vermutlich nicht möglich sein. Du könntest aber erst mal mit deiner ursprünglichen Abfrage alle Objekte mit “addr:housenumber” ermitteln und die Spalten für ‘amenity’, ‘tourism’, ‘shop’,… in dieser Tabelle speichern und in einem zweiten, separaten Schritt nach dem imposm-Import, z.B. per psql, könntest du eine weitere Tabellenspalte “poi” einfügen und per SQL-Update die “poi”-Spalte aufgrund ‘amenity’, ‘tourism’, ‘shop’,… setzen.

Genau, sorry, wenn ich mich unklar ausgedrückt hatte. Diesen nachgelagerten Schritt mit dem Update wollte ich eigentlich vermeiden. Dann arbeite ich halt mit Einzelspalten.

Ansonsten eigentlich ein tolles Tool, Ecken (Import vom timestamp) und Kanten (typemapping und mapping zusammen oder die Doku) gibts halt überall…

Edit: Das wichtigste vergessen: Danke für deine Mühen.