mirror of
https://github.com/osm2pgsql-dev/osm2pgsql.git
synced 2026-01-17 13:31:07 +00:00
In two-stage processing when getting nodes from the middle we are running the same SQL query as when getting the node locations. But that doesn't work. We need more information, the tags (and possibly the attributes). This fixes this by running a different prepared query in this case. Fixes #2298
87 lines
2.2 KiB
Lua
87 lines
2.2 KiB
Lua
|
|
local tables = {}
|
|
|
|
tables.t1 = osm2pgsql.define_node_table('osm2pgsql_test_t1', {
|
|
{ column = 'tags', type = 'hstore' },
|
|
{ column = 'geom', type = 'point', not_null = true },
|
|
})
|
|
|
|
tables.t2 = osm2pgsql.define_node_table('osm2pgsql_test_t2', {
|
|
{ column = 'tags', type = 'hstore' },
|
|
{ column = 'rel_ids', type = 'text' },
|
|
{ column = 'geom', type = 'point', not_null = true },
|
|
})
|
|
|
|
tables.tboth = osm2pgsql.define_node_table('osm2pgsql_test_tboth', {
|
|
{ column = 'tags', type = 'hstore' },
|
|
{ column = 'rel_ids', type = 'text' },
|
|
{ column = 'geom', type = 'point', not_null = true },
|
|
})
|
|
|
|
local n2r = {}
|
|
|
|
local function get_ids(data)
|
|
if data then
|
|
local ids = {}
|
|
for rel_id, _ in pairs(data) do
|
|
ids[#ids + 1] = rel_id
|
|
end
|
|
table.sort(ids)
|
|
return '{' .. table.concat(ids, ',') .. '}'
|
|
end
|
|
end
|
|
|
|
function osm2pgsql.process_node(object)
|
|
if object.tags.t1 then
|
|
tables.t1:insert{
|
|
tags = object.tags,
|
|
geom = object:as_point()
|
|
}
|
|
end
|
|
|
|
if osm2pgsql.stage == 2 and object.tags.t2 then
|
|
local ids = get_ids(n2r[object.id])
|
|
if ids then
|
|
tables.t2:insert{
|
|
rel_ids = ids,
|
|
geom = object:as_point()
|
|
}
|
|
end
|
|
end
|
|
|
|
if object.tags.tboth then
|
|
local ids = get_ids(n2r[object.id])
|
|
tables.tboth:insert{
|
|
tags = object.tags,
|
|
rel_ids = ids,
|
|
geom = object:as_point()
|
|
}
|
|
end
|
|
end
|
|
|
|
local function node_member_ids(relation)
|
|
local ids = {}
|
|
for _, member in ipairs(relation.members) do
|
|
if member.type == 'n' and member.role == 'mark' then
|
|
ids[#ids + 1] = member.ref
|
|
end
|
|
end
|
|
return ids
|
|
end
|
|
|
|
function osm2pgsql.select_relation_members(relation)
|
|
return { nodes = node_member_ids(relation) }
|
|
end
|
|
|
|
function osm2pgsql.process_relation(object)
|
|
for _, member in ipairs(object.members) do
|
|
if member.type == 'n' and member.role == 'mark' then
|
|
if not n2r[member.ref] then
|
|
n2r[member.ref] = {}
|
|
end
|
|
n2r[member.ref][object.id] = true
|
|
end
|
|
end
|
|
end
|
|
|