11
11
12
12
var d3 = require ( 'd3' ) ;
13
13
14
+ var Lib = require ( '../../lib' ) ;
14
15
var Color = require ( '../../components/color' ) ;
15
16
var Drawing = require ( '../../components/drawing' ) ;
16
17
var Colorscale = require ( '../../components/colorscale' ) ;
18
+ var polygon = require ( '../../lib/polygon' ) ;
17
19
18
20
var getTopojsonFeatures = require ( '../../lib/topojson_utils' ) . getTopojsonFeatures ;
19
21
var locationToFeature = require ( '../../lib/geo_location_utils' ) . locationToFeature ;
20
- var arrayToCalcItem = require ( '../../lib/array_to_calc_item' ) ;
21
22
22
- var constants = require ( '../../plots/geo/constants' ) ;
23
-
24
- module . exports = function plot ( geo , calcData , geoLayout ) {
23
+ module . exports = function plot ( geo , calcData ) {
24
+ for ( var i = 0 ; i < calcData . length ; i ++ ) {
25
+ calcGeoJSON ( calcData [ i ] , geo . topojson ) ;
26
+ }
25
27
26
28
function keyFunc ( d ) { return d [ 0 ] . trace . uid ; }
27
29
28
- var framework = geo . framework ,
29
- gChoropleth = framework . select ( 'g.choroplethlayer' ) ,
30
- gBaseLayer = framework . select ( 'g.baselayer' ) ,
31
- gBaseLayerOverChoropleth = framework . select ( 'g.baselayeroverchoropleth' ) ,
32
- baseLayersOverChoropleth = constants . baseLayersOverChoropleth ,
33
- layerName ;
34
-
35
- var gChoroplethTraces = gChoropleth
30
+ var gTraces = geo . layers . backplot . select ( '.choroplethlayer' )
36
31
. selectAll ( 'g.trace.choropleth' )
37
32
. data ( calcData , keyFunc ) ;
38
33
39
- gChoroplethTraces . enter ( ) . append ( 'g' )
34
+ gTraces . enter ( ) . append ( 'g' )
40
35
. attr ( 'class' , 'trace choropleth' ) ;
41
36
42
- gChoroplethTraces . exit ( ) . remove ( ) ;
37
+ gTraces . exit ( ) . remove ( ) ;
43
38
44
- gChoroplethTraces . each ( function ( calcTrace ) {
45
- var trace = calcTrace [ 0 ] . trace ,
46
- cdi = calcGeoJSON ( trace , geo . topojson ) ;
39
+ gTraces . each ( function ( calcTrace ) {
40
+ var sel = calcTrace [ 0 ] . node3 = d3 . select ( this ) ;
47
41
48
- var paths = d3 . select ( this )
49
- . selectAll ( 'path.choroplethlocation' )
50
- . data ( cdi ) ;
42
+ var paths = sel . selectAll ( 'path.choroplethlocation' )
43
+ . data ( Lib . identity ) ;
51
44
52
45
paths . enter ( ) . append ( 'path' )
53
- . classed ( 'choroplethlocation' , true )
54
- . on ( 'mouseover' , function ( pt ) {
55
- geo . choroplethHoverPt = pt ;
56
- } )
57
- . on ( 'mouseout' , function ( ) {
58
- geo . choroplethHoverPt = null ;
59
- } ) ;
46
+ . classed ( 'choroplethlocation' , true ) ;
60
47
61
48
paths . exit ( ) . remove ( ) ;
62
49
} ) ;
63
50
64
- // some baselayers are drawn over choropleth
65
- gBaseLayerOverChoropleth . selectAll ( '*' ) . remove ( ) ;
66
-
67
- for ( var i = 0 ; i < baseLayersOverChoropleth . length ; i ++ ) {
68
- layerName = baseLayersOverChoropleth [ i ] ;
69
- gBaseLayer . select ( 'g.' + layerName ) . remove ( ) ;
70
- geo . drawTopo ( gBaseLayerOverChoropleth , layerName , geoLayout ) ;
71
- geo . styleLayer ( gBaseLayerOverChoropleth , layerName , geoLayout ) ;
72
- }
73
-
74
51
style ( geo ) ;
75
52
} ;
76
53
77
- function calcGeoJSON ( trace , topojson ) {
78
- var cdi = [ ] ,
79
- locations = trace . locations ,
80
- len = locations . length ,
81
- features = getTopojsonFeatures ( trace , topojson ) ,
82
- markerLine = ( trace . marker || { } ) . line || { } ;
83
-
84
- var feature ;
85
-
86
- for ( var i = 0 ; i < len ; i ++ ) {
87
- feature = locationToFeature ( trace . locationmode , locations [ i ] , features ) ;
88
-
89
- if ( ! feature ) continue ; // filter the blank features here
90
-
91
- // 'data_array' attributes
92
- feature . z = trace . z [ i ] ;
93
- if ( trace . text !== undefined ) feature . tx = trace . text [ i ] ;
94
-
95
- // 'arrayOk' attributes
96
- arrayToCalcItem ( markerLine . color , feature , 'mlc' , i ) ;
97
- arrayToCalcItem ( markerLine . width , feature , 'mlw' , i ) ;
98
-
99
- // for event data
100
- feature . index = i ;
101
-
102
- cdi . push ( feature ) ;
54
+ function calcGeoJSON ( calcTrace , topojson ) {
55
+ var trace = calcTrace [ 0 ] . trace ;
56
+ var len = calcTrace . length ;
57
+ var features = getTopojsonFeatures ( trace , topojson ) ;
58
+ var i , j , k ;
59
+
60
+ for ( i = 0 ; i < len ; i ++ ) {
61
+ var calcPt = calcTrace [ i ] ;
62
+ var feature = locationToFeature ( trace . locationmode , calcPt . loc , features ) ;
63
+
64
+ if ( ! feature ) {
65
+ calcPt . geojson = null ;
66
+ continue ;
67
+ }
68
+
69
+ calcPt . geojson = feature ;
70
+ calcPt . ct = feature . properties . ct ;
71
+ calcPt . index = i ;
72
+
73
+ var geometry = feature . geometry ;
74
+ var coords = geometry . coordinates ;
75
+ calcPt . _polygons = [ ] ;
76
+
77
+ switch ( geometry . type ) {
78
+ case 'MultiPolygon' :
79
+ for ( j = 0 ; j < coords . length ; j ++ ) {
80
+ for ( k = 0 ; k < coords [ j ] . length ; k ++ ) {
81
+ calcPt . _polygons . push ( polygon . tester ( coords [ j ] [ k ] ) ) ;
82
+ }
83
+ }
84
+ break ;
85
+ case 'Polygon' :
86
+ for ( j = 0 ; j < coords . length ; j ++ ) {
87
+ calcPt . _polygons . push ( polygon . tester ( coords [ j ] ) ) ;
88
+ }
89
+ break ;
90
+ }
103
91
}
104
-
105
- if ( cdi . length > 0 ) cdi [ 0 ] . trace = trace ;
106
-
107
- return cdi ;
108
92
}
109
93
110
94
function style ( geo ) {
@@ -122,9 +106,11 @@ function style(geo) {
122
106
)
123
107
) ;
124
108
125
- s . selectAll ( 'path.choroplethlocation' ) . each ( function ( pt ) {
109
+ s . selectAll ( 'path.choroplethlocation' ) . each ( function ( _ , i ) {
110
+ var pt = calcTrace [ i ] ;
111
+
126
112
d3 . select ( this )
127
- . attr ( 'fill' , function ( pt ) { return sclFunc ( pt . z ) ; } )
113
+ . attr ( 'fill' , sclFunc ( pt . z ) )
128
114
. call ( Color . stroke , pt . mlc || markerLine . color )
129
115
. call ( Drawing . dashLine , '' , pt . mlw || markerLine . width || 0 ) ;
130
116
} ) ;
0 commit comments