@@ -15,17 +15,27 @@ var Drawing = require('../../components/drawing');
1515var Color = require ( '../../components/color' ) ;
1616
1717var Lib = require ( '../../lib' ) ;
18+ var BADNUM = require ( '../../constants/numerical' ) . BADNUM ;
1819var getTopojsonFeatures = require ( '../../lib/topojson_utils' ) . getTopojsonFeatures ;
1920var locationToFeature = require ( '../../lib/geo_location_utils' ) . locationToFeature ;
2021var geoJsonUtils = require ( '../../lib/geojson_utils' ) ;
21- var arrayToCalcItem = require ( '../../lib/array_to_calc_item' ) ;
2222var subTypes = require ( '../scatter/subtypes' ) ;
2323
2424
2525module . exports = function plot ( geo , calcData ) {
2626
2727 function keyFunc ( d ) { return d [ 0 ] . trace . uid ; }
2828
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+
2939 var gScatterGeoTraces = geo . framework . select ( '.scattergeolayer' )
3040 . selectAll ( 'g.trace.scattergeo' )
3141 . data ( calcData , keyFunc ) ;
@@ -39,27 +49,11 @@ module.exports = function plot(geo, calcData) {
3949 gScatterGeoTraces . selectAll ( '*' ) . remove ( ) ;
4050
4151 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 ;
6054
6155 if ( subTypes . hasLines ( trace ) || trace . fill !== 'none' ) {
62- var lineCoords = geoJsonUtils . calcTraceToLineCoords ( _calcTrace ) ;
56+ var lineCoords = geoJsonUtils . calcTraceToLineCoords ( calcTrace ) ;
6357
6458 var lineData = ( trace . fill !== 'none' ) ?
6559 geoJsonUtils . makePolygon ( lineCoords , trace ) :
@@ -72,66 +66,39 @@ module.exports = function plot(geo, calcData) {
7266 }
7367
7468 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 ) ; } ) ;
7874 }
7975
8076 if ( subTypes . hasText ( trace ) ) {
81- s . selectAll ( 'g' ) . data ( _calcTrace )
77+ s . selectAll ( 'g' )
78+ . data ( Lib . identity )
8279 . enter ( ) . append ( 'g' )
83- . append ( 'text' ) ;
80+ . append ( 'text' )
81+ . each ( function ( calcPt ) { removeBADNUM ( calcPt , this ) ; } ) ;
8482 }
8583 } ) ;
8684
8785 // call style here within topojson request callback
8886 style ( geo ) ;
8987} ;
9088
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 ;
9691
97- return function ( calcPt ) {
98- var feature = locationToFeature ( locationmode , calcPt . loc , features ) ;
92+ if ( ! Array . isArray ( trace . locations ) ) return ;
9993
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 ;
11196
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 ) ;
126100
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 ] ;
135102 }
136103}
137104
0 commit comments