blob: b670510b58a499d0b3028d625e4dbefd4bb859b6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var fs = require('fs');
var path = require('path');
var inputPath = path.resolve(__dirname, '../data/house-price-area.json');
var outputPath = path.resolve(__dirname, '../data/house-price-area2.json');
var xGridCount = 20;
var yGridCount = 20;
var dimX = 0;
var dimY = 1;
function process() {
var data = readFile(inputPath);
data = JSON.parse(data);
if (!(data instanceof Array)) {
throw new Error('Data should be array');
}
var xMin = Infinity;
var xMax = -Infinity;
var yMin = Infinity;
var yMax = -Infinity;
data.forEach(function (point) {
xMin = Math.min(point[dimX], xMin);
xMax = Math.max(point[dimX], xMax);
yMin = Math.min(point[dimY], yMin);
yMax = Math.max(point[dimY], yMax);
});
console.log('xMin', xMin, 'xMax', xMax, 'yMin', yMin, 'yMax', yMax);
var cellWidth = (xMax - xMin) / xGridCount;
var cellHeight = (yMax - yMin) / yGridCount;
var grids = [];
var gridsSize = [];
data.forEach(function (point) {
var gridXIndex = Math.floor((point[dimX] - xMin) / cellWidth);
var gridYIndex = Math.floor((point[dimY] - yMin) / cellHeight);
var line = grids[gridYIndex] || (grids[gridYIndex] = []);
var cell = line[gridXIndex] || (line[gridXIndex] = []);
cell.push(point);
gridsSize[gridYIndex] = gridsSize[gridYIndex] || [];
gridsSize[gridYIndex][gridXIndex] = gridsSize[gridYIndex][gridXIndex] || [];
gridsSize[gridYIndex][gridXIndex] = cell.length;
});
// Sort for render outline firstly.
for (var i = 0; i < grids.length; i++) {
var line = grids[i];
if (!line || !line.length) {
continue;
}
for (var j = 0; j < line.length; j++) {
var cell = line[j];
if (!cell || !cell.length) {
continue;
}
cell.sort(function (a, b) {
return b.length - a.length;
});
}
}
var output = [];
var hasMore;
do {
hasMore = false;
for (var i = 0; i < grids.length; i++) {
var lines = grids[i];
if (!lines || !lines.length) {
continue;
}
for (var j = 0; j < lines.length; j++) {
var cell = lines[j];
if (!cell || !cell.length) {
continue;
}
var idx = Math.floor(Math.random() * cell.length);
if (idx === cell.length) {
idx--;
}
var point = cell[idx];
cell.splice(idx, 1);
output.push(point);
hasMore |= cell.length > 0;
}
}
} while (hasMore);
output = JSON.stringify(output);
writeToFile(outputPath, output);
console.log('Done.');
}
function readFile(fullFilePath) {
return fs.readFileSync(fullFilePath, {encoding: 'utf-8'});
}
function writeToFile(outputPath, text) {
fs.writeFileSync(outputPath, text, {encoding: 'utf-8'});
}
process();