| /* | |
| * 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(); |