diff --git a/package-lock.json b/package-lock.json index 234a5ebe651017e65545b9e93a4baef0558d7e98..18d2a11b91b02bad97cbf6ea8f68d513f38a8949 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26836,6 +26836,11 @@ "use-debounce": "^5.1.0" } }, + "simple-statistics": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/simple-statistics/-/simple-statistics-7.7.0.tgz", + "integrity": "sha512-TAsZRUJ7FD/yCnm5UBgyWU7bP1gOPsw9n/dVrE8hQ+BF1zJPgDJ5X/MOnxG+HE/7nejSpJLJLdmTh7bkfsFkRw==" + }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", diff --git a/package.json b/package.json index 2c54ef5d8d40cf2ac2a6fb04d9f856d6205338d6..56b7599fec6691c6b9f7628ad907d01b1ed457f1 100644 --- a/package.json +++ b/package.json @@ -77,6 +77,7 @@ "reselect": "^4.0.0", "rxjs": "^7.2.0", "simple-react-lightbox": "^3.6.4", + "simple-statistics": "^7.7.0", "swagger-ui-express": "^4.1.6", "victory": "^0.26.1" }, diff --git a/src/client/components/facet_results/Deck.js b/src/client/components/facet_results/Deck.js index fc80488448ddbd45b933e1dedef3233c962127f4..c9809992be4d347907522bd130ae0e2c4f0fc7a9 100644 --- a/src/client/components/facet_results/Deck.js +++ b/src/client/components/facet_results/Deck.js @@ -199,7 +199,7 @@ class Deck extends React.Component { filled: true, lineWidthMinPixels: 1, getPolygon: d => d.polygon, - getFillColor: d => [255, 0, 0, d.instanceCountScaled], + getFillColor: d => d.choroplethColor, getLineColor: [80, 80, 80], getLineWidth: 1 }) diff --git a/src/server/sparql/Mappers.js b/src/server/sparql/Mappers.js index eafd6af3173e5f0628634fc0e044583152b97ecc..9cb6be2d62bfac94220f91bc1fbc4f5024340f8e 100644 --- a/src/server/sparql/Mappers.js +++ b/src/server/sparql/Mappers.js @@ -1,5 +1,6 @@ import { has, cloneDeep } from 'lodash' import { getTreeFromFlatData } from '@nosferatu500/react-sortable-tree' +import { ckmeans } from 'simple-statistics' export const mapPlaces = sparqlBindings => { const results = sparqlBindings.map(b => { @@ -307,8 +308,10 @@ const mergeDataItems = (itemA, itemB) => { } export const toPolygonLayerFormat = ({ data, config }) => { - const scaledData = linearScale({ data, config }) - scaledData.forEach(item => { + // const scaledData = linearScale({ data, config }) + const valuesArray = [] + data.forEach(item => { + valuesArray.push(item.instanceCount) const pointArray = item.polygon.split(' ') const deckGlArray = pointArray.map(point => { const latLng = point.split(',') @@ -319,8 +322,31 @@ export const toPolygonLayerFormat = ({ data, config }) => { }) item.polygon = deckGlArray }) - // const example = scaledData[0].polygon[0][0] - // console.log(typeof example) - // console.log(example) - return scaledData + // Ckmeans algorithm: https://journal.r-project.org/archive/2011-2/RJournal_2011-2_Wang+Song.pdf + const clusters = ckmeans(valuesArray, 8) + data.forEach(item => { + item.choroplethColor = getChoroplethMapColor({ value: Number(item.instanceCount), clusters }) + }) + return data +} + +const getChoroplethMapColor = ({ value, clusters }) => { + // https://colorbrewer2.org/#type=sequential&scheme=YlOrRd&n=8 + const colors = [ + [255, 255, 204], + [255, 237, 160], + [254, 217, 118], + [254, 178, 76], + [253, 141, 60], + [252, 78, 42], + [227, 26, 28], + [177, 0, 38] + ] + let heatmapColor + colors.forEach((color, index) => { + if (value >= Number(clusters[index][0]) && value <= Number(clusters[index][clusters[index].length - 1])) { + heatmapColor = color + } + }) + return heatmapColor } diff --git a/src/server/sparql/sampo/BackendSearchConfig.js b/src/server/sparql/sampo/BackendSearchConfig.js index 0acc9961e010349af566429b3099f7d7657db142..fa8facc77f48314be099882708ac71c1461a038c 100644 --- a/src/server/sparql/sampo/BackendSearchConfig.js +++ b/src/server/sparql/sampo/BackendSearchConfig.js @@ -177,9 +177,7 @@ export const backendSearchConfig = { postprocess: { func: toPolygonLayerFormat, config: { - variable: 'instanceCount', - minAllowed: 0, - maxAllowed: 255 + variable: 'death' } } }, diff --git a/src/server/sparql/sampo/sparql_queries/SparqlQueriesPerspective1.js b/src/server/sparql/sampo/sparql_queries/SparqlQueriesPerspective1.js index 1036173de7e10e1ae1b68b6e8c029df598afa9ea..ab8b508ecbe22de7e509c864b44c40c613572746 100644 --- a/src/server/sparql/sampo/sparql_queries/SparqlQueriesPerspective1.js +++ b/src/server/sparql/sampo/sparql_queries/SparqlQueriesPerspective1.js @@ -607,4 +607,5 @@ export const choroplethQuery = ` } GROUP BY ?id ?prefLabel ?polygon ORDER BY desc(?instanceCount) + # LIMIT 40 `