mirror of
https://github.com/osm2pgsql-dev/osm2pgsql.git
synced 2025-07-24 07:29:01 +00:00

And updates various docs accordingly. For a while we haven't kept any docs in there other than the man pages. The new name better reflects what this directory is all about.
264 lines
7.3 KiB
Lua
264 lines
7.3 KiB
Lua
-- For documentation of Lua tag transformations see
|
|
-- https://osm2pgsql.org/doc/manual.html#the-pgsql-output
|
|
|
|
-- Objects with any of the following keys will be treated as polygon
|
|
polygon_keys = {
|
|
'aeroway',
|
|
'amenity',
|
|
'building',
|
|
'harbour',
|
|
'historic',
|
|
'landuse',
|
|
'leisure',
|
|
'man_made',
|
|
'military',
|
|
'natural',
|
|
'office',
|
|
'place',
|
|
'power',
|
|
'public_transport',
|
|
'shop',
|
|
'sport',
|
|
'tourism',
|
|
'water',
|
|
'waterway',
|
|
'wetland'
|
|
}
|
|
|
|
-- Objects without any of the following keys will be deleted
|
|
generic_keys = {
|
|
'access',
|
|
'addr:housename',
|
|
'addr:housenumber',
|
|
'addr:interpolation',
|
|
'admin_level',
|
|
'aerialway',
|
|
'aeroway',
|
|
'amenity',
|
|
'area',
|
|
'barrier',
|
|
'bicycle',
|
|
'boundary',
|
|
'brand',
|
|
'bridge',
|
|
'building',
|
|
'capital',
|
|
'construction',
|
|
'covered',
|
|
'culvert',
|
|
'cutting',
|
|
'denomination',
|
|
'disused',
|
|
'ele',
|
|
'embarkment',
|
|
'foot',
|
|
'generation:source',
|
|
'harbour',
|
|
'highway',
|
|
'historic',
|
|
'hours',
|
|
'intermittent',
|
|
'junction',
|
|
'landuse',
|
|
'layer',
|
|
'leisure',
|
|
'lock',
|
|
'man_made',
|
|
'military',
|
|
'motor_car',
|
|
'name',
|
|
'natural',
|
|
'office',
|
|
'oneway',
|
|
'operator',
|
|
'place',
|
|
'population',
|
|
'power',
|
|
'power_source',
|
|
'public_transport',
|
|
'railway',
|
|
'ref',
|
|
'religion',
|
|
'route',
|
|
'service',
|
|
'shop',
|
|
'sport',
|
|
'surface',
|
|
'toll',
|
|
'tourism',
|
|
'tower:type',
|
|
'tracktype',
|
|
'tunnel',
|
|
'type',
|
|
'water',
|
|
'waterway',
|
|
'wetland',
|
|
'width',
|
|
'wood'
|
|
}
|
|
|
|
-- The following keys will be deleted
|
|
delete_tags = {
|
|
'FIXME',
|
|
'note',
|
|
'source'
|
|
}
|
|
|
|
-- Array used to specify z_order per key/value combination.
|
|
-- Each element has the form {key, value, z_order, is_road}.
|
|
-- If is_road=1, the object will be added to planet_osm_roads.
|
|
zordering_tags = {{ 'railway', nil, 5, 1}, { 'boundary', 'administrative', 0, 1},
|
|
{ 'bridge', 'yes', 10, 0 }, { 'bridge', 'true', 10, 0 }, { 'bridge', 1, 10, 0 },
|
|
{ 'tunnel', 'yes', -10, 0}, { 'tunnel', 'true', -10, 0}, { 'tunnel', 1, -10, 0},
|
|
{ 'highway', 'minor', 3, 0}, { 'highway', 'road', 3, 0 }, { 'highway', 'unclassified', 3, 0 },
|
|
{ 'highway', 'residential', 3, 0 }, { 'highway', 'tertiary_link', 4, 0}, { 'highway', 'tertiary', 4, 0},
|
|
{ 'highway', 'secondary_link', 6, 1}, { 'highway', 'secondary', 6, 1},
|
|
{ 'highway', 'primary_link', 7, 1}, { 'highway', 'primary', 7, 1},
|
|
{ 'highway', 'trunk_link', 8, 1}, { 'highway', 'trunk', 8, 1},
|
|
{ 'highway', 'motorway_link', 9, 1}, { 'highway', 'motorway', 9, 1},
|
|
}
|
|
|
|
function add_z_order(keyvalues)
|
|
-- The default z_order is 0
|
|
z_order = 0
|
|
|
|
-- Add the value of the layer key times 10 to z_order
|
|
if (keyvalues["layer"] ~= nil and tonumber(keyvalues["layer"])) then
|
|
z_order = 10*keyvalues["layer"]
|
|
end
|
|
|
|
-- Increase or decrease z_order based on the specific key/value combination as specified in zordering_tags
|
|
for i,k in ipairs(zordering_tags) do
|
|
-- If the value in zordering_tags is specified, match key and value. Otherwise, match key only.
|
|
if ((k[2] and keyvalues[k[1]] == k[2]) or (k[2] == nil and keyvalues[k[1]] ~= nil)) then
|
|
-- If the fourth component of the element of zordering_tags is 1, add the object to planet_osm_roads
|
|
if (k[4] == 1) then
|
|
roads = 1
|
|
end
|
|
z_order = z_order + k[3]
|
|
end
|
|
end
|
|
|
|
-- Add z_order as key/value combination
|
|
keyvalues["z_order"] = z_order
|
|
|
|
return keyvalues, roads
|
|
end
|
|
|
|
-- Filtering on nodes, ways, and relations
|
|
function filter_tags_generic(keyvalues, numberofkeys)
|
|
filter = 0 -- Will object be filtered out?
|
|
|
|
-- Filter out objects with 0 tags
|
|
if numberofkeys == 0 then
|
|
filter = 1
|
|
return filter, keyvalues
|
|
end
|
|
|
|
-- Delete tags listed in delete_tags
|
|
for i,k in ipairs(delete_tags) do
|
|
keyvalues[k] = nil
|
|
end
|
|
|
|
-- Filter out objects that do not have any of the keys in generic_keys
|
|
tagcount = 0
|
|
for k,v in pairs(keyvalues) do
|
|
for i, k2 in ipairs(generic_keys) do
|
|
if k2 == k then
|
|
tagcount = tagcount + 1
|
|
end
|
|
end
|
|
end
|
|
if tagcount == 0 then
|
|
filter = 1
|
|
end
|
|
|
|
return filter, keyvalues
|
|
end
|
|
|
|
-- Filtering on nodes
|
|
function filter_tags_node (keyvalues, numberofkeys)
|
|
return filter_tags_generic(keyvalues, numberofkeys)
|
|
end
|
|
|
|
-- Filtering on relations
|
|
function filter_basic_tags_rel (keyvalues, numberofkeys)
|
|
-- Filter out objects that are filtered out by filter_tags_generic
|
|
filter, keyvalues = filter_tags_generic(keyvalues, numberofkeys)
|
|
if filter == 1 then
|
|
return filter, keyvalues
|
|
end
|
|
|
|
-- Filter out all relations except route, multipolygon and boundary relations
|
|
if ((keyvalues["type"] ~= "route") and (keyvalues["type"] ~= "multipolygon") and (keyvalues["type"] ~= "boundary")) then
|
|
filter = 1
|
|
return filter, keyvalues
|
|
end
|
|
|
|
return filter, keyvalues
|
|
end
|
|
|
|
-- Filtering on ways
|
|
function filter_tags_way (keyvalues, numberofkeys)
|
|
filter = 0 -- Will object be filtered out?
|
|
polygon = 0 -- Will object be treated as polygon?
|
|
roads = 0 -- Will object be added to planet_osm_roads?
|
|
|
|
-- Filter out objects that are filtered out by filter_tags_generic
|
|
filter, keyvalues = filter_tags_generic(keyvalues, numberofkeys)
|
|
if filter == 1 then
|
|
return filter, keyvalues, polygon, roads
|
|
end
|
|
|
|
-- Treat objects with a key in polygon_keys as polygon
|
|
for i,k in ipairs(polygon_keys) do
|
|
if keyvalues[k] then
|
|
polygon=1
|
|
break
|
|
end
|
|
end
|
|
|
|
-- Treat objects tagged as area=yes, area=1, or area=true as polygon,
|
|
-- and treat objects tagged as area=no, area=0, or area=false not as polygon
|
|
if ((keyvalues["area"] == "yes") or (keyvalues["area"] == "1") or (keyvalues["area"] == "true")) then
|
|
polygon = 1;
|
|
elseif ((keyvalues["area"] == "no") or (keyvalues["area"] == "0") or (keyvalues["area"] == "false")) then
|
|
polygon = 0;
|
|
end
|
|
|
|
-- Add z_order key/value combination and determine if the object should also be added to planet_osm_roads
|
|
keyvalues, roads = add_z_order(keyvalues)
|
|
|
|
return filter, keyvalues, polygon, roads
|
|
end
|
|
|
|
function filter_tags_relation_member (keyvalues, keyvaluemembers, roles, membercount)
|
|
filter = 0 -- Will object be filtered out?
|
|
linestring = 0 -- Will object be treated as linestring?
|
|
polygon = 0 -- Will object be treated as polygon?
|
|
roads = 0 -- Will object be added to planet_osm_roads?
|
|
|
|
type = keyvalues["type"]
|
|
|
|
-- Remove type key
|
|
keyvalues["type"] = nil
|
|
|
|
-- Relations with type=boundary are treated as linestring
|
|
if (type == "boundary") then
|
|
linestring = 1
|
|
end
|
|
-- Relations with type=multipolygon and boundary=* are treated as linestring
|
|
if ((type == "multipolygon") and keyvalues["boundary"]) then
|
|
linestring = 1
|
|
-- For multipolygons...
|
|
elseif (type == "multipolygon") then
|
|
-- Treat as polygon
|
|
polygon = 1
|
|
end
|
|
|
|
-- Add z_order key/value combination and determine if the object should also be added to planet_osm_roads
|
|
keyvalues, roads = add_z_order(keyvalues)
|
|
|
|
return filter, keyvalues, {}, linestring, polygon, roads
|
|
end
|