@@ -15,17 +15,27 @@ 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
+ if ( d . lonlat [ 0 ] === BADNUM ) {
31
+ d3 . select ( node ) . remove ( ) ;
32
+ }
33
+ }
34
+
35
+ for ( var i = 0 ; i < calcData . length ; i ++ ) {
36
+ fillLocationLonLat ( calcData [ i ] , geo . topojson ) ;
37
+ }
38
+
29
39
var gScatterGeoTraces = geo . framework . select ( '.scattergeolayer' )
30
40
. selectAll ( 'g.trace.scattergeo' )
31
41
. data ( calcData , keyFunc ) ;
@@ -39,27 +49,11 @@ module.exports = function plot(geo, calcData) {
39
49
gScatterGeoTraces . selectAll ( '*' ) . remove ( ) ;
40
50
41
51
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
- }
52
+ var s = d3 . select ( this ) ;
53
+ var trace = calcTrace [ 0 ] . trace ;
60
54
61
55
if ( subTypes . hasLines ( trace ) || trace . fill !== 'none' ) {
62
- var lineCoords = geoJsonUtils . calcTraceToLineCoords ( _calcTrace ) ;
56
+ var lineCoords = geoJsonUtils . calcTraceToLineCoords ( calcTrace ) ;
63
57
64
58
var lineData = ( trace . fill !== 'none' ) ?
65
59
geoJsonUtils . makePolygon ( lineCoords , trace ) :
@@ -72,66 +66,39 @@ module.exports = function plot(geo, calcData) {
72
66
}
73
67
74
68
if ( subTypes . hasMarkers ( trace ) ) {
75
- s . selectAll ( 'path.point' ) . data ( _calcTrace )
76
- . enter ( ) . append ( 'path' )
77
- . classed ( 'point' , true ) ;
69
+ s . selectAll ( 'path.point' )
70
+ . data ( Lib . identity )
71
+ . enter ( ) . append ( 'path' )
72
+ . classed ( 'point' , true )
73
+ . each ( function ( calcPt ) { removeBADNUM ( calcPt , this ) ; } ) ;
78
74
}
79
75
80
76
if ( subTypes . hasText ( trace ) ) {
81
- s . selectAll ( 'g' ) . data ( _calcTrace )
77
+ s . selectAll ( 'g' )
78
+ . data ( Lib . identity )
82
79
. enter ( ) . append ( 'g' )
83
- . append ( 'text' ) ;
80
+ . append ( 'text' )
81
+ . each ( function ( calcPt ) { removeBADNUM ( calcPt , this ) ; } ) ;
84
82
}
85
83
} ) ;
86
84
87
85
// call style here within topojson request callback
88
86
style ( geo ) ;
89
87
} ;
90
88
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 ;
89
+ function fillLocationLonLat ( calcTrace , topojson ) {
90
+ var trace = calcTrace [ 0 ] . trace ;
96
91
97
- return function ( calcPt ) {
98
- var feature = locationToFeature ( locationmode , calcPt . loc , features ) ;
92
+ if ( ! Array . isArray ( trace . locations ) ) return ;
99
93
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
- }
94
+ var features = getTopojsonFeatures ( trace , topojson ) ;
95
+ var locationmode = trace . locationmode ;
111
96
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
- }
97
+ for ( var i = 0 ; i < calcTrace . length ; i ++ ) {
98
+ var calcPt = calcTrace [ i ] ;
99
+ var feature = locationToFeature ( locationmode , calcPt . loc , features ) ;
126
100
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' ) ;
101
+ calcPt . lonlat = feature ? feature . properties . ct : [ BADNUM , BADNUM ] ;
135
102
}
136
103
}
137
104
0 commit comments