@@ -16,13 +16,17 @@ import {
16
16
import {
17
17
StyleUtils
18
18
} from '../core/StyleUtils' ;
19
+ import provincialCenterData from './webmap/config/ProvinceCenter' ;
20
+ import municipalCenterData from './webmap/config/MunicipalCenter' ;
19
21
import jsonsql from 'jsonsql' ;
20
22
21
23
window . proj4 = proj4 ;
22
24
window . Proj4js = proj4 ;
23
25
ol . supermap = ol . supermap || { } ;
24
26
//数据转换工具
25
27
const transformTools = new ol . format . GeoJSON ( ) ;
28
+ // 迁徙图最大支持要素数量
29
+ const MAX_MIGRATION_ANIMATION_COUNT = 1000 ;
26
30
/**
27
31
* @class ol.supermap.WebMap
28
32
* @category iPortal/Online
@@ -1172,7 +1176,7 @@ export class WebMap extends ol.Observable {
1172
1176
* @param {number } layersLen - 叠加图层总数
1173
1177
*/
1174
1178
sendMapToUser ( layersLen ) {
1175
- if ( this . layerAdded === layersLen ) {
1179
+ if ( this . layerAdded === layersLen && this . successCallback ) {
1176
1180
this . successCallback ( this . map , this . mapParams , this . layers ) ;
1177
1181
}
1178
1182
}
@@ -1381,15 +1385,16 @@ export class WebMap extends ol.Observable {
1381
1385
layer = this . createDataflowHeatLayer ( layerInfo ) ;
1382
1386
} else if ( layerInfo . layerType === "RANK_SYMBOL" ) {
1383
1387
layer = this . createRankSymbolLayer ( layerInfo , features ) ;
1388
+ } else if ( layerInfo . layerType === "MIGRATION" ) {
1389
+ layer = this . createMigrationLayer ( layerInfo , features ) ;
1384
1390
}
1385
1391
let layerId = Util . newGuid ( 8 ) ;
1386
1392
if ( layer ) {
1387
1393
layerInfo . name && layer . setProperties ( {
1388
1394
name : layerInfo . name ,
1389
1395
layerId : layerId
1390
1396
} ) ;
1391
- layerInfo . opacity && layer . setOpacity ( layerInfo . opacity ) ;
1392
- layer . setVisible ( layerInfo . visible ) ;
1397
+
1393
1398
//刷新下图层,否则feature样式出不来
1394
1399
if ( layerInfo && layerInfo . style && layerInfo . style . imageInfo ) {
1395
1400
let img = new Image ( ) ;
@@ -1398,10 +1403,17 @@ export class WebMap extends ol.Observable {
1398
1403
layer . getSource ( ) . refresh ( ) ;
1399
1404
} ;
1400
1405
}
1401
-
1406
+ if ( layerInfo . layerType === 'MIGRATION' ) {
1407
+ layer . appendTo ( this . map ) ;
1408
+ // 在这里恢复图层可见性状态
1409
+ layer . setVisible ( layerInfo . visible ) ;
1410
+ } else {
1411
+ layerInfo . opacity != undefined && layer . setOpacity ( layerInfo . opacity ) ;
1412
+ layer . setVisible ( layerInfo . visible ) ;
1413
+ this . map . addLayer ( layer ) ;
1414
+ }
1415
+ layer . setZIndex ( index ) ;
1402
1416
}
1403
- layer && this . map . addLayer ( layer ) ;
1404
- layer && layer . setZIndex ( index ) ;
1405
1417
layerInfo . layer = layer ;
1406
1418
layerInfo . layerId = layerId ;
1407
1419
if ( layerInfo . labelStyle && layerInfo . labelStyle . labelField && layerInfo . layerType !== "DATAFLOW_POINT_TRACK" ) {
@@ -2581,7 +2593,265 @@ export class WebMap extends ol.Observable {
2581
2593
}
2582
2594
}
2583
2595
}
2596
+
2597
+ /**
2598
+ * @private
2599
+ * @function ol.supermap.WebMap.prototype.createMigrationLayer
2600
+ * @description 创建迁徙图
2601
+ * @param {Object } layerInfo 图层信息
2602
+ * @param {Array } features 要素数组
2603
+ * @returns {ol.layer } 图层
2604
+ */
2605
+ createMigrationLayer ( layerInfo , features ) {
2606
+ // 给ol3Echarts上添加设置图层可见性和设置图层层级的方法
2607
+ if ( ! window . ol3Echarts . prototype . setVisible ) {
2608
+ window . ol3Echarts . prototype . setVisible = function ( visible ) {
2609
+ if ( visible ) {
2610
+ let options = this . get ( 'options' ) ;
2611
+ if ( options ) {
2612
+ this . setChartOptions ( options ) ;
2613
+ this . unset ( 'options' ) ;
2614
+ }
2615
+ } else {
2616
+ let options = this . getChartOptions ( ) ;
2617
+ this . set ( 'options' , options ) ;
2618
+ this . clear ( ) ;
2619
+ this . setChartOptions ( { } ) ;
2620
+ }
2621
+ } ;
2622
+ }
2623
+ if ( ! window . ol3Echarts . prototype . setZIndex ) {
2624
+ window . ol3Echarts . prototype . setZIndex = function ( zIndex ) {
2625
+ if ( this . $container ) {
2626
+ this . $container . style . zIndex = zIndex ;
2627
+ }
2628
+ } ;
2629
+ }
2630
+ let properties = Util . getFeatureProperties ( features ) ;
2631
+ let lineData = this . createLinesData ( layerInfo , properties ) ;
2632
+ let pointData = this . createPointsData ( lineData , layerInfo , properties ) ;
2633
+ let options = this . createOptions ( layerInfo , lineData , pointData ) ;
2634
+ let layer = new window . ol3Echarts ( options , {
2635
+ hideOnMoving : true ,
2636
+ hideOnZooming : true
2637
+ } ) ;
2638
+ layer . type = 'ECHARTS' ;
2639
+ return layer ;
2640
+ }
2641
+
2642
+ /**
2643
+ * @private
2644
+ * @function ol.supermap.WebMap.prototype.createOptions
2645
+ * @description 创建echarts的options
2646
+ * @param {Object } layerInfo 图层信息
2647
+ * @param {Array } lineData 线数据
2648
+ * @param {Array } pointData 点数据
2649
+ * @returns {Object } echarts参数
2650
+ */
2651
+ createOptions ( layerInfo , lineData , pointData ) {
2652
+ let series ;
2653
+ let lineSeries = this . createLineSeries ( layerInfo , lineData ) ;
2654
+ if ( pointData && pointData . length ) {
2655
+ let pointSeries = this . createPointSeries ( layerInfo , pointData ) ;
2656
+ series = lineSeries . concat ( pointSeries ) ;
2657
+ } else {
2658
+ series = lineSeries . slice ( ) ;
2659
+ }
2660
+ let options = {
2661
+ series
2662
+ }
2663
+ return options ;
2664
+ }
2665
+
2666
+ /**
2667
+ * @private
2668
+ * @function ol.supermap.WebMap.prototype.createLineSeries
2669
+ * @description 创建线系列
2670
+ * @param {Object } layerInfo 图层参数
2671
+ * @param {Array } lineData 线数据
2672
+ * @returns {Object } 线系列
2673
+ */
2674
+ createLineSeries ( layerInfo , lineData ) {
2675
+ let lineSetting = layerInfo . lineSetting ;
2676
+ let animationSetting = layerInfo . animationSetting ;
2677
+ let linesSeries = [
2678
+ // 轨迹线样式
2679
+ {
2680
+ name : 'line-series' ,
2681
+ type : 'lines' ,
2682
+ zlevel : 1 ,
2683
+ effect : {
2684
+ show : animationSetting . show ,
2685
+ constantSpeed : animationSetting . constantSpeed ,
2686
+ trailLength : 0 ,
2687
+ symbol : animationSetting . symbol ,
2688
+ symbolSize : animationSetting . symbolSize
2689
+ } ,
2690
+ lineStyle : {
2691
+ normal : {
2692
+ color : lineSetting . color ,
2693
+ type : lineSetting . type ,
2694
+ width : lineSetting . width ,
2695
+ opacity : lineSetting . opacity ,
2696
+ curveness : lineSetting . curveness
2697
+ }
2698
+ } ,
2699
+ data : lineData
2700
+ }
2701
+ ] ;
2702
+
2703
+ if ( lineData . length > MAX_MIGRATION_ANIMATION_COUNT ) {
2704
+ linesSeries [ 0 ] . large = true ;
2705
+ linesSeries [ 0 ] . largeThreshold = 100 ;
2706
+ linesSeries [ 0 ] . blendMode = 'lighter' ;
2707
+ }
2708
+
2709
+ return linesSeries ;
2710
+ }
2584
2711
2712
+ /**
2713
+ * @private
2714
+ * @function ol.supermap.WebMap.prototype.createPointSeries
2715
+ * @description 创建点系列
2716
+ * @param {Object } layerInfo 图层参数
2717
+ * @param {Array } pointData 点数据
2718
+ * @returns {Object } 点系列
2719
+ */
2720
+ createPointSeries ( layerInfo , pointData ) {
2721
+ let lineSetting = layerInfo . lineSetting ;
2722
+ let animationSetting = layerInfo . animationSetting ;
2723
+ let labelSetting = layerInfo . labelSetting ;
2724
+ let pointSeries = [ {
2725
+ name : 'point-series' ,
2726
+ coordinateSystem : 'geo' ,
2727
+ zlevel : 2 ,
2728
+ label : {
2729
+ normal : {
2730
+ show : labelSetting . show ,
2731
+ position : 'right' ,
2732
+ formatter : '{b}' ,
2733
+ color : labelSetting . color ,
2734
+ fontFamily : labelSetting . fontFamily
2735
+ }
2736
+ } ,
2737
+ itemStyle : {
2738
+ normal : {
2739
+ color : lineSetting . color || labelSetting . color
2740
+ }
2741
+ } ,
2742
+ data : pointData
2743
+ } ]
2744
+
2745
+ if ( animationSetting . show ) {
2746
+ // 开启动画
2747
+ pointSeries [ 0 ] . type = 'effectScatter' ;
2748
+ pointSeries [ 0 ] . rippleEffect = {
2749
+ brushType : 'stroke'
2750
+ }
2751
+ } else {
2752
+ // 关闭动画
2753
+ pointSeries [ 0 ] . type = 'scatter' ;
2754
+ }
2755
+
2756
+ return pointSeries ;
2757
+ }
2758
+
2759
+ /**
2760
+ * @private
2761
+ * @function ol.supermap.WebMap.prototype.createPointsData
2762
+ * @param {Array } lineData 线数据
2763
+ * @param {Object } layerInfo 图层信息
2764
+ * @param {Array } properties 属性
2765
+ * @returns {Array } 点数据
2766
+ */
2767
+ createPointsData ( lineData , layerInfo , properties ) {
2768
+ let data = [ ] ,
2769
+ labelSetting = layerInfo . labelSetting ;
2770
+ // 标签隐藏则直接返回
2771
+ if ( ! labelSetting . show || ! lineData . length ) {
2772
+ return data ;
2773
+ }
2774
+ let fromData = [ ] , toData = [ ] ;
2775
+ lineData . forEach ( ( item , idx ) => {
2776
+ let coords = item . coords ,
2777
+ fromCoord = coords [ 0 ] ,
2778
+ toCoord = coords [ 1 ] ,
2779
+ fromProperty = properties [ idx ] [ labelSetting . from ] ,
2780
+ toProperty = properties [ idx ] [ labelSetting . to ] ;
2781
+ // 起始字段去重
2782
+ let f = fromData . find ( d => {
2783
+ return d . value [ 0 ] === fromCoord [ 0 ] && d . value [ 1 ] === fromCoord [ 1 ]
2784
+ } ) ;
2785
+ ! f && fromData . push ( {
2786
+ name : fromProperty ,
2787
+ value : fromCoord
2788
+ } )
2789
+ // 终点字段去重
2790
+ let t = toData . find ( d => {
2791
+ return d . value [ 0 ] === toCoord [ 0 ] && d . value [ 1 ] === toCoord [ 1 ]
2792
+ } ) ;
2793
+ ! t && toData . push ( {
2794
+ name : toProperty ,
2795
+ value : toCoord
2796
+ } )
2797
+ } ) ;
2798
+ data = fromData . concat ( toData ) ;
2799
+ return data ;
2800
+ }
2801
+
2802
+ /**
2803
+ * @private
2804
+ * @function ol.supermap.WebMap.prototype.createLinesData
2805
+ * @param {Object } layerInfo 图层信息
2806
+ * @param {Array } properties 属性
2807
+ * @returns {Array } 线数据
2808
+ */
2809
+ createLinesData ( layerInfo , properties ) {
2810
+ let data = [ ] ;
2811
+ if ( properties && properties . length ) {
2812
+ // 重新获取数据
2813
+ let from = layerInfo . from ,
2814
+ to = layerInfo . to ,
2815
+ fromCoord , toCoord ;
2816
+ if ( from . type === 'XY_FIELD' && from [ 'xField' ] && from [ 'yField' ] && to [ 'xField' ] && to [ 'yField' ] ) {
2817
+ properties . forEach ( property => {
2818
+ let fromX = property [ from [ 'xField' ] ] ,
2819
+ fromY = property [ from [ 'yField' ] ] ,
2820
+ toX = property [ to [ 'xField' ] ] ,
2821
+ toY = property [ to [ 'yField' ] ] ;
2822
+ if ( ! fromX || ! fromY || ! toX || ! toY ) {
2823
+ return ;
2824
+ }
2825
+
2826
+ fromCoord = [ property [ from [ 'xField' ] ] , property [ from [ 'yField' ] ] ] ;
2827
+ toCoord = [ property [ to [ 'xField' ] ] , property [ to [ 'yField' ] ] ] ;
2828
+ data . push ( {
2829
+ coords : [ fromCoord , toCoord ]
2830
+ } )
2831
+ } ) ;
2832
+ } else if ( from . type === 'PLACE_FIELD' && from [ 'field' ] && to [ 'field' ] ) {
2833
+ const centerDatas = provincialCenterData . concat ( municipalCenterData ) ;
2834
+
2835
+ properties . forEach ( property => {
2836
+ let fromField = property [ from [ 'field' ] ] ,
2837
+ toField = property [ to [ 'field' ] ] ;
2838
+ fromCoord = centerDatas . find ( item => {
2839
+ return Util . isMatchAdministrativeName ( item . name , fromField ) ;
2840
+ } )
2841
+ toCoord = centerDatas . find ( item => {
2842
+ return Util . isMatchAdministrativeName ( item . name , toField ) ;
2843
+ } )
2844
+ if ( ! fromCoord || ! toCoord ) {
2845
+ return ;
2846
+ }
2847
+ data . push ( {
2848
+ coords : [ fromCoord . coord , toCoord . coord ]
2849
+ } )
2850
+ } ) ;
2851
+ }
2852
+ }
2853
+ return data ;
2854
+ }
2585
2855
}
2586
2856
2587
2857
ol . supermap . WebMap = WebMap ;
0 commit comments