Skip to content

Commit 2a91da6

Browse files
committed
set lonlat to [BADNUM, BADNUM] if lon OR lat is non-numeric
- to improve performance in check downstream - add calc tests to scattergeo_test.js
1 parent 1196fd3 commit 2a91da6

File tree

2 files changed

+140
-5
lines changed

2 files changed

+140
-5
lines changed

src/traces/scattergeo/calc.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,12 @@ module.exports = function calc(gd, trace) {
2626
if(hasLocationData) {
2727
var loc = trace.locations[i];
2828
calcPt.loc = typeof loc === 'string' ? loc : null;
29-
}
30-
else {
29+
} else {
3130
var lon = trace.lon[i];
3231
var lat = trace.lat[i];
33-
calcPt.lonlat = new Array(2);
3432

35-
calcPt.lonlat[0] = isNumeric(lon) ? +lon : BADNUM;
36-
calcPt.lonlat[1] = isNumeric(lat) ? +lat : BADNUM;
33+
if(isNumeric(lon) && isNumeric(lat)) calcPt.lonlat = [+lon, +lat];
34+
else calcPt.lonlat = [BADNUM, BADNUM];
3735
}
3836
}
3937

test/jasmine/tests/scattergeo_test.js

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
var Plots = require('@src/plots/plots');
2+
var Lib = require('@src/lib');
3+
var BADNUM = require('@src/constants/numerical').BADNUM;
4+
15
var ScatterGeo = require('@src/traces/scattergeo');
26

37

@@ -69,18 +73,151 @@ describe('Test scattergeo defaults', function() {
6973
});
7074
});
7175

76+
describe('Test scattergeo calc', function() {
77+
78+
function _calc(opts) {
79+
var base = { type: 'scattermapbox' };
80+
var trace = Lib.extendFlat({}, base, opts);
81+
var gd = { data: [trace] };
82+
83+
Plots.supplyDefaults(gd);
84+
85+
var fullTrace = gd._fullData[0];
86+
return ScatterGeo.calc(gd, fullTrace);
87+
}
88+
89+
it('should place lon/lat data in lonlat pairs', function() {
90+
var calcTrace = _calc({
91+
lon: [10, 20, 30],
92+
lat: [20, 30, 10]
93+
});
94+
95+
expect(calcTrace).toEqual([
96+
{ lonlat: [10, 20] },
97+
{ lonlat: [20, 30] },
98+
{ lonlat: [30, 10] }
99+
]);
100+
});
101+
102+
it('should coerce numeric strings lon/lat data into numbers', function() {
103+
var calcTrace = _calc({
104+
lon: [10, 20, '30', '40'],
105+
lat: [20, '30', 10, '50']
106+
});
107+
108+
expect(calcTrace).toEqual([
109+
{ lonlat: [10, 20] },
110+
{ lonlat: [20, 30] },
111+
{ lonlat: [30, 10] },
112+
{ lonlat: [40, 50] }
113+
]);
114+
});
115+
116+
it('should set non-numeric values lon/lat pairs to BADNUM', function() {
117+
var calcTrace = _calc({
118+
lon: [null, 10, null, null, 20, '30', null, '40', null, 10],
119+
lat: [10, 20, '30', null, 10, '50', null, 60, null, null]
72120
});
73121

122+
expect(calcTrace).toEqual([
123+
{ lonlat: [BADNUM, BADNUM] },
124+
{ lonlat: [10, 20] },
125+
{ lonlat: [BADNUM, BADNUM] },
126+
{ lonlat: [BADNUM, BADNUM] },
127+
{ lonlat: [20, 10] },
128+
{ lonlat: [30, 50] },
129+
{ lonlat: [BADNUM, BADNUM] },
130+
{ lonlat: [40, 60] },
131+
{ lonlat: [BADNUM, BADNUM] },
132+
{ lonlat: [BADNUM, BADNUM] }
133+
]);
134+
});
74135

136+
it('should fill array text (base case)', function() {
137+
var calcTrace = _calc({
138+
lon: [10, 20, 30, null, 40],
139+
lat: [20, 30, 10, 'no-good', 50],
140+
text: ['A', 'B', 'C', 'D', 'E']
75141
});
76142

143+
expect(calcTrace).toEqual([
144+
{ lonlat: [10, 20], tx: 'A' },
145+
{ lonlat: [20, 30], tx: 'B' },
146+
{ lonlat: [30, 10], tx: 'C' },
147+
{ lonlat: [BADNUM, BADNUM], tx: 'D' },
148+
{ lonlat: [40, 50], tx: 'E' }
149+
]);
150+
});
77151

152+
it('should fill array text (invalid entry case)', function() {
153+
var calcTrace = _calc({
154+
lon: [10, 20, 30, null, 40],
155+
lat: [20, 30, 10, 'no-good', 50],
156+
text: ['A', null, 'C', 'D', {}]
78157
});
79158

159+
expect(calcTrace).toEqual([
160+
{ lonlat: [10, 20], tx: 'A' },
161+
{ lonlat: [20, 30], tx: null },
162+
{ lonlat: [30, 10], tx: 'C' },
163+
{ lonlat: [BADNUM, BADNUM], tx: 'D' },
164+
{ lonlat: [40, 50], tx: {} }
165+
]);
166+
});
80167

168+
it('should fill array marker attributes (base case)', function() {
169+
var calcTrace = _calc({
170+
lon: [10, 20, null, 30],
171+
lat: [20, 30, null, 10],
172+
marker: {
173+
color: ['red', 'blue', 'green', 'yellow'],
174+
size: [10, 20, 8, 10]
175+
}
176+
});
81177

178+
expect(calcTrace).toEqual([
179+
{ lonlat: [10, 20], mc: 'red', ms: 10 },
180+
{ lonlat: [20, 30], mc: 'blue', ms: 20 },
181+
{ lonlat: [BADNUM, BADNUM], mc: 'green', ms: 8 },
182+
{ lonlat: [30, 10], mc: 'yellow', ms: 10 }
183+
]);
184+
});
82185

186+
it('should fill array marker attributes (invalid scale case)', function() {
187+
var calcTrace = _calc({
188+
lon: [10, 20, null, 30],
189+
lat: [20, 30, null, 10],
190+
marker: {
191+
color: [0, null, 5, 10],
192+
size: [10, NaN, 8, 10],
193+
colorscale: [
194+
[0, 'blue'], [0.5, 'red'], [1, 'green']
195+
]
196+
}
83197
});
198+
199+
expect(calcTrace).toEqual([
200+
{ lonlat: [10, 20], mc: 0, ms: 10 },
201+
{ lonlat: [20, 30], mc: null, ms: NaN },
202+
{ lonlat: [BADNUM, BADNUM], mc: 5, ms: 8 },
203+
{ lonlat: [30, 10], mc: 10, ms: 10 }
204+
]);
84205
});
85206

207+
it('should fill marker attributes (symbol case)', function() {
208+
var calcTrace = _calc({
209+
lon: [10, 20, null, 30],
210+
lat: [20, 30, null, 10],
211+
marker: {
212+
symbol: ['cross', 'square', 'diamond', null]
213+
}
214+
});
215+
216+
expect(calcTrace).toEqual([
217+
{ lonlat: [10, 20], mx: 'cross' },
218+
{ lonlat: [20, 30], mx: 'square' },
219+
{ lonlat: [BADNUM, BADNUM], mx: 'diamond' },
220+
{ lonlat: [30, 10], mx: null }
221+
]);
222+
});
86223
});

0 commit comments

Comments
 (0)