Merge pull request #3854 from panda01/fix/3784/tilemap-scaled-markers

Fix/3784/tilemap scaled markers
This commit is contained in:
Rashid Khan 2015-05-18 08:42:55 -07:00
commit 94a523ea3c
2 changed files with 60 additions and 17 deletions

View file

@ -307,14 +307,19 @@ define(function (require) {
// super min and max from all chart data
var min = mapData.properties.allmin;
var max = mapData.properties.allmax;
var zoom = map.getZoom();
var precision = mapData.properties.precision;
// multiplier to reduce size of all circles
var scaleFactor = 0.6;
var radiusScaler = 2.5;
var featureLayer = L.geoJson(mapData, {
pointToLayer: function (feature, latlng) {
var count = feature.properties.count;
var scaledRadius = self.radiusScale(count, max, feature) * 2;
return L.circle(latlng, scaledRadius);
var scaledRadius = self.radiusScale(count, max, zoom, precision) * scaleFactor;
return L.circleMarker(latlng).setRadius(scaledRadius);
},
onEachFeature: function (feature, layer) {
self.bindPopup(feature, layer);
@ -350,10 +355,13 @@ define(function (require) {
var min = mapData.properties.allmin;
var max = mapData.properties.allmax;
// multiplier to reduce size of all circles
var scaleFactor = 0.8;
var featureLayer = L.geoJson(mapData, {
pointToLayer: function (feature, latlng) {
var count = feature.properties.count;
var radius = self.geohashMinDistance(feature);
var radius = self.geohashMinDistance(feature) * scaleFactor;
return L.circle(latlng, radius);
},
onEachFeature: function (feature, layer) {
@ -593,22 +601,29 @@ define(function (require) {
/**
* radiusScale returns a number for scaled circle markers
* approx. square root of count
* which is multiplied by a factor based on the geohash precision
* square root of count / max
* multiplied by a value based on map zoom
* multiplied by a value based on data precision
* for relative sizing of markers
*
* @method radiusScale
* @param count {Number}
* @param max {Number}
* @param zoom {Number}
* @param precision {Number}
* @return {Number}
*/
TileMap.prototype.radiusScale = function (count, max, feature) {
TileMap.prototype.radiusScale = function (count, max, zoom, precision) {
// exp = 0.5 for square root ratio
// exp = 1 for linear ratio
var exp = 0.6;
var maxr = this.geohashMinDistance(feature);
return Math.pow(count, exp) / Math.pow(max, exp) * maxr;
var exp = 0.5;
var precisionBiasNumerator = 200;
var precisionBiasBase = 5;
var pct = count / max;
var constantZoomRadius = 0.5 * Math.pow(2, zoom);
var precisionScale = precisionBiasNumerator / Math.pow(precisionBiasBase, precision);
return Math.pow(pct, exp) * constantZoomRadius * precisionScale;
};
/**

View file

@ -174,13 +174,41 @@ define(function (require) {
});
describe('radiusScale method', function () {
it('should return a number', function () {
vis.handler.charts.forEach(function (chart) {
var count = Math.random() * 50;
var max = 50;
var precision = 1;
var feature = chart.chartData.geoJson.features[0];
expect(_.isNumber(chart.radiusScale(count, max, feature))).to.be(true);
var countdata = [0, 10, 20, 30, 40, 50, 60];
var max = 60;
var zoom = _.random(1, 18);
var constantZoomRadius = 0.5 * Math.pow(2, zoom);
var precision = _.random(1, 12);
var precisionScale = 200 / Math.pow(5, precision);
var prev = -1;
it('test array should return a number equal to radius', function () {
countdata.forEach(function (data, i) {
vis.handler.charts.forEach(function (chart) {
var count = data;
var pct = count / max;
var exp = 0.5;
var radius = Math.pow(pct, exp) * constantZoomRadius * precisionScale;
var test = chart.radiusScale(count, max, zoom, precision);
expect(test).to.be.a('number');
expect(test).to.be(radius);
});
});
});
it('test array should return a radius greater than previous', function () {
countdata.forEach(function (data, i) {
vis.handler.charts.forEach(function (chart) {
var count = data;
var pct = count / max;
var exp = 0.5;
var radius = Math.pow(pct, exp) * constantZoomRadius * precisionScale;
var test = chart.radiusScale(count, max, zoom, precision);
expect(test).to.be.above(prev);
prev = chart.radiusScale(count, max, zoom, precision);
});
});
});
});
@ -230,4 +258,4 @@ define(function (require) {
});
});
});
});