@@ -15,17 +15,28 @@ 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+ 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+
2940 var gScatterGeoTraces = geo . framework . select ( '.scattergeolayer' )
3041 . selectAll ( 'g.trace.scattergeo' )
3142 . data ( calcData , keyFunc ) ;
@@ -39,27 +50,11 @@ module.exports = function plot(geo, calcData) {
3950 gScatterGeoTraces . selectAll ( '*' ) . remove ( ) ;
4051
4152 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 ;
6055
6156 if ( subTypes . hasLines ( trace ) || trace . fill !== 'none' ) {
62- var lineCoords = geoJsonUtils . calcTraceToLineCoords ( _calcTrace ) ;
57+ var lineCoords = geoJsonUtils . calcTraceToLineCoords ( calcTrace ) ;
6358
6459 var lineData = ( trace . fill !== 'none' ) ?
6560 geoJsonUtils . makePolygon ( lineCoords , trace ) :
@@ -72,66 +67,39 @@ module.exports = function plot(geo, calcData) {
7267 }
7368
7469 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 ) ; } ) ;
7875 }
7976
8077 if ( subTypes . hasText ( trace ) ) {
81- s . selectAll ( 'g' ) . data ( _calcTrace )
78+ s . selectAll ( 'g' )
79+ . data ( Lib . identity )
8280 . enter ( ) . append ( 'g' )
83- . append ( 'text' ) ;
81+ . append ( 'text' )
82+ . each ( function ( calcPt ) { removeBADNUM ( calcPt , this ) ; } ) ;
8483 }
8584 } ) ;
8685
8786 // call style here within topojson request callback
8887 style ( geo ) ;
8988} ;
9089
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 ;
9692
97- return function ( calcPt ) {
98- var feature = locationToFeature ( locationmode , calcPt . loc , features ) ;
93+ if ( ! Array . isArray ( trace . locations ) ) return ;
9994
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 ;
11197
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 ) ;
126101
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 ] ;
135103 }
136104}
137105
0 commit comments