Module:Carte : Différence entre versions

De Lagny-sur-Marne Wiki
Aller à : navigation, rechercher
(nettoyage, correction de problème d'ordre pour les coordonnées renvoyées au Wikitexte)
Ligne 32 : Ligne 32 :
 
-- 'Projection conique avec DL'   
 
-- 'Projection conique avec DL'   
 
local function dllat(latitude, longitude, mapdata) -- conique avec DL
 
local function dllat(latitude, longitude, mapdata) -- conique avec DL
local val = 100*
+
local val =  
 
(mapdata.y0 +
 
(mapdata.y0 +
 
( mapdata.iheight/2 - mapdata.y0 ) *
 
( mapdata.iheight/2 - mapdata.y0 ) *
Ligne 45 : Ligne 45 :
 
end
 
end
 
local function dllong(latitude, longitude, mapdata)
 
local function dllong(latitude, longitude, mapdata)
local val = 100 * (
+
local val =  
 
( (mapdata.x0 or (mapdata.iwidth/2)) +  
 
( (mapdata.x0 or (mapdata.iwidth/2)) +  
 
( mapdata.iheight/2 - mapdata.y0 ) *
 
( mapdata.iheight/2 - mapdata.y0 ) *
Ligne 56 : Ligne 56 :
 
* mapdata.s^2
 
* mapdata.s^2
 
)
 
)
)
 
 
) / mapdata.iwidth
 
) / mapdata.iwidth
 
return val  
 
return val  
Ligne 68 : Ligne 67 :
 
if longitude < 0 then longitude = (360 + longitude) end
 
if longitude < 0 then longitude = (360 + longitude) end
 
end
 
end
return 100 * (longitude - left) / (right - left)  
+
return  (longitude - left) / (right - left)  
 
end
 
end
  
 +
local function equirecLat(latitude, mapdata)
 +
return (latitude - mapdata.top) / (mapdata.bottom - mapdata.top)
 +
end
 
----------------------------------
 
----------------------------------
 +
local function pointposition(latitude, longitude, mapdata)
 +
local latitude = tonumber(latitude) or tonumber(coord.dms2dec({args={latitude}}))
 +
local longitude = tonumber(longitude) or tonumber(coord.dms2dec({args={longitude}}))
 +
 +
local ypos, xpos
 +
if mapdata.x and mapdata.y then -- pour les cartes complexes : calcul de la position à partir de formules en Wikicode dans les clés "x" et "y"
 +
xpos = mapdata.x(latitude, longitude) / 100
 +
ypos = mapdata.y(latitude, longitude) / 100
 +
 +
elseif mapdata.projection ==  'Projection équirectangulaire' then
 +
ypos = equirecLat(latitude, mapdata)
 +
xpos =  equirecLong(longitude, mapdata)
 +
elseif mapdata.projection == 'Projection conique avec DL' then
 +
ypos = dllat(latitude, longitude, mapdata)
 +
xpos = dllong(latitude, longitude, mapdata)
 +
end
 +
return ypos, xpos
 +
end
 +
 
local function placepoint(mapdata, point) -- fonction d'aige pour buildmap point est une table contenant latitude, longitude, type de point...
 
local function placepoint(mapdata, point) -- fonction d'aige pour buildmap point est une table contenant latitude, longitude, type de point...
local latitude = tonumber(point.latitude) or tonumber(coord.dms2dec({args={point.latitude}}))
+
local ypos , xpos = pointposition(point.latitude, point.longitude, mapdata)
local longitude = tonumber(point.longitude) or tonumber(coord.dms2dec({args={point.longitude}}))
+
 
 +
if (not xpos) or (not ypos) then
 +
return "données de géolocalisation invalides"
 +
end
 +
 
 +
if (ypos > 1.1) or (xpos) > 1.1 or (ypos < -0.1) or (xpos < -0.1) then
 +
return '[[Category:Article avec une géolocalisation hors-carte]]' .. 'les coordonnées indiquées sont hors de la carte de géolocalisation demandée'
 +
end
 +
 
local pointsize = tostring(point.pointsize or '8')
 
local pointsize = tostring(point.pointsize or '8')
 
local pointtext = point.text or ''
 
local pointtext = point.text or ''
Ligne 83 : Ligne 112 :
 
addmaintenancecat('Page avec un modèle de point de carte non supporté')
 
addmaintenancecat('Page avec un modèle de point de carte non supporté')
 
end
 
end
local ypos, xpos
 
if mapdata.x and mapdata.y then -- pour les cartes complexes : calcul de la position à partir de formules en Wikicode dans les clés "x" et "y"
 
xpos = mapdata.x(latitude, longitude)
 
ypos = mapdata.y(latitude, longitude)
 
  
elseif mapdata.projection ==  'Projection équirectangulaire' then
+
local htmlheight = tostring(ypos * 100) .. '%'
ypos = 100 *  (latitude - mapdata.top) / (mapdata.bottom - mapdata.top)
+
local htmlwidth = tostring(xpos * 100) .. '%'
xpos =  equirecLong(longitude, mapdata)
 
elseif mapdata.projection == 'Projection conique avec DL' then
 
ypos = dllat(latitude, longitude, mapdata)
 
xpos = dllong(latitude, longitude, mapdata)
 
else
 
return "système cartographique non supporté"
 
end
 
if (ypos > 110) or (xpos) > 110 or (ypos < -1.1) or (xpos < -1.1) then
 
-- return '[[Category:Article avec une géolocalisation hors-carte]]' .. 'les coordonnées indiquées sont hors de la carte de géolocalisation demandée'
 
end
 
local htmlheight = tostring(ypos) .. '%'
 
local htmlwidth = tostring(xpos) .. '%'
 
  
 
local pointdiv = mw.html.create('div')
 
local pointdiv = mw.html.create('div')
Ligne 112 : Ligne 125 :
 
:wikitext(pointtext)
 
:wikitext(pointtext)
 
:done()
 
:done()
:done()
+
:allDone()
 
 
 
return pointdiv
 
return pointdiv
Ligne 152 : Ligne 165 :
 
:tag('td')
 
:tag('td')
 
:tag('div')
 
:tag('div')
:css({position= 'relative', margin = "auto",})
+
:css({position= 'relative', margin = "auto", width = '100%', ['text-align'] = 'right' })
 
:wikitext('[[File:' .. file .. '|frameless|' .. width .. 'px' .. '|' .. alt .. ']]' )
 
:wikitext('[[File:' .. file .. '|frameless|' .. width .. 'px' .. '|' .. alt .. ']]' )
 
 
Ligne 190 : Ligne 203 :
 
local success, data = pcall(loaddata, j)  
 
local success, data = pcall(loaddata, j)  
 
if not success then
 
if not success then
local mapliststring = table.concat(maplist, '/')
+
local mapliststring = ''
 +
for i, j in pairs(maplist) do
 +
mapliststring = j .. '/' .. mapliststring
 +
end
 
return mw.getCurrentFrame():expandTemplate{ title = 'Infobox/Géolocalisation multiple/transition', args = {['géolocalisation'] = mapliststring, type = maptype, latitude = params.latitude, longitude = params.longitude }}
 
return mw.getCurrentFrame():expandTemplate{ title = 'Infobox/Géolocalisation multiple/transition', args = {['géolocalisation'] = mapliststring, type = maptype, latitude = params.latitude, longitude = params.longitude }}
 
.. '[[Catégorie:Page avec des données de géolocalisation non supportées]]'
 
.. '[[Catégorie:Page avec des données de géolocalisation non supportées]]'

Version du 21 janvier 2015 à 14:52

La documentation pour ce module peut être créée à Module:Carte/doc

local p = {}
local pointmod = require('Module:Carte/Points')
local linguistic = require('Module:Linguistique')
local maintenance = ''
local coord  = require('Module:Coordinates')
local function loaddata(name) 
	return require('Module:Carte/données/' .. mw.ustring.lower(name))
end

local divstyle = {
	['clear'] = 'right',
	['width'] ='25em',
	['text-align'] = 'center',
	['font-size'] = '0.9em',
	['line-height'] = '1.4em',
	['margin'] = '0 0 0.5em 1em',
	['max-width'] = '325px',
	['word-wrap'] = 'break-word',
	['max-width'] = '99%',
	['height'] = 'auto',
	['justify-content'] = 'space-around',
	['align-items'] = 'center',
}

local function addmaintenancecat(cat, sortkey) -- ajoute du texte à la string maintenance en cas de problème
	if mw.title.getCurrentTitle().namespace ~= 0 then
		return
	end
	maintenance = maintenance .. '[[Category:' .. cat .. ']]'
end

-- 'Projection conique avec DL'  
local function dllat(latitude, longitude, mapdata) -- conique avec DL
	local val = 
	 	(mapdata.y0 +
	 		( mapdata.iheight/2 - mapdata.y0 ) *
	 		(1 - mapdata.t *
	 			(latitude - mapdata.centrallat) *
	 			(0.01745329252 + 0.00000177219231 * (latitude - mapdata.centrallat) ^2)
	 		)*
	 		( 1- 0.00015230871 * (longitude-mapdata.centrallong) ^2 * mapdata.s^2)
	 	) / mapdata.iheight

	return val
end
local function dllong(latitude, longitude, mapdata)
	local val = 
		( (mapdata.x0 or (mapdata.iwidth/2)) + 
			( mapdata.iheight/2 - mapdata.y0 ) *
			( 1 -mapdata.t * 
				(latitude-mapdata.centrallat) *
				( 0.01745329252 + 0.00000177219231 * (latitude-mapdata.centrallat) * (latitude-mapdata.centrallat) )
			) * 
		(longitude-mapdata.centrallong) * mapdata.s *
		(0.01745329252 - 0.000000886096156 * (longitude-(mapdata.centrallong)) * (longitude-(mapdata.centrallong))
			* mapdata.s^2
		)
	) / mapdata.iwidth
	return val 
end

--longitude équirectangulaire
local function equirecLong(longitude, mapdata)
	local left, right = mapdata.left, mapdata.right
	if right < left then -- si la carte passe le méridien 180
		right = 360 + right
		if longitude < 0 then longitude = (360 + longitude) end
	end
	return  (longitude - left) / (right - left) 
end

local function equirecLat(latitude, mapdata)
	return (latitude - mapdata.top) / (mapdata.bottom - mapdata.top) 	
end
----------------------------------
local function pointposition(latitude, longitude, mapdata)
	local latitude = tonumber(latitude) or tonumber(coord.dms2dec({args={latitude}}))
	local longitude = tonumber(longitude) or tonumber(coord.dms2dec({args={longitude}}))
		
	local ypos, xpos
	if mapdata.x and mapdata.y then -- pour les cartes complexes : calcul de la position à partir de formules en Wikicode dans les clés "x" et "y"
		xpos = mapdata.x(latitude, longitude) / 100
		ypos = mapdata.y(latitude, longitude) / 100

	elseif mapdata.projection ==  'Projection équirectangulaire' then
		ypos = equirecLat(latitude, mapdata)
		xpos =  equirecLong(longitude, mapdata)
	elseif mapdata.projection == 'Projection conique avec DL' then
		ypos = dllat(latitude, longitude, mapdata)
		xpos = dllong(latitude, longitude, mapdata)
	end
	return ypos, xpos
end

local function placepoint(mapdata, point) -- fonction d'aige pour buildmap point est une table contenant latitude, longitude, type de point...
	local ypos , xpos = pointposition(point.latitude, point.longitude, mapdata)

	if (not xpos) or (not ypos) then
		return "données de géolocalisation invalides"
	end

	if (ypos > 1.1) or (xpos) > 1.1 or (ypos < -0.1) or (xpos < -0.1) then 
		return '[[Category:Article avec une géolocalisation hors-carte]]' .. 'les coordonnées indiquées sont hors de la carte de géolocalisation demandée'
	end
	
	local pointsize = tostring(point.pointsize or '8')
	local pointtext = point.text or ''
	local pointtype = point.pointtype or 'default'
	local pointimage = pointmod[pointtype]
	if not pointimage then
		pointimage = pointmod[pointtype]
		addmaintenancecat('Page avec un modèle de point de carte non supporté')
	end

	local htmlheight = tostring(ypos * 100) .. '%'
	local htmlwidth = tostring(xpos * 100) .. '%'

	local pointdiv = mw.html.create('div')
		:css{position = 'absolute', border = 'none', top = htmlheight, left = htmlwidth}
		:tag('div')
			:css{position = 'absolute', top = '-4px', left = '-4px', ['line-height'] = '0', width = '8px'}
			:wikitext('[[Image:' .. pointimage .. '|' .. pointsize .. 'px]]')
			:tag('span') 
			:css{position = 'absolute', ['text-align'] = 'left', width = '150px'}
			:wikitext(pointtext)
			:done()
		:allDone()
			
	return pointdiv
end

local function buildmap(map, maptype, width, pointtable, caption) -- fonction d'aige pour multimap
	if map == '-' then
		return
	end
	local success, mapdata = pcall(loaddata, map)
	if not success or not mapdata.images then
		addmaintenancecat('Page avec des données de géolocalisation non supportées')
	end
	local name = mapdata.name or '?'

	-- analyse linguistique pour le texte de la carte
	local datagender = mapdata.genre or ''
	local gender = string.sub(datagender, 1, 1) -- ms = masculin-singulier, fp = féminin pluriel etc.
	local number = string.sub(datagender, 2, 2)
	local determiner = mapdata.determiner
	local ofstring = linguistic.of(name, gender, number, determiner) -- restitue "de France" ou "du Japon"

	local mapname = mapdata.name
	local file = mapdata.images[maptype] or mapdata.images['default']  or mapdata.images[1]
	if not file then
		 file = mapdata.images['default']
	end
	local alt = 'voir sur la carte ' .. ofstring

	local map = mw.html.create('div')
		:css(divstyle)
		:addClass("geobox")
		:wikitext(caption or ('Localisation sur la carte ' .. ofstring))
		:tag('table')
			:addClass('DebutCarte')
			:attr({border="0", cellspacing="0", cellpadding="0"})
			:css({margin = '0', border = 'none', padding = '0'})
				:tag('tr')
					:tag('td')
						:tag('div')
							:css({position= 'relative', margin = "auto", width = '100%', ['text-align'] = 'right' })
							:wikitext('[[File:' .. file .. '|frameless|' .. width .. 'px' .. '|' .. alt .. ']]' )
	
	for i, j in pairs(pointtable) do -- pour chque point à placer, do
		map:node(placepoint(mapdata,j))
	end
	return map:done():done():done():done()
end

function p.multimap(params)
	local maplist = params.maplist
	if type(maplist) == 'string' then
		maplist = mw.text.split(maplist, '/', true)
	end
	local maptype = params.maptype -- à retravailler pour quand on veut la même région, mais avec plusieurs types de carte
	local width = params.width
	local pointtable = params.pointtable
	local caption = params.caption
	if not pointtable then -- pointtable est la liste des points à placer, mais lorsqu'il n'y a qu'un seul point, on peut avoir des paramètres distinctions :  
		pointtable = {{latitude = params.latitude, longitude = params.longitude, pointtype = params.pointtype}}
	end
	-- traitement de la largeur
	if width and tonumber(width) then
		width = tonumber(width)
	else
		width = 280
	end-- si pas un nombre, erreur ?
	local div =  mw.html.create('div'):addClass('img_toogle')
	
	-- met la carte à afficher par défaut à la fin, pour qu'elle soit affichée en premier
	table.insert(maplist, maplist[1])
	table.remove(maplist, 1)
	
 	--transition: appel aux [[Modèle:Géolocalisation/]] n en l'absence de données dans le module
	for i, j in pairs(maplist) do
		if j == '' then break end
		local success, data = pcall(loaddata, j) 
		if not success then
		 	local mapliststring = ''
		 	for i, j in pairs(maplist) do
		 		mapliststring = j .. '/' .. mapliststring
		 	end
			return mw.getCurrentFrame():expandTemplate{ title = 'Infobox/Géolocalisation multiple/transition', args = {['géolocalisation'] = mapliststring, type = maptype, latitude = params.latitude, longitude = params.longitude }}
	.. '[[Catégorie:Page avec des données de géolocalisation non supportées]]'
		end
	end
	for i, j in pairs(maplist) do
		if j == '' then break end
		local newmap = buildmap( j, maptype, width, pointtable, caption)
		div:node(newmap)
	end
	return div
end

function p.map(frame)
	local args = frame.args
	-- utilisation du franaçs
	args.maplist =  mw.text.split( args.carte, '/', true)
	return p.multimap(args)
end
return p