@@ -15,17 +15,28 @@ var Drawing = require('../../components/drawing');
15
15
var Color = require ( '../../components/color' ) ;
16
16
17
17
var Lib = require ( '../../lib' ) ;
18
+ var BADNUM = require ( '../../constants/numerical' ) . BADNUM ;
18
19
var getTopojsonFeatures = require ( '../../lib/topojson_utils' ) . getTopojsonFeatures ;
19
20
var locationToFeature = require ( '../../lib/geo_location_utils' ) . locationToFeature ;
20
21
var geoJsonUtils = require ( '../../lib/geojson_utils' ) ;
21
- var arrayToCalcItem = require ( '../../lib/array_to_calc_item' ) ;
22
22
var subTypes = require ( '../scatter/subtypes' ) ;
23
23
24
24
25
25
module . exports = function plot ( geo , calcData ) {
26
26
27
27
function keyFunc ( d ) { return d [ 0 ] . trace . uid ; }
28
28
29
+ function removeBADNUM ( d , node ) {
30
+ var lonlat = d . lonlat ;
31
+ if ( lonlat [ 0 ] === BADNUM || lonlat [ 1 ] === BADNUM ) {
32
+ d3 . select ( node ) . remove ( ) ;
33
+ }
34
+ }
35
+
36
+ for ( var i = 0 ; i < calcData . length ; i ++ ) {
37
+ fillLocationLonLat ( calcData [ i ] , geo . topojson ) ;
38
+ }
39
+
29
40
var gScatterGeoTraces = geo . framework . select ( '.scattergeolayer' )
30
41
. selectAll ( 'g.trace.scattergeo' )
31
42
. data ( calcData , keyFunc ) ;
@@ -39,27 +50,11 @@ module.exports = function plot(geo, calcData) {
39
50
gScatterGeoTraces . selectAll ( '*' ) . remove ( ) ;
40
51
41
52
gScatterGeoTraces . each ( function ( calcTrace ) {
42
- var s = d3 . select ( this ) ,
43
- trace = calcTrace [ 0 ] . trace ,
44
- convertToLonLatFn = makeConvertToLonLatFn ( trace , geo . topojson ) ;
45
-
46
- // skip over placeholder traces
47
- if ( calcTrace [ 0 ] . placeholder ) s . remove ( ) ;
48
-
49
- // just like calcTrace but w/o not-found location datum
50
- var _calcTrace = [ ] ;
51
-
52
- for ( var i = 0 ; i < calcTrace . length ; i ++ ) {
53
- var _calcPt = convertToLonLatFn ( calcTrace [ i ] ) ;
54
-
55
- if ( _calcPt ) {
56
- arrayItemToCalcdata ( trace , calcTrace [ i ] , i ) ;
57
- _calcTrace . push ( _calcPt ) ;
58
- }
59
- }
53
+ var s = d3 . select ( this ) ;
54
+ var trace = calcTrace [ 0 ] . trace ;
60
55
61
56
if ( subTypes . hasLines ( trace ) || trace . fill !== 'none' ) {
62
- var lineCoords = geoJsonUtils . calcTraceToLineCoords ( _calcTrace ) ;
57
+ var lineCoords = geoJsonUtils . calcTraceToLineCoords ( calcTrace ) ;
63
58
64
59
var lineData = ( trace . fill !== 'none' ) ?
65
60
geoJsonUtils . makePolygon ( lineCoords , trace ) :
@@ -72,66 +67,39 @@ module.exports = function plot(geo, calcData) {
72
67
}
73
68
74
69
if ( subTypes . hasMarkers ( trace ) ) {
75
- s . selectAll ( 'path.point' ) . data ( _calcTrace )
76
- . enter ( ) . append ( 'path' )
77
- . classed ( 'point' , true ) ;
70
+ s . selectAll ( 'path.point' )
71
+ . data ( Lib . identity )
72
+ . enter ( ) . append ( 'path' )
73
+ . classed ( 'point' , true )
74
+ . each ( function ( calcPt ) { removeBADNUM ( calcPt , this ) ; } ) ;
78
75
}
79
76
80
77
if ( subTypes . hasText ( trace ) ) {
81
- s . selectAll ( 'g' ) . data ( _calcTrace )
78
+ s . selectAll ( 'g' )
79
+ . data ( Lib . identity )
82
80
. enter ( ) . append ( 'g' )
83
- . append ( 'text' ) ;
81
+ . append ( 'text' )
82
+ . each ( function ( calcPt ) { removeBADNUM ( calcPt , this ) ; } ) ;
84
83
}
85
84
} ) ;
86
85
87
86
// call style here within topojson request callback
88
87
style ( geo ) ;
89
88
} ;
90
89
91
- function makeConvertToLonLatFn ( trace , topojson ) {
92
- if ( ! Array . isArray ( trace . locations ) ) return Lib . identity ;
93
-
94
- var features = getTopojsonFeatures ( trace , topojson ) ,
95
- locationmode = trace . locationmode ;
90
+ function fillLocationLonLat ( calcTrace , topojson ) {
91
+ var trace = calcTrace [ 0 ] . trace ;
96
92
97
- return function ( calcPt ) {
98
- var feature = locationToFeature ( locationmode , calcPt . loc , features ) ;
93
+ if ( ! Array . isArray ( trace . locations ) ) return ;
99
94
100
- if ( feature ) {
101
- calcPt . lonlat = feature . properties . ct ;
102
- return calcPt ;
103
- }
104
- else {
105
- // mutate gd.calcdata so that hoverPoints knows to skip this datum
106
- calcPt . lonlat = [ null , null ] ;
107
- return false ;
108
- }
109
- } ;
110
- }
95
+ var features = getTopojsonFeatures ( trace , topojson ) ;
96
+ var locationmode = trace . locationmode ;
111
97
112
- function arrayItemToCalcdata ( trace , calcItem , i ) {
113
- var marker = trace . marker ;
114
-
115
- function merge ( traceAttr , calcAttr ) {
116
- arrayToCalcItem ( traceAttr , calcItem , calcAttr , i ) ;
117
- }
118
-
119
- merge ( trace . text , 'tx' ) ;
120
- merge ( trace . textposition , 'tp' ) ;
121
- if ( trace . textfont ) {
122
- merge ( trace . textfont . size , 'ts' ) ;
123
- merge ( trace . textfont . color , 'tc' ) ;
124
- merge ( trace . textfont . family , 'tf' ) ;
125
- }
98
+ for ( var i = 0 ; i < calcTrace . length ; i ++ ) {
99
+ var calcPt = calcTrace [ i ] ;
100
+ var feature = locationToFeature ( locationmode , calcPt . loc , features ) ;
126
101
127
- if ( marker && marker . line ) {
128
- var markerLine = marker . line ;
129
- merge ( marker . opacity , 'mo' ) ;
130
- merge ( marker . symbol , 'mx' ) ;
131
- merge ( marker . color , 'mc' ) ;
132
- merge ( marker . size , 'ms' ) ;
133
- merge ( markerLine . color , 'mlc' ) ;
134
- merge ( markerLine . width , 'mlw' ) ;
102
+ calcPt . lonlat = feature ? feature . properties . ct : [ BADNUM , BADNUM ] ;
135
103
}
136
104
}
137
105
0 commit comments