m-openstreetmap.mkxl /size: 20 Kb    last modification: 2021-10-28 13:51
1%D \module
2%D   [       file=m-database,
3%D        version=2020.07.18,
4%D          title=\CONTEXT\ Modules,
5%D       subtitle=Rendering Openstreetmap,
6%D         author=Hans Hagen,
7%D           date=\currentdate,
8%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
9
10%C This module is part of the \CONTEXT\ macro||package and is
11%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
12%C details.
13
14%D This is a follow up on something that Mojca and I did at at bachotex
15%D meeting. Some attendants had made up that map during a few years. The
16%D \CONTEXT\ group donated a map that could be mounted outside drawn by
17%D Duane and after that we decided to see if we could keep up by rendering
18%D the openstreetmap variant with \METAPOST.
19%D
20%D There are some comments in the \LUA\ file and that one might evolve over
21%D time as there is some trial and error involved. The \typ {osm} file is
22%D read in, stripped a bit, the \XML\ is analyzed and \METAPOST\ code is
23%D generated. The level of detail can be influenced.
24
25% This will change ... users are invited to come with variants.
26
27\definecolor [osm:special]          [s=.25]
28
29\definecolor [osm:building:special] [r=.75]
30\definecolor [osm:building]         [r=.50]
31
32\definecolor [osm:parking]          [s=.25]
33\definecolor [osm:bridge]           [s=.50]
34\definecolor [osm:quay]             [s=.25]
35\definecolor [osm:barrier]          [s=.25]
36\definecolor [osm:industrial]       [s=.70]
37\definecolor [osm:residential]      [s=.75]
38\definecolor [osm:cemetery]         [s=.50]
39
40\definecolor [osm:university]       [s=.85]
41
42\definecolor [osm:boat]             [b=.25]
43
44\definecolor [osm:water]            [b=.75]
45\definecolor [osm:waterway]         [r=.75,g=.75]
46
47\definecolor [osm:wetland]          [g=.25]
48\definecolor [osm:grass]            [g=.50]
49\definecolor [osm:park]             [g=.60]
50\definecolor [osm:forest]           [g=.75]
51
52\definecolor [osm:sand]             [y=.75]
53
54\definecolor [osm:footway]          [b=.3]
55\definecolor [osm:cycleway]         [b=.5]
56\definecolor [osm:path]             [b=.7]
57\definecolor [osm:track]            [s=.4]
58
59\definecolor [osm:bridge]           [s=.25]
60\definecolor [osm:bridge:special]   [s=.50]
61
62\definecolor [osm:unknown]          [s=0]
63
64\definecolor [osm:background]       [s=.8]
65\definecolor [osm:grid]             [s=1]
66
67% We can define them global, in which case we can check for actually
68% used colors.
69
70\startbuffer[osm:colors]
71
72\definecolor[osm:aerialway:station]         [osm:unknown]
73
74\definecolor[osm:aeroway:runway]            [osm:unknown]
75\definecolor[osm:aeroway:taxiway]           [osm:unknown]
76
77\definecolor[osm:agricultural:no]           [osm:unknown]
78\definecolor[osm:agricultural:yes]          [osm:unknown]
79
80\definecolor[osm:amenity:arts_centre]       [osm:building:special]
81\definecolor[osm:amenity:bar]               [osm:building:special]
82\definecolor[osm:amenity:bicycle_parking]   [osm:parking]
83\definecolor[osm:amenity:college]           [osm:building:special]
84\definecolor[osm:amenity:courthouse]        [osm:building:special]
85\definecolor[osm:amenity:fountain]          [osm:building:special]
86\definecolor[osm:amenity:hospital]          [osm:building:special]
87\definecolor[osm:amenity:kindergarten]      [osm:building:special]
88\definecolor[osm:amenity:marketplace]       [osm:parking]
89\definecolor[osm:amenity:parking]           [osm:parking]
90\definecolor[osm:amenity:parking_space]     [osm:parking]
91\definecolor[osm:amenity:pharmacy]          [osm:building:special]
92\definecolor[osm:amenity:place_of_worship]  [osm:building:special]
93\definecolor[osm:amenity:police]            [osm:building:special]
94\definecolor[osm:amenity:restaurant]        [osm:building:special]
95\definecolor[osm:amenity:school]            [osm:building:special]
96\definecolor[osm:amenity:shower]            [osm:building:special]
97\definecolor[osm:amenity:social_facility]   [osm:building:special]
98\definecolor[osm:amenity:toilets]           [osm:building:special]
99\definecolor[osm:amenity:townhall]          [osm:building:special]
100
101\definecolor[osm:amenity:university]        [osm:university] % what color ... (obscures buildings)
102
103\definecolor[osm:amenity:bank]                   [osm:building:special]
104\definecolor[osm:amenity:bicycle_parking]        [osm:building:special]
105\definecolor[osm:amenity:bicycle_repair_station] [osm:building:special]
106\definecolor[osm:amenity:cafe]                   [osm:building:special]
107\definecolor[osm:amenity:car_wash]               [osm:building:special]
108\definecolor[osm:amenity:childcare]              [osm:building:special]
109\definecolor[osm:amenity:clinic]                 [osm:building:special]
110\definecolor[osm:amenity:clubhouse]              [osm:building:special]
111\definecolor[osm:amenity:college]                [osm:building:special]
112\definecolor[osm:amenity:community_centre]       [osm:building:special]
113\definecolor[osm:amenity:computer_lab]           [osm:building:special]
114\definecolor[osm:amenity:events_venue]           [osm:building:special]
115\definecolor[osm:amenity:fast_food]              [osm:building:special]
116\definecolor[osm:amenity:fire_station]           [osm:building:special]
117\definecolor[osm:amenity:fountain]               [osm:building:special]
118\definecolor[osm:amenity:fuel]                   [osm:building:special]
119\definecolor[osm:amenity:library]                [osm:building:special]
120\definecolor[osm:amenity:mailroom]               [osm:building:special]
121\definecolor[osm:amenity:pharmacy]               [osm:building:special]
122\definecolor[osm:amenity:place_of_worship]       [osm:building:special]
123\definecolor[osm:amenity:post_office]            [osm:building:special]
124\definecolor[osm:amenity:recycling]              [osm:building:special]
125\definecolor[osm:amenity:research_institute]     [osm:building:special]
126\definecolor[osm:amenity:theatre]                [osm:building:special]
127\definecolor[osm:amenity:wellness_centre]        [osm:building:special]
128
129\definecolor[osm:area:yes]                  [osm:unknown]
130
131\definecolor[osm:barrier:chain]             [osm:barrier]
132\definecolor[osm:barrier:city_wall]         [osm:barrier]
133\definecolor[osm:barrier:fence]             [osm:barrier]
134\definecolor[osm:barrier:gate]              [osm:barrier]
135\definecolor[osm:barrier:guard_rail]        [osm:barrier]
136\definecolor[osm:barrier:hedge]             [osm:barrier]
137\definecolor[osm:barrier:retaining_wall]    [osm:barrier]
138\definecolor[osm:barrier:wall]              [osm:barrier]
139\definecolor[osm:barrier:yes]               [osm:barrier]
140
141\definecolor[osm:boat:yes]                  [osm:boat]
142
143\definecolor[osm:boundary:aboriginal_lands] [osm:unknown]
144\definecolor[osm:boundary:administrative]   [osm:unknown]
145\definecolor[osm:boundary:national_park]    [osm:unknown]
146\definecolor[osm:boundary:protected_area]   [osm:unknown]
147
148\definecolor[osm:bridge:movable]            [osm:bridge:special]
149\definecolor[osm:bridge:viaduct]            [osm:bridge]
150\definecolor[osm:bridge:yes]                [osm:footway]
151
152\definecolor[osm:bridge:support:pier]       [osm:special]
153
154\definecolor[osm:building:apartments]       [osm:building]
155\definecolor[osm:building:bandstand]        [osm:building:special]
156\definecolor[osm:building:cathedral]        [osm:building]
157\definecolor[osm:building:civic]            [osm:building]
158\definecolor[osm:building:commercial]       [osm:building:special]
159\definecolor[osm:building:construction]     [osm:building:special]
160\definecolor[osm:building:garage]           [osm:building]
161\definecolor[osm:building:government]       [osm:building]
162\definecolor[osm:building:hospital]         [osm:building]
163\definecolor[osm:building:house]            [osm:building]
164\definecolor[osm:building:houseboat]        [osm:boat]
165\definecolor[osm:building:hut]              [osm:building]
166\definecolor[osm:building:industrial]       [osm:building:special]
167\definecolor[osm:building:kiosk]            [osm:building:special]
168\definecolor[osm:building:public]           [osm:building]
169\definecolor[osm:building:residential]      [osm:building]
170\definecolor[osm:building:retail]           [osm:building:special]
171\definecolor[osm:building:roof]             [osm:building]
172\definecolor[osm:building:school]           [osm:building:special]
173\definecolor[osm:building:shed]             [osm:building]
174\definecolor[osm:building:townhall]         [osm:building]
175\definecolor[osm:building:yes]              [osm:building]
176
177\definecolor[osm:building:university]       [osm:building]
178\definecolor[osm:building:dormitory]        [osm:building]
179\definecolor[osm:building:barn]             [osm:building]
180\definecolor[osm:building:bridge]           [osm:building:special]
181\definecolor[osm:building:detached]         [osm:building]
182\definecolor[osm:building:farm_auxiliary]   [osm:building]
183\definecolor[osm:building:grandstand]       [osm:building]
184\definecolor[osm:building:greenhouse]       [osm:building:special]
185\definecolor[osm:building:kindergarten]     [osm:building]
186\definecolor[osm:building:parking]          [osm:building:special]
187\definecolor[osm:building:stable]           [osm:building]
188\definecolor[osm:building:stadium]          [osm:building:special]
189\definecolor[osm:building:toilets]          [osm:building:special]
190
191\definecolor[osm:emergency:designated]      [osm:unknown]
192\definecolor[osm:emergency:destination]     [osm:unknown]
193\definecolor[osm:emergency:no]              [osm:unknown]
194\definecolor[osm:emergency:official]        [osm:unknown]
195\definecolor[osm:emergency:yes]             [osm:unknown]
196
197\definecolor[osm:golf:cartpath]             [osm:unknown]
198\definecolor[osm:golf:hole]                 [osm:unknown]
199\definecolor[osm:golf:path]                 [osm:unknown]
200
201\definecolor[osm:highway:bridleway]         [osm:unknown]
202\definecolor[osm:highway:corridor]          [osm:track]
203\definecolor[osm:highway:cycleway]          [osm:cycleway]
204\definecolor[osm:highway:footway]           [osm:footway]
205\definecolor[osm:highway:living_street]     [osm:track]
206\definecolor[osm:highway:motorway]          [osm:unknown]
207\definecolor[osm:highway:motorway_link]     [osm:unknown]
208\definecolor[osm:highway:path]              [osm:path]
209\definecolor[osm:highway:pedestrian]        [osm:track]
210\definecolor[osm:highway:platform]          [osm:unknown]
211\definecolor[osm:highway:primary]           [osm:track]
212\definecolor[osm:highway:primary_link]      [osm:unknown]
213\definecolor[osm:highway:raceway]           [osm:unknown]
214\definecolor[osm:highway:residential]       [osm:track]
215\definecolor[osm:highway:rest_area]         [osm:unknown]
216\definecolor[osm:highway:road]              [osm:unknown]
217\definecolor[osm:highway:secondary_link]    [osm:unknown]
218\definecolor[osm:highway:service]           [osm:track]
219\definecolor[osm:highway:services]          [osm:unknown]
220\definecolor[osm:highway:steps]             [osm:track]
221\definecolor[osm:highway:tertiary]          [osm:track]
222\definecolor[osm:highway:tertiary_link]     [osm:unknown]
223\definecolor[osm:highway:track]             [osm:track]
224\definecolor[osm:highway:trunk]             [osm:unknown]
225\definecolor[osm:highway:trunk_link]        [osm:unknown]
226\definecolor[osm:highway:unclassified]      [osm:track]
227
228\definecolor[osm:historic:citywalls]        [osm:unknown]
229
230\definecolor[osm:junction:yes]              [osm:unknown]
231
232\definecolor[osm:landuse:allotments]        [osm:grass]
233\definecolor[osm:landuse:cemetery]          [osm:cemetery]
234\definecolor[osm:landuse:commercial]        [osm:industrial]
235\definecolor[osm:landuse:construction]      [osm:industrial]
236\definecolor[osm:landuse:forest]            [osm:forest]
237\definecolor[osm:landuse:grass]             [osm:grass]
238\definecolor[osm:landuse:industrial]        [osm:industrial]
239\definecolor[osm:landuse:meadow]            [osm:grass]
240\definecolor[osm:landuse:residential]       [osm:residential]
241\definecolor[osm:landuse:static_building]   [osm:special]
242\definecolor[osm:landuse:village_green]     [osm:forest]
243
244\definecolor[osm:leisure:beach]             [osm:sand]
245\definecolor[osm:leisure:garden]            [osm:park]
246\definecolor[osm:leisure:ice_rink]          [osm:water]
247\definecolor[osm:leisure:marina]            [osm:quay]
248\definecolor[osm:leisure:park]              [osm:park]
249\definecolor[osm:leisure:pitch]             [osm:special]
250\definecolor[osm:leisure:playground]        [osm:special]
251\definecolor[osm:leisure:slipway]           [osm:unknown]
252\definecolor[osm:leisure:sports_centre]     [osm:special]
253\definecolor[osm:leisure:track]             [osm:track]
254
255\definecolor[osm:man_made:breakwater]       [osm:water]
256\definecolor[osm:man_made:bridge]           [osm:bridge]
257\definecolor[osm:man_made:cutline]          [osm:unknown]
258\definecolor[osm:man_made:embankment]       [osm:unknown]
259\definecolor[osm:man_made:groyne]           [osm:unknown]
260\definecolor[osm:man_made:instrument]       [osm:special]
261\definecolor[osm:man_made:pier]             [osm:quay]
262\definecolor[osm:man_made:pipeline]         [osm:unknown]
263\definecolor[osm:man_made:quay]             [osm:quay]
264\definecolor[osm:man_made:tower]            [osm:special]
265\definecolor[osm:man_made:windmill]         [osm:special]
266
267\definecolor[osm:natural:arete]             [osm:unknown]
268\definecolor[osm:natural:cliff]             [osm:unknown]
269\definecolor[osm:natural:earth_bank]        [osm:unknown]
270\definecolor[osm:natural:ridge]             [osm:unknown]
271\definecolor[osm:natural:sand]              [osm:sand]
272\definecolor[osm:natural:scrub]             [osm:forest]
273\definecolor[osm:natural:tree_row]          [osm:forest]
274\definecolor[osm:natural:water]             [osm:water]
275\definecolor[osm:natural:wetland]           [osm:wetland]
276\definecolor[osm:natural:wood]              [osm:forest]
277
278\definecolor[osm:power:cable]               [osm:unknown]
279\definecolor[osm:power:line]                [osm:unknown]
280\definecolor[osm:power:minor_line]          [osm:unknown]
281
282\definecolor[osm:railway:construction]      [osm:unknown]
283\definecolor[osm:railway:disused]           [osm:unknown]
284\definecolor[osm:railway:funicular]         [osm:unknown]
285\definecolor[osm:railway:light_rail]        [osm:unknown]
286\definecolor[osm:railway:miniature]         [osm:unknown]
287\definecolor[osm:railway:monorail]          [osm:unknown]
288\definecolor[osm:railway:narrow_gauge]      [osm:unknown]
289\definecolor[osm:railway:platform]          [osm:unknown]
290\definecolor[osm:railway:preserved]         [osm:unknown]
291\definecolor[osm:railway:rail]              [osm:unknown]
292\definecolor[osm:railway:subway]            [osm:unknown]
293\definecolor[osm:railway:tram]              [osm:unknown]
294\definecolor[osm:railway:turntable]         [osm:unknown]
295
296\definecolor[osm:tourism:yes]               [osm:unknown]
297
298\definecolor[osm:water:basin]               [osm:water]
299\definecolor[osm:water:river]               [osm:water]
300
301\definecolor[osm:waterway:canal]            [osm:waterway]
302\definecolor[osm:waterway:derelict_canal]   [osm:waterway]
303\definecolor[osm:waterway:ditch]            [osm:waterway]
304\definecolor[osm:waterway:drain]            [osm:waterway]
305\definecolor[osm:waterway:river]            [osm:waterway]
306\definecolor[osm:waterway:stream]           [osm:waterway]
307\definecolor[osm:waterway:tidal_channel]    [osm:waterway]
308\definecolor[osm:waterway:wadi]             [osm:waterway]
309\definecolor[osm:waterway:weir]             [osm:waterway]
310
311\stopbuffer
312
313\getbuffer[osm:colors]
314
315\registerctxluafile{m-openstreetmap}{autosuffix}
316
317\startMPdefinitions
318
319    presetparameters "openstreetmap" [
320        filename = "test.osm",
321      % grid     = "dots",
322        griddot  = 1.5,
323    ] ;
324
325    def lmt_openstreetmap = applyparameters "openstreetmap" "lmt_do_openstreetmap" enddef ;
326
327    vardef lmt_do_openstreetmap =
328        image (
329            lua.mp.lmt_do_openstreetmap() ;
330        )
331    enddef ;
332
333\stopMPdefinitions
334
335\continueifinputfile{m-openstreetmap.mkxl}
336
337\startMPpage
338    draw lmt_openstreetmap [
339%         filename = "hasselt.osm"
340        filename = "e:/tmp/map.osm"
341        used     = [
342            university = false,
343        ],
344    ] ;
345\stopMPpage
346
347% \startMPpage
348%     draw lmt_openstreetmap [
349%         filename = "e:/tmp/hulshorst.osm"
350%         used     = [
351%              boundary     = false,
352%         ],
353%     ] ;
354% \stopMPpage
355
356% \startMPpage
357%     draw lmt_openstreetmap [
358%         filename = "hasselt.osm"
359%         used     = [
360%              boundary     = false,
361%              emergency    = false,
362%              boat         = false,
363%              golf         = false,
364%              area         = false,
365%              agricultural = false,
366%              historic     = false,
367%              tourism      = false,
368%              power        = false,
369%              junction     = false,
370%              water        = false,
371%              highway      = false,
372%              waterway     = false,
373%              railway      = false,
374%              aeroway      = false,
375%              aerialway    = false,
376%         ]
377%     ] ;
378% \stopMPpage
379
380% \startMPpage
381%     draw lmt_openstreetmap [
382%         filename = "hasselt.osm"
383%         used     = [
384%             amenity      = false,
385%             boundary     = false,
386%             building     = false,
387%             emergency    = false,
388%             man_made     = false,
389%             natural      = "magenta",
390%             barrier      = false,
391%             leisure      = "cyan",
392%             bridge       = false,
393%             boat         = false,
394%             landuse      = "green",
395%             golf         = false,
396%             area         = false,
397%             bridge       = false,
398%             agricultural = false,
399%             historic     = false,
400%             tourism      = false,
401%             power        = false,
402%             junction     = false,
403%             water        = false,
404%             highway      = false,
405%             waterway     = false,
406%             railway      = false,
407%             aeroway      = false,
408%             aerialway    = false,
409%         ]
410%     ] ;
411% \stopMPpage
412
413% \startMPpage
414%     draw lmt_openstreetmap [
415%         filename = "hasselt-large.osm"
416%         grid     = "dots",
417%       % collect  = true,
418%     ] ;
419% \stopMPpage
420
421% \startMPpage
422%     draw lmt_openstreetmap [
423%         filename = "e:/tmp/map.osm"
424%     ] ;
425% \stopMPpage
426
427% \startMPpage
428%     draw lmt_openstreetmap [
429%         filename = "e:/tmp/map-x.osm"
430%         grid     = "dots",
431%         griddot  = 1,
432%     ] ;
433% \stopMPpage
434
435% \startMPpage
436%     draw lmt_openstreetmap [
437%         filename = "e:/temporary/ford-collins.osm"
438%     ] ;
439% \stopMPpage
440
441\stoptext
442
443% -- -- The original approaches:
444% --
445% -- local colors = {
446% --     amenity = {
447% --         arts_centre      = "osm:special",
448% --         ...
449% --     }
450% -- }
451% --
452% -- local function getcolor(r)
453% --     local what, color, both
454% --     for t in xmlcollected(r,"/tag") do
455% --         local at  = t.at
456% --         local k   = at.k
457% --         local all = usedcolors[k]
458% --         if all then
459% --             local v   = at.v
460% --             local col = all[v]
461% --             if col then
462% --                 what  = k
463% --                 color = col
464% --                 both  = lines[k]
465% --             elseif missing then
466% --                 missing[k][v] = (missing[k][v] or 0) + 1
467% --             end
468% --         end
469% --         if k == "amenity" then
470% --             break
471% --         end
472% --     end
473% --     return what, color, both
474% -- end
475%
476% -- -- maybe nested:
477%
478% -- for m in xmlcollected(parent,"/member[@type='relation']") do
479% --     local f = xmlfirst(root,f_relation(m.at.ref))
480% --     if f then
481% --         for m in xmlcollected(f,"/member[@type='way']") do
482% --          -- local f = xmlfirst(root,f_way(m.at.ref))
483% --             local f = ways[m.at.ref]
484% --             if f then
485% --                 local p, n = addpath(f, { }, 0)
486% --                 if n > 1 then
487% --                     local what, color = getcolor(parent)
488% --                     if what and rendering[what] then
489% --                         r = r + 1
490% --                         if p[1] == p[n] then
491% --                             result[r] = f_fill(p,color)
492% --                         else
493% --                             result[r] = f_draw(p,color)
494% --                         end
495% --                     end
496% --                 end
497% --             end
498% --         end
499% --     end
500% -- end
501%
502% -- local filename = resolvers.savers.virtual("foo",result,"mp")
503% -- context([[input "%s" ;]],filename)
504% -- context([[runscript "resolvers.cleaners.virtual('%s')" ;]],filename)
505%
506% -- context.startTEXpage()
507% -- context.startMPcode("doublefun")
508% -- context("lua.mp.fetchresult();")
509% -- context.stopMPcode()
510% -- context.stopTEXpage()
511
512