地图结合echarts

1 最近在学习cesium,发现无论哪种地图都少不了要结合echarts。echarts极出名的迁徙图在地图中也经常用到。,但是往往换了一个地图框架,我就不知道怎么用了,因此打算深究一下原理;

 

https://github.com/FreeGIS/Ol3-Echarts

做法是在map容器里面追加一个div,用于echarts渲染

利用map对象将地理坐标转换为屏幕坐标,在设定echarts时,不指定map的类型,echarts会按照屏幕坐标系去渲染。即可完成,再添加相应的地图事件重绘即可

 

在其他地图之中也是类似的原理--目前已证明cesium中也是如此(如下所示),关键函数为viewer.scene.cartesianToCanvasCoordinates,后续计划自己动手实现叠加迁徙图,目前这种方式在vue出现了问题,普通项目中无任何问题,问题finding..

 

当然可能存在其他的方法,比如将坐标转为百度坐标等等--

 

function echartsCombineCesium(viewer,option){

        //坐标转换及事件监听
        (function(e) {
            var t = {};
            function n(r) {
                if (t[r]) return t[r].exports;
                var i = t[r] = {
                    i: r,
                    l: !1,
                    exports: {}
                };
                return e[r].call(i.exports, i, i.exports, n),
                    i.l = !0,
                    i.exports
            }
            n.m = e,
                n.c = t,
                n.d = function(e, t, r) {
                    n.o(e, t) || Object.defineProperty(e, t, {
                        enumerable: !0,
                        get: r
                    })
                },
                n.r = function(e) {
                    "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {
                        value: "Module"
                    }),
                        Object.defineProperty(e, "__esModule", {
                            value: !0
                        })
                },
                n.t = function(e, t) {
                    if (1 & t && (e = n(e)), 8 & t) return e;
                    if (4 & t && "object" == typeof e && e && e.__esModule) return e;
                    var r = Object.create(null);
                    if (n.r(r), Object.defineProperty(r, "default", {
                        enumerable: !0,
                        value: e
                    }), 2 & t && "string" != typeof e) for (var i in e) n.d(r, i,
                        function(t) {
                            return e[t]
                        }.bind(null, i));
                    return r
                },
                n.n = function(e) {
                    var t = e && e.__esModule ?
                        function() {
                            return e.
                                default
                        }:
                        function() {
                            return e
                        };
                    return n.d(t, "a", t),
                        t
                },
                n.o = function(e, t) {
                    return Object.prototype.hasOwnProperty.call(e, t)
                },
                n.p = "",
                n(n.s = 0)
        })([function(e, t, n){e.exports = n(1)},function(e, t, n) {
            echarts ? n(2).load() : console.error("missing echarts lib")
        },function(e, t, n) {
            "use strict";
            function r(e, t) {
                for (var n = 0; n < t.length; n++) {
                    var r = t[n];
                    r.enumerable = r.enumerable || !1,
                        r.configurable = !0,
                    "value" in r && (r.writable = !0),
                        Object.defineProperty(e, r.key, r)
                }
            }
            n.r(t);
            var i = function() {
                function e(t, n) { !
                    function(e, t) {
                        if (! (e instanceof t)) throw new TypeError("Cannot call a class as a function")
                    } (this, e),
                    this._viewer = t,
                    this.dimensions = ["lng", "lat"],
                    this._mapOffset = [0, 0],
                    this._api = n
                }
                var t, n, i;
                return t = e,
                    i = [{
                        key: "create",
                        value: function(t, n) {
                            var r;
                            t.eachComponent("GLMap",
                                function(t) { (r = new e(echarts.cesiumViewer, n)).setMapOffset(t.__mapOffset || [0, 0]),
                                    t.coordinateSystem = r
                                }),
                                t.eachSeries(function(e) {
                                    "GLMap" === e.get("coordinateSystem") && (e.coordinateSystem = r)
                                })
                        }
                    },
                        {
                            key: "dimensions",
                            get: function() {
                                return ["lng", "lat"]
                            }
                        }],
                (n = [{
                    key: "setMapOffset",
                    value: function(e) {
                        return this._mapOffset = e,
                            this
                    }
                },
                    {
                        key: "getViewer",
                        value: function() {
                            return this._viewer
                        }
                    },
                    {
                        key: "dataToPoint",
                        value: function(e) {
                            var t = this._viewer.scene,
                                n = [0, 0],
                                r = Cesium.Cartesian3.fromDegrees(e[0], e[1]);
                            if (!r) return n;
                            if (t.mode === Cesium.SceneMode.SCENE3D && Cesium.Cartesian3.angleBetween(t.camera.position, r) > Cesium.Math.toRadians(80)) return ! 1;
                            var i = t.cartesianToCanvasCoordinates(r);
                            return i ? [i.x - this._mapOffset[0], i.y - this._mapOffset[1]] : n
                        }
                    },
                    {
                        key: "pointToData",
                        value: function(e) {
                            var t = this._mapOffset,
                                n = viewer.scene.globe.ellipsoid,
                                r = new Cesium.cartesian3(e[1] + t, e[2] + t[2], 0),
                                i = n.cartesianToCartographic(r);
                            return [i.lng, i.lat]
                        }
                    },
                    {
                        key: "getViewRect",
                        value: function() {
                            var e = this._api;
                            return new echarts.graphic.BoundingRect(0, 0, e.getWidth(), e.getHeight())
                        }
                    },
                    {
                        key: "getRoamTransform",
                        value: function() {
                            return echarts.matrix.create()
                        }
                    }]) && r(t.prototype, n),
                i && r(t, i),
                    e
            } ();
            echarts.extendComponentModel({
                type: "GLMap",
                getViewer: function() {
                    return echarts.cesiumViewer
                },
                defaultOption: {
                    roam: !1
                }
            }),
                echarts.extendComponentView({
                    type: "GLMap",
                    init: function(e, t) {
                        this.api = t,
                            echarts.cesiumViewer.scene.postRender.addEventListener(this.moveHandler, this)
                    },
                    moveHandler: function(e, t) {
                        this.api.dispatchAction({
                            type: "GLMapRoam"
                        })
                    },
                    render: function(e, t, n) {},
                    dispose: function(e) {
                        echarts.cesiumViewer.scene.postRender.removeEventListener(this.moveHandler, this)
                    }
                });
            function a() {
                echarts.registerCoordinateSystem("GLMap", i),
                    echarts.registerAction({
                            type: "GLMapRoam",
                            event: "GLMapRoam",
                            update: "updateLayout"
                        },
                        function(e, t) {})
            }
            n.d(t, "load",
                function() {
                    return a
                })
        }]);

        //开始
        echarts.cesiumViewer = viewer;
        function CE(t, e) {
            this._mapContainer = t;
            this._overlay = this._createChartOverlay();
            this._overlay.setOption(e)
        }
        CE.prototype._createChartOverlay = function() {
            var t = this._mapContainer.scene;
            t.canvas.setAttribute('tabIndex', 0);
            var e = document.createElement('div');
            e.style.position = 'absolute';
            e.style.top = '0px';
            e.style.left = '0px';
            e.style.width = t.canvas.width + 'px';
            e.style.height = t.canvas.height + 'px';
            e.style.pointerEvents = 'none';
            e.setAttribute('id','cesium-echarts');
            e.setAttribute('class', 'echartMap');
            this._mapContainer.container.appendChild(e);
            return echarts.init(e)
        };

        CE.prototype.getMap = function() {
            return this._mapContainer
        };


        new CE(viewer,option);
    }

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
腾讯地图可以与echarts结合使用。通过结合腾讯地图echarts,你可以在地图上展示各种数据可视化。具体的方法是通过将地理坐标转换为屏幕坐标,然后使用echarts渲染地图。你可以利用echarts提供的地图事件来实现地图的重绘和交互。这样可以创建一个能够动态更新的疫情地图或其他可视化地图。在制作这样的地图时,需要掌握一些基础知识,包括html、css、js、ajax、jQuery和echarts。通过学习和掌握这些知识,你可以根据自己的需求创建出符合预期的地图展示效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [地图结合echarts](https://blog.csdn.net/A873054267/article/details/103902284)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [基于ECharts和腾讯疫情数据接口的全球疫情地图(超全)](https://blog.csdn.net/qq_44573890/article/details/115029013)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值