Skip to content

Commit ca5337b

Browse files
committed
fix a number of bugs and differences from openmaptiles vector tile schema
1. zoom 4, 5, and 7 road values were incorrectly being used. 2. openmaptiles shows admin 3 boundaries much higher. 3. unpaved and paved values are parsed from surface list 4. remove duplicate variable definitions. 5. SetMinZoomByAreaWithLimit allows up to minzoom 4 6. fix whitespace and a few variable issues.
1 parent 0ebc1d7 commit ca5337b

File tree

1 file changed

+43
-31
lines changed

1 file changed

+43
-31
lines changed

resources/process-openmaptiles.lua

Lines changed: 43 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ function Set(list)
3030
end
3131

3232
-- Meters per pixel if tile is 256x256
33+
ZRES3 = 19567.88
34+
ZRES4 = 9783.94
3335
ZRES5 = 4891.97
3436
ZRES6 = 2445.98
3537
ZRES7 = 1222.99
@@ -47,8 +49,8 @@ INVALID_ZOOM = 99
4749

4850
-- Process node/way tags
4951
aerodromeValues = Set { "international", "public", "regional", "military", "private" }
50-
pavedValues = Set { "paved", "asphalt", "cobblestone", "concrete", "concrete:lanes", "concrete:plates", "metal", "paving_stones", "sett", "unhewn_cobblestone", "wood" }
51-
unpavedValues = Set { "unpaved", "compacted", "dirt", "earth", "fine_gravel", "grass", "grass_paver", "gravel", "gravel_turf", "ground", "ice", "mud", "pebblestone", "salt", "sand", "snow", "woodchips" }
52+
unpavedValues = Set { "unpaved", "artificial_turf", "clay", "compacted", "crushed_limestone", "dirt", "dirt/sand", "earth", "fine_gravel", "grass", "grass_paver", "gravel", "gravel_turf", "ground", "ice", "mud", "pebblestone", "rock", "rocky", "rocks", "salt", "sand", "shells", "snow", "soil", "stepping_stones", "stone", "woodchips" }
53+
pavedValues = Set { "paved", "acrylic", "asphalt", "brick", "bricks", "cement", "chipseal", "cobblestone", "concrete", "concrete:lanes", "concrete:plates", "granite", "interlock", "metal", "metal_grid", "paving_stones", "plastic", "rubber", "sett", "tartan", "unhewn_cobblestone", "wood", "grade1" }
5254

5355
-- Process node tags
5456

@@ -64,7 +66,7 @@ function capitalLevel(capital)
6466
if capital_al == 0 then
6567
return nil
6668
end
67-
return capital_al
69+
return capital_al
6870
end
6971

7072
-- Calculate rank for place nodes
@@ -96,7 +98,7 @@ function calcRank(place, population, capital_al)
9698
end
9799
if place ~= "city" and place ~= "town" then
98100
return nil
99-
end
101+
end
100102
if population > 3 * 10^6 then
101103
return 1
102104
elseif population > 1 * 10^6 then
@@ -217,7 +219,9 @@ end
217219

218220
-- Process way tags
219221

220-
majorRoadValues = Set { "motorway", "trunk", "primary" }
222+
z4RoadValues = Set { "motorway" }
223+
z5RoadValues = Set { "trunk" }
224+
z7RoadValues = Set { "primary" }
221225
z9RoadValues = Set { "secondary", "motorway_link", "trunk_link" }
222226
z10RoadValues = Set { "primary_link", "secondary_link" }
223227
z11RoadValues = Set { "tertiary", "tertiary_link", "busway", "bus_guideway" }
@@ -228,8 +232,6 @@ z13RoadValues = Set { "track", "service" }
228232
manMadeRoadValues = Set { "pier", "bridge" }
229233
pathValues = Set { "footway", "cycleway", "bridleway", "path", "steps", "pedestrian", "platform" }
230234
linkValues = Set { "motorway_link", "trunk_link", "primary_link", "secondary_link", "tertiary_link" }
231-
pavedValues = Set { "paved", "asphalt", "cobblestone", "concrete", "concrete:lanes", "concrete:plates", "metal", "paving_stones", "sett", "unhewn_cobblestone", "wood" }
232-
unpavedValues = Set { "unpaved", "compacted", "dirt", "earth", "fine_gravel", "grass", "grass_paver", "gravel", "gravel_turf", "ground", "ice", "mud", "pebblestone", "salt", "sand", "snow", "woodchips" }
233235
railwayClasses = { rail="rail", narrow_gauge="rail", preserved="rail", funicular="rail", subway="transit", light_rail="transit", monorail="transit", tram="transit" }
234236

235237
aerowayBuildings= Set { "terminal", "gate", "tower" }
@@ -314,6 +316,7 @@ function write_to_transportation_layer(minzoom, highway_class, subclass, ramp, s
314316
if subclass and subclass ~= "" then
315317
Attribute("subclass", subclass)
316318
end
319+
local accessMinzoom = 9
317320
AttributeNumeric("layer", tonumber(Find("layer")) or 0, accessMinzoom)
318321
SetBrunnelAttributes()
319322
-- We do not write any other attributes for areas.
@@ -327,7 +330,6 @@ function write_to_transportation_layer(minzoom, highway_class, subclass, ramp, s
327330
-- Service
328331
if (is_rail or highway_class == "service") and (service and service ~="") then Attribute("service", service) end
329332

330-
local accessMinzoom = 9
331333
if is_road then
332334
local oneway = Find("oneway")
333335
if oneway == "yes" or oneway == "1" then
@@ -336,13 +338,9 @@ function write_to_transportation_layer(minzoom, highway_class, subclass, ramp, s
336338
if oneway == "-1" then
337339
-- **** TODO
338340
end
339-
local surface = Find("surface")
340341
local surfaceMinzoom = 12
341-
if pavedValues[surface] then
342-
Attribute("surface", "paved", surfaceMinzoom)
343-
elseif unpavedValues[surface] then
344-
Attribute("surface", "unpaved", surfaceMinzoom)
345-
end
342+
local surface = GetSurface()
343+
if surface ~= "" then Attribute("surface", surface, surfaceMinzoom) end
346344
if Holds("access") then Attribute("access", Find("access"), accessMinzoom) end
347345
if Holds("bicycle") then Attribute("bicycle", Find("bicycle"), accessMinzoom) end
348346
if Holds("foot") then Attribute("foot", Find("foot"), accessMinzoom) end
@@ -353,6 +351,18 @@ function write_to_transportation_layer(minzoom, highway_class, subclass, ramp, s
353351
end
354352
end
355353

354+
function GetSurface()
355+
local surface = split(Find("surface"), ";")
356+
-- prioritize unpaved
357+
for _, surfaceEntry in ipairs(surface) do
358+
if unpavedValues[surfaceEntry] then return "unpaved" end
359+
end
360+
for _, surfaceEntry in ipairs(surface) do
361+
if pavedValues[surfaceEntry] then return "paved" end
362+
end
363+
return ""
364+
end
365+
356366
-- Process way tags
357367

358368
function way_function()
@@ -424,7 +434,7 @@ function way_function()
424434
-- https://openmaptiles.org/schema/#boundary
425435
if isBoundary and not (Find("maritime")=="yes") then
426436
local mz = 0
427-
if admin_level>=3 and admin_level<5 then mz=4
437+
if admin_level>=3 and admin_level<5 then mz=3
428438
elseif admin_level>=5 and admin_level<7 then mz=8
429439
elseif admin_level==7 then mz=10
430440
elseif admin_level>=8 then mz=12
@@ -472,9 +482,9 @@ function way_function()
472482
under_construction = true
473483
end
474484
local minzoom = INVALID_ZOOM
475-
if majorRoadValues[h] then minzoom = 4
476-
elseif h == "trunk" then minzoom = 5
477-
elseif highway == "primary" then minzoom = 7
485+
if z4RoadValues[h] then minzoom = 4
486+
elseif z5RoadValues[h] then minzoom = 5
487+
elseif z7RoadValues[h] then minzoom = 7
478488
elseif z9RoadValues[h] then minzoom = 9
479489
elseif z10RoadValues[h] then minzoom = 10
480490
elseif z11RoadValues[h] then minzoom = 11
@@ -604,16 +614,16 @@ function way_function()
604614

605615
-- 'aerodrome_label'
606616
if aeroway=="aerodrome" then
607-
LayerAsCentroid("aerodrome_label")
608-
SetNameAttributes()
609-
Attribute("iata", Find("iata"))
610-
SetEleAttributes()
611-
Attribute("icao", Find("icao"))
617+
LayerAsCentroid("aerodrome_label")
618+
SetNameAttributes()
619+
Attribute("iata", Find("iata"))
620+
SetEleAttributes()
621+
Attribute("icao", Find("icao"))
612622

613-
local aerodrome = Find(aeroway)
614-
local class
615-
if aerodromeValues[aerodrome] then class = aerodrome else class = "other" end
616-
Attribute("class", class)
623+
local aerodrome = Find(aeroway)
624+
local class
625+
if aerodromeValues[aerodrome] then class = aerodrome else class = "other" end
626+
Attribute("class", class)
617627
end
618628

619629
-- Set 'waterway' and associated
@@ -662,7 +672,7 @@ function way_function()
662672
local class="lake"; if waterway~="" then class="river" end
663673
if class=="lake" and Find("wikidata")=="Q192770" then return end
664674
Layer("water",true)
665-
SetMinZoomByArea(way)
675+
SetMinZoomByArea()
666676
Attribute("class",class)
667677

668678
if Find("intermittent")=="yes" then Attribute("intermittent",1) end
@@ -802,13 +812,13 @@ end
802812

803813
-- Set ele and ele_ft on any object
804814
function SetEleAttributes()
805-
local ele = Find("ele")
815+
local ele = Find("ele")
806816
if ele ~= "" then
807817
local meter = math.floor(tonumber(ele) or 0)
808818
local feet = math.floor(meter * 3.2808399)
809819
AttributeNumeric("ele", meter)
810820
AttributeNumeric("ele_ft", feet)
811-
end
821+
end
812822
end
813823

814824
function SetBrunnelAttributes()
@@ -826,7 +836,9 @@ end
826836
-- Set minimum zoom level by area but not below given minzoom
827837
function SetMinZoomByAreaWithLimit(minzoom)
828838
local area=Area()
829-
if minzoom <= 6 and area>ZRES5^2 then MinZoom(6)
839+
if minzoom <= 4 and area>ZRES3^2 then MinZoom(4)
840+
elseif minzoom <= 5 and area>ZRES4^2 then MinZoom(5)
841+
elseif minzoom <= 6 and area>ZRES5^2 then MinZoom(6)
830842
elseif minzoom <= 7 and area>ZRES6^2 then MinZoom(7)
831843
elseif minzoom <= 8 and area>ZRES7^2 then MinZoom(8)
832844
elseif minzoom <= 9 and area>ZRES8^2 then MinZoom(9)

0 commit comments

Comments
 (0)