File: expire.lua

package info (click to toggle)
osm2pgsql 2.1.1%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 6,652 kB
  • sloc: cpp: 59,934; python: 1,039; ansic: 763; sh: 25; makefile: 14
file content (165 lines) | stat: -rw-r--r-- 5,222 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
-- This config example file is released into the Public Domain.
--
-- This examples shows how to use tile expiry.

local expire_outputs = {}

expire_outputs.pois = osm2pgsql.define_expire_output({
    -- The zoom level at which we calculate the tiles. This must always be set.
    maxzoom = 14,
    -- The filename where tile list should be written to.
    filename = 'pois.tiles'
})

expire_outputs.lines = osm2pgsql.define_expire_output({
    maxzoom = 14,
    -- Instead of writing the tile list to a file, it can be written to a table.
    -- The table will be created if it isn't there already.
    table = 'lines_tiles',
--    schema = 'myschema', -- You can also set a database schema.
})

expire_outputs.polygons = osm2pgsql.define_expire_output({
    -- You can also set a minimum zoom level in addition to the maximum zoom
    -- level. Tiles in all zoom levels between those two will be written out.
    minzoom = 10,
    maxzoom = 14,
    table = 'polygons_tiles'
})

print("Expire outputs:(")
for name, eo in pairs(expire_outputs) do
    print("  " .. name
          .. ": minzoom=" .. eo:minzoom()
          .. " maxzoom=" .. eo:maxzoom()
          .. " filename=" .. eo:filename()
          .. " schema=" .. eo:schema()
          .. " table=" .. eo:table())
end
print(")")

local tables = {}

tables.pois = osm2pgsql.define_node_table('pois', {
    { column = 'tags', type = 'jsonb' },
    -- Zero, one or more expire outputs are referenced in an `expire` field in
    -- the definition of any geometry column using the Web Mercator (3857)
    -- projection.
    { column = 'geom', type = 'point', not_null = true, expire = { { output = expire_outputs.pois } } },
})

tables.lines = osm2pgsql.define_way_table('lines', {
    { column = 'tags', type = 'jsonb' },
    -- If you only have a single expire output and with the default
    -- parameters, you can specify it directly.
    { column = 'geom', type = 'linestring', not_null = true, expire = expire_outputs.lines },
})

tables.polygons = osm2pgsql.define_area_table('polygons', {
    { column = 'tags', type = 'jsonb' },
    -- In this configuration the `mode` of the expiry is set to `boundary-only`.
    -- Other modes are `full-area` (default) and `hybrid`. If set to `hybrid`
    -- you can set `full_area_limit` to a value in Web Mercator units. For
    -- polygons where the width and height of the bounding box is below this
    -- limit the full area is expired, for larger polygons only the boundary.
    -- This setting doesn't have any effect on point or linestring geometries.
    { column = 'geom', type = 'geometry', not_null = true, expire = {
        { output = expire_outputs.polygons, mode = 'boundary-only' }
    }}
})

tables.boundaries = osm2pgsql.define_relation_table('boundaries', {
    { column = 'type', type = 'text' },
    { column = 'tags', type = 'jsonb' },
    -- This geometry column doesn't have an `expire` field, so no expiry is
    -- done.
    { column = 'geom', type = 'multilinestring', not_null = true },
})

print("Tables:(")
for name, ts in pairs(tables) do
    print("  " .. name .. ": name=" .. ts:name() .. " (" .. tostring(ts) .. ")")
end
print(")")

-- Helper function that looks at the tags and decides if this is possibly
-- an area.
local function has_area_tags(tags)
    if tags.area == 'yes' then
        return true
    end
    if tags.area == 'no' then
        return false
    end

    return tags.aeroway
        or tags.amenity
        or tags.building
        or tags.harbour
        or tags.historic
        or tags.landuse
        or tags.leisure
        or tags.man_made
        or tags.military
        or tags.natural
        or tags.office
        or tags.place
        or tags.power
        or tags.public_transport
        or tags.shop
        or tags.sport
        or tags.tourism
        or tags.water
        or tags.waterway
        or tags.wetland
        or tags['abandoned:aeroway']
        or tags['abandoned:amenity']
        or tags['abandoned:building']
        or tags['abandoned:landuse']
        or tags['abandoned:power']
        or tags['area:highway']
end

function osm2pgsql.process_node(object)
    tables.pois:insert({
        tags = object.tags,
        geom = object:as_point()
    })
end

function osm2pgsql.process_way(object)
    if object.is_closed and has_area_tags(object.tags) then
        tables.polygons:insert({
            tags = object.tags,
            geom = object:as_polygon()
        })
    else
        tables.lines:insert({
            tags = object.tags,
            geom = object:as_linestring()
        })
    end
end

function osm2pgsql.process_relation(object)
    local relation_type = object:grab_tag('type')

    -- Store boundary relations as multilinestrings
    if relation_type == 'boundary' then
        tables.boundaries:insert({
            type = object:grab_tag('boundary'),
            tags = object.tags,
            geom = object:as_multilinestring():line_merge()
        })
        return
    end

    -- Store multipolygon relations as polygons
    if relation_type == 'multipolygon' then
        tables.polygons:insert({
            tags = object.tags,
            geom = object:as_multipolygon()
        })
    end
end