Module:User:Justinrleung/dial-map-2

From Wiktionary, the free dictionary
Jump to navigation Jump to search

This is a private module sandbox of Justinrleung, for his own experimentation. Items in this module may be added and removed at Justinrleung's discretion; do not rely on this module's stability.


local export = {}

local coord_data = { --lat, long; from Wikipedia (via GeoHack)
	["Beijing"]		= { 39.916667, 116.383333, "北京", "Mandarin" },
	["Taiwan"]		= { 25.033333, 121.633333, "臺灣", "Mandarin" }, --Taipei
	["Tianjin"]		= { 39.133333, 117.183333, "天津", "Mandarin" },
	["Harbin"]		= { 45.75, 126.633333, "哈爾濱", "Mandarin" },
	["Shenyang"]	= { 41.8, 123.4, "沈陽", "Mandarin" },
	["Jinan"]		= { 36.666667, 116.983333, "濟南", "Mandarin" },
	["Muping"]		= { 37.3833, 121.6, "牟平", "Mandarin" },
	["Luoyang"]		= { 34.669722, 112.442222, "洛陽", "Mandarin" },
	["Wanrong"]		= { 35.41895, 110.82805, "萬榮", "Mandarin" }, --萬榮縣東 (Jiedian)
	["Ronghe"]		= { 35.35607, 110.54706, "榮河", "Mandarin" }, --萬榮縣西
	["Xi'an"]		= { 34.266667, 108.9, "西安", "Mandarin" },
	["Qingdao"]		= { 36.066667, 120.383333, "青島", "Mandarin" },
	["Zhengzhou"]	= { 34.766667, 113.65, "鄭州", "Mandarin" },
	["Xining"]		= { 36.633333, 101.766667, "西寧", "Mandarin" },
	["Xuzhou"]		= { 34.26, 117.21, "徐州", "Mandarin" },
	["Yinchuan"]	= { 38.466667, 106.266667, "銀川", "Mandarin" },
	["Lanzhou"]		= { 36.033333, 103.8, "蘭州", "Mandarin" },
	["Ürümqi"]		= { 43.825, 87.6, "烏魯木齊", "Mandarin" },
	["Wuhan"]		= { 30.583333, 114.283333, "武漢", "Mandarin" },
	["Huanggang"]	= { 30.45, 114.8, "黃岡", "Mandarin" },
	["Chengdu"]		= { 30.658611, 104.064722, "成都", "Mandarin" },
	["Guiyang"]		= { 26.65, 106.633333, "貴陽", "Mandarin" },
	["Liuzhou"]		= { 24.316667, 109.383333, "柳州", "Mandarin" },
	["Kunming"]		= { 25.066667, 102.683333, "昆明", "Mandarin" },
	["Yangzhou"]	= { 32.4, 119.416667, "揚州", "Mandarin" },
	["Nanjing"]		= { 32.05, 118.766667, "南京", "Mandarin" },
	["Hefei"]		= { 31.866667, 117.283333, "合肥", "Mandarin" },
	["Nantong"]		= { 31.983333, 120.9, "南通", "Mandarin" },
	["Malaysia-M"]	= { 3.133333, 101.683333, "馬來西亞", "Mandarin" }, --Kuala Lumpur
	["Singapore-M"]	= { 1.3, 103.8, "新加坡", "Mandarin" },
	
	["Guangzhou"]	= { 23.133333, 113.266667, "廣州", "Cantonese" },
	["Hong Kong"]	= { 22.3, 114.2, "香港", "Cantonese" },
	["Shunde"]		= { 22.836389, 113.2525, "順德", "Cantonese" },
	["Zhongshan"]	= { 22.533333, 113.35, "中山", "Cantonese" },
	["Dongguan"]	= { 23.033333, 113.716667, "東莞", "Cantonese" },
	["Taishan"]		= { 22.25, 112.783333, "台山", "Cantonese" },
	["Doumen"]		= { 22.214444, 113.259167, "斗門", "Cantonese" },
	["Kaiping"]		= { 22.366667, 112.683333, "開平", "Cantonese" },
	["Shaoguan"]	= { 24.816667, 113.6, "韶關", "Cantonese" },
	["Yunfu"]		= { 22.933333, 112.033333, "雲浮", "Cantonese" },
	["Yangjiang"]	= { 21.85, 111.966667, "陽江", "Cantonese" },
	["Xinyi"]		= { 22.35, 110.95, "信宜", "Cantonese" },
	["Lianjiang"]	= { 21.733333, 110.283333, "連江", "Cantonese" },
	["Nanning"]		= { 22.816667, 108.316667, "南寧", "Cantonese" },
	
	["Nanchang"]	= { 28.683333, 115.883333, "南昌", "Cantonese" },
	["Lichuan"]		= { 27.26, 116.958056, "黎川", "Cantonese" },
	["Pingxiang"]	= { 27.633333, 113.85, "萍鄉", "Cantonese" },
	
	["Meixian"]		= { 24.321389, 116.119444, "梅縣", "Hakka" },
	["Xingning"]	= { 24.134722, 115.73, "興寧", "Hakka" },
	["Huidong"]		= { 23.033333, 114.933333, "惠東", "Hakka" },
	["Qujiang"]		= { 24.689167, 113.578889, "曲江", "Hakka" },
	["Xiaosanjiang"]= { 24.28357, 112.13284, "小三江", "Hakka" },
	["Changting"]	= { 25.683333, 116.333333, "長汀", "Hakka" },
	["Pingyu"]		= { 25.00262, 115.94047, "坪畬", "Hakka" }, --Minzhu, Wuping
	["Wuping"]		= { 25.133333, 116.083333, "武平", "Hakka" },
	["Liancheng"]	= { 25.566667, 116.783333, "連城", "Hakka" },
	["Ninghua"]		= { 26.233333, 116.6, "寧化", "Hakka" },
	["Yudu"]		= { 25.9575, 115.486944, "雩都", "Hakka" },
	["Ruijin"]		= { 25.8, 116, "瑞金", "Hakka" },
	["Shicheng"]	= { 26.3292, 116.335, "石城", "Hakka" },
	["Shangyou"]	= { 25.961667, 114.353611, "上猶", "Hakka" },
	["Taoyuan"]		= { 24.991278, 121.314328, "桃園", "Hakka" },
	["Miaoli"]		= { 24.563414, 120.825828, "苗栗", "Hakka" },
	["Liudui"]		= { 22.65, 120.5875, "六堆", "Hakka" }, --Neipu
	["Hsinchu"]		= { 24.833333, 121.014722, "新竹", "Hakka" },
	["Dongshi"]		= { 24.258694, 120.828167, "東勢", "Hakka" },
	["Raoping"]		= { 24.322222, 120.844722, "饒平", "Hakka" },
	["Yunlin"]		= { 23.70489, 120.47607, "雲林", "Hakka" },
	
	["Shexian"]		= { 29.87, 118.42, "歙縣", "Hui" },
	["Tunxi"]		= { 29.716667, 118.333333, "屯溪", "Hui" },
	["Jixi"]		= { 30.071111, 118.592222, "績溪", "Hui" },
	
	["Taiyuan"]		= { 37.869444, 112.560278, "太原", "Jin" },
	["Pingyao"]		= { 37.2, 112.15, "平遙", "Jin" },
	["Hohhot"]		= { 40.816667, 111.65, "呼和浩特", "Jin" },
	["Xinzhou"]		= { 38.416667, 112.733333, "忻州", "Jin" },
	
	["Jian'ou"]		= { 27.033333, 118.316667, "建甌", "Min Bei" },
	
	["Fuzhou"]		= { 26.076111, 119.306389, "福州", "Min Dong" },
	["Fuqing"]		= { 25.716667, 119.383333, "福清", "Min Dong" },
	
	["Xiamen"]		= { 24.479836, 118.089419, "廈門", "Min Nan" },
	["Quanzhou"]	= { 24.916667, 118.583333, "泉州", "Min Nan" },
	["Zhangzhou"]	= { 24.516667, 117.65, "漳州", "Min Nan" },
	["Taipei"]		= { 25.059722, 121.514167, "臺北", "Min Nan" }, --Datong
	["Kaohsiung"]	= { 22.633333, 120.266667, "高雄", "Min Nan" },
	["Tainan"]		= { 22.983333, 120.183333, "臺南", "Min Nan" },
	["Taichung"]	= { 24.15, 120.666667, "臺中", "Min Nan" },
	["Yilan"]		= { 24.750556, 121.759167, "宜蘭", "Min Nan" },
	["Lukang"]		= { 24.05, 120.433333, "鹿港", "Min Nan" },
	["Sanxia"]		= { 24.933333, 121.366667, "三峽", "Min Nan" },
	["Kinmen"]		= { 24.44, 118.33, "金門", "Min Nan" },
	["Magong"]		= { 23.566667, 119.583333, "馬公", "Min Nan" },
	["Hsinchu-MN"]	= { 24.816667, 120.983333, "新竹", "Min Nan" },
	["Malaysia-MN"]	= { 5.4, 100.233333, "馬來西亞﹣檳城", "Min Nan" }, --Penang
	["Singapore-MN"]	= { 1.3, 103.8, "新加坡", "Min Nan" },
	["Philippine-MN"]	= { 14.58, 121, "菲律賓﹣馬尼拉", "Min Nan" }, --Manila
	["Chaozhou"]	= { 23.67, 116.63, "潮州", "Min Nan" },
	["Shantou"]		= { 23.35, 116.666667, "汕頭", "Min Nan" },
	["Thailand-MN-T"]	= { 13.75, 100.466667, "泰國﹣曼谷", "Min Nan" }, --Bangkok
	["Haikou"]		= { 20.042778, 110.341667, "海口", "Min Nan" },
	["Leizhou"]		= { 20.916667, 110.1, "雷州", "Min Nan" },
	
	["Nanning-P"]	= { 22.816667, 108.316667, "南寧", "Pinghua" },
	
	["Shanghai"]	= { 31.228611, 121.474722, "上海", "Wu" },
	["Suzhou"]		= { 31.3, 120.6, "蘇州", "Wu" },
	["Hangzhou"]	= { 30.25, 120.166667, "杭州", "Wu" },
	["Wenzhou"]		= { 28, 120.7, "溫州", "Wu" },
	["Chongming"]	= { 31.666667, 121.5, "崇明", "Wu" },
	["Danyang"]		= { 32, 119.586, "丹陽", "Wu" },
	["Jinhua"]		= { 29.083333, 119.65, "金華", "Wu" },
	["Tangxi"]		= { 29.05, 119.39, "湯溪", "Wu" },
	["Ningbo"]		= { 29.866667, 121.55, "寧波", "Wu" },
	
	["Changsha"]	= { 28.196111, 112.972222, "長沙", "Xiang" },
	["Shuangfeng"]	= { 27.452, 112.202, "雙峰", "Xiang" },
	["Xiangtan"]	= { 27.85, 112.9, "湘潭", "Xiang" },
	["Loudi"]		= { 27.733333, 112, "婁底", "Xiang" },
}

local dots = {
	"008a37", "6c00bb", "00c02c", "010ca9", "b9ff5b", 
	"c700be", "02c860", "8a64ff", "ffcb29", "0153cb", 
	"ffff7d", "740088", "6bffa0", "440061", "bfa500", 
	"f489ff", "2b5000", "ff5ec9", "23fffd", "ff1d67", 
	"93ffde", "e60064", "019e85", "ff4990", "004f1d", 
	"ffa1f8", "002607", "ff71ba", "005046", "a60075", 
	"ecfffa", "1f003b", "ffd39a", "001a5b", "ae6e00", 
	"7fa4ff", "830e00", "0163a6", "a70024", "dcd3ff", 
	"03001a", "ffc3b6", "270016", "ff9587", "004664", 
	"940048", "2f2b00", "570023", "604500", "531c00"
}

function export.make_map(frame)
	local syn_data = require("Module:zh/data/dial-syn/" .. frame.args[1]).list
	local map = [=[
		<div class="thumb tnone" style="margin-left: auto; margin-right:auto; width:800px; max-width:1808px;">
		<div class="thumbinner"><div class="overflowbugx" style="height:600px;width:800px;overflow:auto;">
		<div style="position:relative;top:0;left:0">
		<div style="position:relative;top:0;left:0;line-height:0">[[File:Chinese dialectal variation location map.svg|1200px|link=]]</div>
		]=]
	local prelim_data, data, points, legend = {}, {}, {}, {}
	local num = 1
	for location, synonym_set in pairs(syn_data) do
		if coord_data[location] and synonym_set[1] ~= "" then
			for _, term in ipairs(synonym_set) do
				if prelim_data[term] then
					prelim_data[term].count = prelim_data[term].count + 1
					table.insert(prelim_data[term].locations, location)
				else
					prelim_data[term] = { count = 1, locations = { location } }
				end
			end
		end
	end
	for term, term_data in pairs(prelim_data) do
		table.insert(data, { term = term, count = term_data.count, locations = term_data.locations })
	end
	table.sort(data, function(first, second) return first.count > second.count end)
	
	for _, d in ipairs(data) do
		num = (num < #dots) and num + 1 or 1
		for _, location in ipairs(d.locations) do
			local loc_info = coord_data[location]
			local rand = math.random(-300, 300) / 100
			local top = ((55 - loc_info[1]) * 1200 * 740 / 799 / 70) - 4.5 + rand
			local left = ((loc_info[2] - 70) * 1200 / 75) - 4.5 + rand
			table.insert(points,
				tostring( mw.html.create( "div" )
					:css( "position", "absolute" )
					:css( "top", top .. "px" )
					:css( "left", left .. "px" )
					:css( "margin", "auto" )
					:css( "padding", "3px 3px" )
					:css( "border-radius", "20px" )
					:css( "background-color", "#" .. dots[num] )
					:css( "cursor", "help" )
					:attr( "title", location .. " (" .. loc_info[3] .. ") " .. loc_info[4] .. ": " .. d.term )))
		end
		table.insert(legend, 
			tostring( mw.html.create( "div" )
				:css( "display", "inline-block" )
				:css( "width", "10px" )
				:css( "height", "10px" )
				:css( "border-radius", "20px" )
				:css( "background-color", "#" .. dots[num] )) .. "[[" .. d.term .. "]]")
	end

	map = map .. table.concat(points) .. '</div></div></div>' ..
		'<div style="column-count:5;-moz-column-count:5;-webkit-column-count:5">' ..
		table.concat(legend, "<br>") .. "</div>"
		
	return map
end

return export