async function optionsCensusSingleFieldMap(
tableID,
fieldName,
regionID,
subRegionType,
options = {}
) {
options = addDefaults(options, {
maxRadius: 150,
isAbsolute: false,
maxLabelCount: 10
});
const tableData = await getTableData(tableID);
const subRegionIDList = getSubRegionIDList(regionID, subRegionType);
const regionIDToPInfo = tableData
.filter(function(datum) {
return subRegionIDList.includes(datum.id);
})
.reduce(function(regionIDToPInfo, datum) {
const total = datum['Total Population']
? datum['Total Population']
: datum['Total Households'];
regionIDToPInfo[datum.id] = {
p: datum[fieldName] / total,
n: datum[fieldName],
total: total
};
return regionIDToPInfo;
}, {});
const maxTotal = sum(
Object.values(regionIDToPInfo).map(d =>
options.isAbsolute ? d.total : d.n
)
);
const nList = Object.values(regionIDToPInfo)
.map(d => d.n)
.sort((a, b) => b - a);
const nMaxLabel = nList[options.maxLabelCount];
const nToRadius = n => options.maxRadius * Math.sqrt(n / maxTotal);
const maxLabelRadius = nToRadius(nMaxLabel);
options = addDefaults(options, {
funcDataToRadius: function(data) {
const regionID = data.properties.id;
const pInfo = regionIDToPInfo[regionID];
return nToRadius(pInfo.n);
},
funcDataToColor: function(data) {
const regionID = data.properties.id;
const pInfo = regionIDToPInfo[regionID];
const [h, s, l, a] = [
FIELD_TO_HUE[fieldName] ? FIELD_TO_HUE[fieldName] : 0,
100,
20 + 80 * (1 - pInfo.p),
0.5
];
return hsla(h, s, l, a);
}
});
options = addDefaults(options, {
funcDrawLabel: function(data, svg, [x, y], options) {
const r = options.funcDataToRadius(data);
if (r < maxLabelRadius) {
return;
}
drawText(
svg,
[x, y - DEFAULT_STYLE.fontSize * 0.8],
data.properties.name,
{
fill: 'black',
fontSize: DEFAULT_STYLE.fontSize / 2
}
);
const regionID = data.properties.id;
const pInfo = regionIDToPInfo[regionID];
drawText(svg, [x, y], formatPercent(pInfo.p), {
fill: 'black',
fontSize: DEFAULT_STYLE.fontSize
});
drawText(
svg,
[x, y + DEFAULT_STYLE.fontSize * 0.8],
formatNumberHuman(pInfo.n),
{
fill: 'black',
fontSize: DEFAULT_STYLE.fontSize / 2
}
);
},
kicker: await getTableLabel(tableID),
title: getRegionLabel(regionID),
subTitle: fieldName + ' by ' + REGION_TYPE_TO_NAME[subRegionType],
footer: '2012 Census of Sri Lanka (https://www.statistics.gov.lk)'
});
return options;
}