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