-- Leo's gemini proxy

-- Connecting to unbon.cafe:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini;

MapComplete : HVAC


2023-07-10


Au détour d'une conversation sur le Fédiverse, il a été signalé l'existence d'une clé OpenStreetMap pour la climatisation[1], ainsi que de la difficulté d'accès et interaction avec celle-ci. Entrant dans la saison estivale, c'est le moment où jamais d'en faire mon premier thème MapComplete.


Attributs OpenStreetMap


Plutôt que me limiter à l'air conditionné, j'ai étendu le thème au concept de HVAC – acronyme anglophone pour chauffage, ventilation, et climatisation – pour mettre en avant tous les lieux disposant d'une forme de contrôle des paramètres de l'air que sont la température, l'humidité, ou sa qualité générale.


À priori, seules deux clés existent actuellement à cet effet :


`air_conditioning`, qui est une booléenne ;

`heating`[2], qui peut prendre différentes valeurs.


Documentation MapComplete


MapComplete dispose d'une documentation sur la création d'un thème personnalisé[3], j'ai été incapable de le suivre. La structure est particulièrement tordue, et se rapproche plus de bribes d'informations sur la question qu'un réel tutoriel pas-à-pas, ce que je vais tenter de tirer au clair ici.


La documentation indique différentes ressources jugées utiles :


l'aide à la création de thème, lien brisé, et programme obsolète ;

la prévisualisation via encodage en base64. Impossible à faire fonctionner, j'obtiens l'erreur « SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data » que ce soit avec mon code ou un officiel ;

le ThemeHelper, nécessitant d'installer la librairie npm.


Pour une simple mise en évidence des informations, une simple carte uMap en surcouche d'une requête Overpass sur les deux clés aurait suffit. L'avantage de MapComplete est de pouvoir proposer une solution de contribution aux données, au delà d'une simple visualisation.


Structure JSON


Un thème MapComplete est contenu dans un fichier JSON. Il est composé de trois niveaux :


Métadonnées (Titre, description,…) ;

`layers`, pour les éléments visuels ;

`tagRenderings`, pour les données OpenStreetMap.


Le cœur d'un thème est le concept de « couches ». Chaque couche a pour objectif de répondre à un besoin précis (ex : Des bancs, pour une personne souhaitant s'asseoir), ce qui peut permettre sa réutilisation pour d'autres thèmes si jugée pertinente. Encore une fois, cette atomicité est essentielle ; Pas question d'utiliser les couches comme filtres – la fonction `filter` existe pour ça –, faute de quoi pourraient apparaître des doublons en faux-positifs si la création de données est autorisée.


Le tableau (`array`) `tagRenderings` concerne les données OpenStreetMap. Chaque attribut peut y être décrit via un ensemble :


`question`, la question à laquelle répondre ;

`freeform`, un champ de réponse libre ;

`render`, une phrase déclarative pouvant contenir l'information lorsque celle-ci est présente ;

`mappings`, une phrase déclarative spéciale selon les valeurs. Par exemple pour faire une phrase à partir d'un attribut booléen.


Thème HVAC


Deux couches sont nécessaires à savoir les lieux chauffés, et les lieux climatisés. Pour avoir rapidement un prototype utilisable, et à défaut de bien saisir l'idée, j'ai récupéré les couches `builtins` du thème `onwheels` sur l'accessibilité.


Une question est définie pour chaque clé. L'une étant booléeenne, l'autre étant associé à une dizaine de valeurs[4], un mapping est requis dans chaque cas.


{
"id": "hvac",
"version": "2023-07-10",
"credits": "LeJun",
"title": {
	"en": "Heating, ventilation, and air conditioning"
},
"description": {
	"en": "Map of places using technologies to control air parameters such as temperature, humidity, and overall quality."
},
"icon": "https://upload.wikimedia.org/wikipedia/commons/1/1a/Fan_%28example%29.svg",
"startZoom": 14,
"startLat": 0,
"startLon": 0,
"layers": [
	{
		"builtin": [
			"indoors",
			"hotel",
			"cafe_pub",
			"pharmacy",
			"hospital",
			"shops",
			"governements",
			"walls_and_buildings"
		],
		"override": {
			"minzoom": 16
		}
	},
	{
	"tagRenderings": [
		{
		"id": "airconditioning",
		"question": {
			"en": "Does this place provides air-conditioning?"
		},
		"mappings": [
			{
			"if": "air_conditioning=no",
			"then": {
				"en": "This place doesn't provide air-conditioning"
			}
			},
			{
			"if": "air_conditioning=yes",
			"then": {
				"en": "This place provides air-conditioning"
			}
			}
		]
		},
		{
		"id": "heating",
		"question": {
			"en": "Is this place heated?"
		},
		"freeform": {
			"key": "heating",
			"addExtraTags": [
			"fixme=Freeform input used, value need to be checked"
			]
		},
		"render": {
			"en": "This place is heated through {heating}"
		},
		"mappings": [
			{
			"if": "heating=no",
			"then": {
				"en": "This place isn't heated"
			}
			},
			{
			"if": "heating=yes",
			"then": {
				"en": "This place is heated"
			}
			},
			{
			"if": "heating=fireplace",
			"then": {
				"en": "This place is heated through one or multiple fireplaces"
			}
			},
			{
			"if": "heating=stove",
			"then": {
				"en": "This place is heated through one or multiple stoves"
			}
			},
			{
			"if": "heating=radiator",
			"then": {
				"en": "This place is heated through one or multiple radiators"
			}
			},
			{
			"if": "heating=underfloor",
			"then": {
				"en": "This place has underfloor heating"
			}
			}
		]
		}
	]
	}
]
}

Références


[1] Key:air_conditioning, OpenStreetMap Wiki 2023

[2] Key:heating, OpenStreetMap Wiki 2023

[3] Making your own theme, MapComplete 2023

[4] heating, TagInfo 2023

-- Response ended

-- Page fetched on Sun May 19 01:56:38 2024