关于实现离线地图的几种方式

一、使用Leaflet+瓦片地图

1.引入 Leaflet 库

在HTML文件中引入Leaflet库。

<script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css"/>

2.创建地图容器

在HTML中创建一个<div>元素,用于容纳Leaflet地图。

<div id="map" style="width: 1200px; height: 630px;"></div>

3.初始化地图

在JavaScript中,使用Leaflet初始化地图,并设置地图的中心点和缩放级别。

var map = L.map('map').setView([22.48972, 114.03259], 9);

其中 [22.48972, 114.03259]为中心点的经纬度,9为初始缩放级别

4.添加瓦片图层

Leaflet支持添加各种瓦片图层,包括OpenStreetMap、Google Maps等。可以通过提供瓦片图层的URL来添加图层。

L.tileLayer('/static/path/mapabc/roadmap/{z}/{x}/{y}.png', {
        maxZoom: 18,
    }).addTo(this.map);

 maxZoom为最大缩放级别

5.添加其他互动

//添加标注点
    L.marker([22.83589, 113.25484], {
        title: '清晖园',
        clickable: true, // 是否可以点击
        draggable: false, // 是否可以拖拽
    }).on('click', (e) => {
        // 点击事件
        console.log('e----', e)
        console.log('"点击图标"----', '点击图标')
    }).bindPopup(`<span style="color:black;">清晖园,位于广东省佛山市顺德区大良街道清晖路23号,是始建于明代的岭南园林建筑,占地面积为2.2万平方米,与佛山梁园、番禺余荫山房、东莞可园并称为岭南四大园林清晖园主体建筑包括有船厅、碧溪草堂、澄漪亭、惜阴书屋、真砚斋、状元堂等。园内植物200多种,且有多棵百年古树、中外名木。清晖园曾为状元府邸,也曾为大良龙氏的家园,这些居住在清晖园的家族走出了不少历史名人。清晖园是中国十大名园、广东四大名园之一,还是中华文化传承基地,佛山新八景之一,顺德新十景之一,其构筑精巧,布局紧凑,建筑艺术颇高,建筑物形式轻巧灵活,雅读朴素,庭园空间主次分明,结构清晰。利用碧水、绿树、古墙、漏窗、石山、小桥、曲廊等与亭台楼阁交互融合,集中国古代建筑、园林、雕刻、诗书、灰雕等艺术于一身。清晖园的文物有李兆洛、李文田、何绍基等大家的书法。2007年12月7日,清晖园被国家旅游局批准为国家AAAA级旅游景区,2013年,国务院核定公布清晖园为第七批全国重点文物保护单位。</span>`)
      .openPopup() // 由于要取当前标点信息,下边添加信息用 (e)=>{} 而不是直接写模板字符串
      .addTo(this.map) // 为了方便清除标点,下边添加标注点不用该方法

    L.marker([23.03, 113.18], {
        title: '我是可拖动的点',
        clickable: true, // 是否可以点击
        draggable: true, // 是否可以拖拽
    }).on('click', (e) => {
        // 点击事件
        console.log('e----', e)
        console.log('"点击图标"----', '点击图标')
    }).addTo(this.map)

    var circle = L.circle([22.812321, 113.152992], {
        color: 'red',
        fillColor: '#f03',
        fillOpacity: 0.5,
        radius: 500
    }).on('click', (e) => {
        // 点击事件
        console.log('e----', e)
        console.log('"点击图标"----', '点击图标')
    }).bindPopup(`<span style="color:black;">逢简水乡,地处广东省佛山市顺德区杏坛镇北端,面积5.2平方千米,是广东四大水乡之一,有广东“小周庄”之称。 [3] [6]作为顺德早期聚居地之一,逢简的历史最早可追溯到西汉,后来发展成一方集市,南宋嘉定年间之前,已有先民迁入该地居住而渐成村落。逢简水乡内文物古迹遍布,有始建于宋朝的广东省文物保护单位明远桥、始建于明朝的广东省文物保护单位刘氏大宗祠,以及佛山市级文物保护单位巨济桥、清康熙皇帝赐建的金鳌桥,清光绪皇帝御赐金桂。同时,古庙宇、古祠堂、古民居、古树众多,历史文化积淀深厚。 [2] [4]2015年,逢简水乡被评为国家AAA级旅游景区。</span>`)
      .openPopup() // 由于要取当前标点信息,下边添加信息用 (e)=>{} 而不是直接写模板字符串
      .addTo(this.map)

    var polygon = L.polygon([
        [22.987472, 113.268586],
        [22.812321, 113.152992],
        [22.83589, 113.25484]
    ]).addTo(this.map);

实现效果:

 具体代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>leaflet</title>
    <script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css"/>
</head>
<body>
<!-- Container for the map -->
<div id="map" style="width: 1200px; height: 630px;"></div>

<script type="text/javascript">
    // 创建Leaflet地图
    var map = L.map('map').setView([22.48972, 114.03259], 9);

    // 添加瓦片地图图层
    L.tileLayer('/static/path/mapabc/roadmap/{z}/{x}/{y}.png', {
        maxZoom: 18,
    }).addTo(this.map);

    //添加标注点
    L.marker([22.91191, 113.21789]).addTo(this.map);
    L.marker([23.03, 113.18]).addTo(this.map);

</script>

</body>
</html>

 二、使用ECharts加载离线的 GeoJSON 地图数据

1.引入 ECharts 库

在页面中引入 ECharts 库。

<script src="/static/js/echarts.min.js"></script>

2.获取 GeoJSON 数据

3.实现效果

4.具体代码 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>geojson</title>
    <!-- Include ECharts library -->
    <script src="/static/js/echarts.min.js"></script>
</head>
<body>
<!-- Container for the map -->
<div id="map" style="width: 1260px; height: 630px;"></div>

<script type="text/javascript">

    // Create an ECharts instance and bind it to the 'map' div
    var chart = echarts.init(document.getElementById('map'));

    // Define your custom map data (GeoJSON format)
    var customMapData = ;//放入具体的GeoJSON数据

    // Register the custom map in ECharts
    echarts.registerMap('custom_map', customMapData);

    // ECharts configuration and data setup
    var option = {
        title: {
            text: 'ECharts Map with Custom Map',
        },
        tooltip: {
            trigger: 'item',
        },
        geo: {
            map: 'custom_map', // 此处的 'custom_map' 是自定义地图的名称
            roam: true, // 启用缩放和拖动功能
        },
        series: [
            {
                type: 'map',
                map: 'custom_map', // Use the registered custom map ID
                label: {
                    show: true,
                },
                // Your ECharts map series configuration here
            },
        ],
    };

    // Set the ECharts options
    chart.setOption(option);
</script>
</body>
</html>

三、使用ECharts实现

具体实现步骤和(二)相似

以下有一些示例可以参考:

1.ECharts社区:

series-line折线图 - makeapie echarts社区图表可视化案例

2.ECharts官方示例:

Examples - Apache ECharts

实现效果:

具体代码 :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>离线地图</title>
    <!-- 引入 ECharts 的 JavaScript 文件 -->
    <script src="/static/js/echarts.min.js"></script>
    <script src="/static/js/echarts.js"></script>
    <script src="/static/js/china.js"></script>
</head>
<body>
<div id="map" style="width: 1260px; height: 630px;"></div>

<script type="text/javascript">
    var myChart = echarts.init(document.getElementById('map'));
    //var name_title = "中国人民大学2017年各省市计划录取人数"
    //var subname = '上海、浙江无文理科录取人数'
    //var nameColor = " rgb(55, 75, 113)"
    //var name_fontFamily = '等线'
    //var subname_fontSize = 15
    //var name_fontSize = 18
    var mapName = 'china'
    var data = [
        {name:"北京",value:177},
        {name:"天津",value:42},
        {name:"河北",value:102},
        {name:"山西",value:81},
        {name:"内蒙古",value:47},
        {name:"辽宁",value:67},
        {name:"吉林",value:82},
        {name:"黑龙江",value:66},
        {name:"上海",value:24},
        {name:"江苏",value:92},
        {name:"浙江",value:114},
        {name:"安徽",value:109},
        {name:"福建",value:116},
        {name:"江西",value:91},
        {name:"山东",value:119},
        {name:"河南",value:137},
        {name:"湖北",value:116},
        {name:"湖南",value:114},
        {name:"重庆",value:91},
        {name:"四川",value:125},
        {name:"贵州",value:62},
        {name:"云南",value:83},
        {name:"西藏",value:9},
        {name:"陕西",value:80},
        {name:"甘肃",value:56},
        {name:"青海",value:10},
        {name:"宁夏",value:18},
        {name:"新疆",value:67},
        {name:"广东",value:123},
        {name:"广西",value:59},
        {name:"海南",value:14},
    ];

    var geoCoordMap = {};
    var toolTipData = [
        {name:"北京",value:[{name:"文科",value:95},{name:"理科",value:82}]},
        {name:"天津",value:[{name:"文科",value:22},{name:"理科",value:20}]},
        {name:"河北",value:[{name:"文科",value:60},{name:"理科",value:42}]},
        {name:"山西",value:[{name:"文科",value:40},{name:"理科",value:41}]},
        {name:"内蒙古",value:[{name:"文科",value:23},{name:"理科",value:24}]},
        {name:"辽宁",value:[{name:"文科",value:39},{name:"理科",value:28}]},
        {name:"吉林",value:[{name:"文科",value:41},{name:"理科",value:41}]},
        {name:"黑龙江",value:[{name:"文科",value:35},{name:"理科",value:31}]},
        {name:"上海",value:[{name:"文科",value:12},{name:"理科",value:12}]},
        {name:"江苏",value:[{name:"文科",value:47},{name:"理科",value:45}]},
        {name:"浙江",value:[{name:"文科",value:57},{name:"理科",value:57}]},
        {name:"安徽",value:[{name:"文科",value:57},{name:"理科",value:52}]},
        {name:"福建",value:[{name:"文科",value:59},{name:"理科",value:57}]},
        {name:"江西",value:[{name:"文科",value:49},{name:"理科",value:42}]},
        {name:"山东",value:[{name:"文科",value:67},{name:"理科",value:52}]},
        {name:"河南",value:[{name:"文科",value:69},{name:"理科",value:68}]},
        {name:"湖北",value:[{name:"文科",value:60},{name:"理科",value:56}]},
        {name:"湖南",value:[{name:"文科",value:62},{name:"理科",value:52}]},
        {name:"重庆",value:[{name:"文科",value:47},{name:"理科",value:44}]},
        {name:"四川",value:[{name:"文科",value:65},{name:"理科",value:60}]},
        {name:"贵州",value:[{name:"文科",value:32},{name:"理科",value:30}]},
        {name:"云南",value:[{name:"文科",value:42},{name:"理科",value:41}]},
        {name:"西藏",value:[{name:"文科",value:5},{name:"理科",value:4}]},
        {name:"陕西",value:[{name:"文科",value:38},{name:"理科",value:42}]},
        {name:"甘肃",value:[{name:"文科",value:28},{name:"理科",value:28}]},
        {name:"青海",value:[{name:"文科",value:5},{name:"理科",value:5}]},
        {name:"宁夏",value:[{name:"文科",value:10},{name:"理科",value:8}]},
        {name:"新疆",value:[{name:"文科",value:36},{name:"理科",value:31}]},
        {name:"广东",value:[{name:"文科",value:63},{name:"理科",value:60}]},
        {name:"广西",value:[{name:"文科",value:29},{name:"理科",value:30}]},
        {name:"海南",value:[{name:"文科",value:8},{name:"理科",value:6}]},
    ];

    /*获取地图数据*/
    myChart.showLoading();
    var mapFeatures = echarts.getMap(mapName).geoJson.features;
    myChart.hideLoading();
    mapFeatures.forEach(function(v) {
        // 地区名称
        var name = v.properties.name;
        // 地区经纬度
        geoCoordMap[name] = v.properties.cp;

    });

    // console.log("============geoCoordMap===================")
    // console.log(geoCoordMap)
    // console.log("================data======================")
    console.log(data)
    console.log(toolTipData)
    var max = 480,
        min = 9; // todo
    var maxSize4Pin = 100,
        minSize4Pin = 20;

    var convertData = function(data) {
        var res = [];
        for (var i = 0; i < data.length; i++) {
            var geoCoord = geoCoordMap[data[i].name];
            if (geoCoord) {
                res.push({
                    name: data[i].name,
                    value: geoCoord.concat(data[i].value),
                });
            }
        }
        return res;
    };
    option = {
        /*title: {
            text: name_title,
            subtext: subname,
            x: 'center',
            textStyle: {
                color: nameColor,
                fontFamily: name_fontFamily,
                fontSize: name_fontSize
            },
            subtextStyle:{
                fontSize:subname_fontSize,
                fontFamily:name_fontFamily
            }
        },*/
        tooltip: {
            trigger: 'item',
            formatter: function(params) {
                if (typeof(params.value)[2] == "undefined") {
                    var toolTiphtml = ''
                    for(var i = 0;i<toolTipData.length;i++){
                        if(params.name==toolTipData[i].name){
                            toolTiphtml += toolTipData[i].name+':<br>'
                            for(var j = 0;j<toolTipData[i].value.length;j++){
                                toolTiphtml+=toolTipData[i].value[j].name+':'+toolTipData[i].value[j].value+"<br>"
                            }
                        }
                    }
                    console.log(toolTiphtml)
                    // console.log(convertData(data))
                    return toolTiphtml;
                } else {
                    var toolTiphtml = ''
                    for(var i = 0;i<toolTipData.length;i++){
                        if(params.name==toolTipData[i].name){
                            toolTiphtml += toolTipData[i].name+':<br>'
                            for(var j = 0;j<toolTipData[i].value.length;j++){
                                toolTiphtml+=toolTipData[i].value[j].name+':'+toolTipData[i].value[j].value+"<br>"
                            }
                        }
                    }
                    console.log(toolTiphtml)
                    // console.log(convertData(data))
                    return toolTiphtml;
                }
            }
        },
        // legend: {
        //     orient: 'vertical',
        //     y: 'bottom',
        //     x: 'right',
        //     data: ['credit_pm2.5'],
        //     textStyle: {
        //         color: '#fff'
        //     }
        // },
        visualMap: {
            show: true,
            min: 0,
            max: 200,
            left: 'left',
            top: 'bottom',
            text: ['高', '低'], // 文本,默认为数值文本
            calculable: true,
            seriesIndex: [1],
            inRange: {
                // color: ['#3B5077', '#031525'] // 蓝黑
                // color: ['#ffc0cb', '#800080'] // 红紫
                // color: ['#3C3B3F', '#605C3C'] // 黑绿
                // color: ['#0f0c29', '#302b63', '#24243e'] // 黑紫黑
                // color: ['#23074d', '#cc5333'] // 紫红
                color: ['#00467F', '#A5CC82'] // 蓝绿
                // color: ['#1488CC', '#2B32B2'] // 浅蓝
                // color: ['#00467F', '#A5CC82'] // 蓝绿
                // color: ['#00467F', '#A5CC82'] // 蓝绿
                // color: ['#00467F', '#A5CC82'] // 蓝绿
                // color: ['#00467F', '#A5CC82'] // 蓝绿

            }
        },
        /*工具按钮组*/
        // toolbox: {
        //     show: true,
        //     orient: 'vertical',
        //     left: 'right',
        //     top: 'center',
        //     feature: {
        //         dataView: {
        //             readOnly: false
        //         },
        //         restore: {},
        //         saveAsImage: {}
        //     }
        // },
        geo: {
            show: true,
            map: mapName,
            label: {
                normal: {
                    show: false
                },
                emphasis: {
                    show: false,
                }
            },
            roam: true,
            itemStyle: {
                normal: {
                    areaColor: '#031525',
                    borderColor: '#3B5077',
                },
                emphasis: {
                    areaColor: '#2B91B7',
                }
            }
        },
        series: [{
            name: '散点',
            type: 'scatter',
            coordinateSystem: 'geo',
            data: convertData(data),
            symbolSize: function(val) {
                return val[2] / 10;
            },
            label: {
                normal: {
                    formatter: '{b}',
                    position: 'right',
                    show: true
                },
                emphasis: {
                    show: true
                }
            },
            itemStyle: {
                normal: {
                    color: '#05C3F9'
                }
            }
        },
            {
                type: 'map',
                map: mapName,
                geoIndex: 0,
                aspectScale: 0.75, //长宽比
                showLegendSymbol: false, // 存在legend时显示
                label: {
                    normal: {
                        show: true
                    },
                    emphasis: {
                        show: false,
                        textStyle: {
                            color: '#fff'
                        }
                    }
                },
                roam: true,
                itemStyle: {
                    normal: {
                        areaColor: '#031525',
                        borderColor: '#3B5077',
                    },
                    emphasis: {
                        areaColor: '#2B91B7'
                    }
                },
                animation: false,
                data: data
            },
            {
                name: '点',
                type: 'scatter',
                coordinateSystem: 'geo',
                symbol: 'pin', //气泡
                symbolSize: function(val) {
                    var a = (maxSize4Pin - minSize4Pin) / (max - min);
                    var b = minSize4Pin - a * min;
                    b = maxSize4Pin - a * max;
                    return a * val[2] + b;
                },
                label: {
                    normal: {
                        show: true,
                        textStyle: {
                            color: '#fff',
                            fontSize: 9,
                        }
                    }
                },
                itemStyle: {
                    normal: {
                        color: '#F62157', //标志颜色
                    }
                },
                zlevel: 6,
                data: convertData(data),
            },
            {
                name: 'Top 5',
                type: 'effectScatter',
                coordinateSystem: 'geo',
                data: convertData(data.sort(function(a, b) {
                    return b.value - a.value;
                }).slice(0, 5)),
                symbolSize: function(val) {
                    return val[2] / 10;
                },
                showEffectOn: 'render',
                rippleEffect: {
                    brushType: 'stroke'
                },
                hoverAnimation: true,
                label: {
                    normal: {
                        formatter: '{b}',
                        position: 'right',
                        show: true
                    }
                },
                itemStyle: {
                    normal: {
                        color: 'yellow',
                        shadowBlur: 10,
                        shadowColor: 'yellow'
                    }
                },
                zlevel: 1
            },

        ]
    };
    myChart.setOption(option);
</script>

</body>
</html>

四、综合实现

当你学会了以上三种方式之后,就可以自己实现如下图的类似效果了

具体的HTML代码如下,其他css、js就不放出来了 

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>时实客流量监控中心</title>
    <script type="text/javascript" src="/static/js/jquery.js"></script>
    <script type="text/javascript" src="/static/js/js.js"></script>
    <script src="/static/js/echarts.js"></script>
    <script src="/static/js/echarts.min.js"></script>
    <script src="/static/js/china.js"></script>
    <script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css"/>
    <link rel="stylesheet" href="/static/css/ckin.css">
    <link rel="stylesheet" href="/static/css/style.css">

    <script>
        $(window).load(function () {
            $(".loading").fadeOut()
        })
    </script>
</head>
<body>
<div class="loading">
    <div class="loadbox"><img src="/static/images/loading.gif"> 页面加载中...</div>
</div>

<div class="mainbox">
    <ul class="clearfix nav1">
        <li style="width: 25%">
            <div class="box">
                <div class="tit"><span>数据分析</span></div>
                <div id="bintu" class="boxnav" style=" height: 907px;"></div>
            </div>
            <div class="box">
                <div class="tit"><span>中国地图</span></div>
                <div id="china-map" class="boxnav" style=" height: 300px;">
                </div>
            </div>

        </li>
        <li style="width: 50%">
            <div class="tongji" style="height: 120px;">
                <h1>时实客流量<span>9104</span>人</h1>
                <ul>
                    <li>对比次时昨日累计:<span>2</span>人</li>
                    <li>同比增长:<span>2%</span></li>
                    <li>安装设备:<span>94</span></li>
                    <li>在线设备:<span>62</span></li>
                </ul>
            </div>

            <div id="map" class="box mapbox" style="width: 100%; height: 818px;"></div>

            <div>
                <div class="box" style="float: left; width: 49.5%;  padding: 0 15px; ">
                    <div class="tit"><span>男女比例</span></div>
                    <div id="echart1" style="height: 300px;"></div>
                </div>
                <div class="box" style="float: right; width: 49.5%;padding: 0 15px; ">
                    <div class="tit"><span>各年龄段比例</span></div>
                    <div id="echart2" style="height: 300px;"></div>
                </div>

            </div>
        </li>
        <li style="width: 25%">

            <div class="box box2">
                <div class="tit"><span>数据分析</span></div>
                <div id="main" class="boxnav" style=" height: 907px;"></div>
            </div>

            <div class="box">
                <div class="tit"><span>到访次数</span></div>
                <div class="boxnav" id="echart3" style=" height: 300px;"></div>
            </div>

        </li>

    </ul>
</div>

<script src="/static/js/ckin.js"></script>

<script type="text/javascript">
    // 创建Leaflet地图
    var map = L.map('map').setView([22.48972, 114.03259], 9);

    // 添加瓦片地图图层
    L.tileLayer('/static/path/mapabc/roadmap/{z}/{x}/{y}.png', {
        maxZoom: 18,
    }).addTo(map);

    //添加标注点
    L.marker([22.83589, 113.25484], {
        title: '清晖园',
        clickable: true, // 是否可以点击
        draggable: false, // 是否可以拖拽
    }).on('click', (e) => {
        // 点击事件
        console.log('e----', e)
        console.log('"点击图标"----', '点击图标')
    }).bindPopup(`<span style="color:black;">清晖园,位于广东省佛山市顺德区大良街道清晖路23号,是始建于明代的岭南园林建筑,占地面积为2.2万平方米,与佛山梁园、番禺余荫山房、东莞可园并称为岭南四大园林清晖园主体建筑包括有船厅、碧溪草堂、澄漪亭、惜阴书屋、真砚斋、状元堂等。园内植物200多种,且有多棵百年古树、中外名木。清晖园曾为状元府邸,也曾为大良龙氏的家园,这些居住在清晖园的家族走出了不少历史名人。清晖园是中国十大名园、广东四大名园之一,还是中华文化传承基地,佛山新八景之一,顺德新十景之一,其构筑精巧,布局紧凑,建筑艺术颇高,建筑物形式轻巧灵活,雅读朴素,庭园空间主次分明,结构清晰。利用碧水、绿树、古墙、漏窗、石山、小桥、曲廊等与亭台楼阁交互融合,集中国古代建筑、园林、雕刻、诗书、灰雕等艺术于一身。清晖园的文物有李兆洛、李文田、何绍基等大家的书法。2007年12月7日,清晖园被国家旅游局批准为国家AAAA级旅游景区,2013年,国务院核定公布清晖园为第七批全国重点文物保护单位。</span>`)
      .openPopup() // 由于要取当前标点信息,下边添加信息用 (e)=>{} 而不是直接写模板字符串
      .addTo(this.map) // 为了方便清除标点,下边添加标注点不用该方法

    L.marker([23.03, 113.18], {
        title: '我是可拖动的点',
        clickable: true, // 是否可以点击
        draggable: true, // 是否可以拖拽
    }).on('click', (e) => {
        // 点击事件
        console.log('e----', e)
        console.log('"点击图标"----', '点击图标')
    }).addTo(this.map)

    var circle = L.circle([22.812321, 113.152992], {
        color: 'red',
        fillColor: '#f03',
        fillOpacity: 0.5,
        radius: 500
    }).on('click', (e) => {
        // 点击事件
        console.log('e----', e)
        console.log('"点击图标"----', '点击图标')
    }).bindPopup(`<span style="color:black;">逢简水乡,地处广东省佛山市顺德区杏坛镇北端,面积5.2平方千米,是广东四大水乡之一,有广东“小周庄”之称。 [3] [6]作为顺德早期聚居地之一,逢简的历史最早可追溯到西汉,后来发展成一方集市,南宋嘉定年间之前,已有先民迁入该地居住而渐成村落。逢简水乡内文物古迹遍布,有始建于宋朝的广东省文物保护单位明远桥、始建于明朝的广东省文物保护单位刘氏大宗祠,以及佛山市级文物保护单位巨济桥、清康熙皇帝赐建的金鳌桥,清光绪皇帝御赐金桂。同时,古庙宇、古祠堂、古民居、古树众多,历史文化积淀深厚。 [2] [4]2015年,逢简水乡被评为国家AAA级旅游景区。</span>`)
      .openPopup() // 由于要取当前标点信息,下边添加信息用 (e)=>{} 而不是直接写模板字符串
      .addTo(this.map)

    var polygon = L.polygon([
        [22.987472, 113.268586],
        [22.812321, 113.152992],
        [22.83589, 113.25484]
    ]).addTo(this.map);

</script>

<script type="text/javascript">
    var myChart = echarts.init(document.getElementById('china-map'));
    //var name_title = "中国人民大学2017年各省市计划录取人数"
    //var subname = '上海、浙江无文理科录取人数'
    //var nameColor = " rgb(55, 75, 113)"
    //var name_fontFamily = '等线'
    //var subname_fontSize = 15
    //var name_fontSize = 18
    var mapName = 'china'
    var data = [
        {name: "北京", value: 177},
        {name: "天津", value: 42},
        {name: "河北", value: 102},
        {name: "山西", value: 81},
        {name: "内蒙古", value: 47},
        {name: "辽宁", value: 67},
        {name: "吉林", value: 82},
        {name: "黑龙江", value: 66},
        {name: "上海", value: 24},
        {name: "江苏", value: 92},
        {name: "浙江", value: 114},
        {name: "安徽", value: 109},
        {name: "福建", value: 116},
        {name: "江西", value: 91},
        {name: "山东", value: 119},
        {name: "河南", value: 137},
        {name: "湖北", value: 116},
        {name: "湖南", value: 114},
        {name: "重庆", value: 91},
        {name: "四川", value: 125},
        {name: "贵州", value: 62},
        {name: "云南", value: 83},
        {name: "西藏", value: 9},
        {name: "陕西", value: 80},
        {name: "甘肃", value: 56},
        {name: "青海", value: 10},
        {name: "宁夏", value: 18},
        {name: "新疆", value: 67},
        {name: "广东", value: 123},
        {name: "广西", value: 59},
        {name: "海南", value: 14},
    ];

    var geoCoordMap = {};
    var toolTipData = [
        {name: "北京", value: [{name: "文科", value: 95}, {name: "理科", value: 82}]},
        {name: "天津", value: [{name: "文科", value: 22}, {name: "理科", value: 20}]},
        {name: "河北", value: [{name: "文科", value: 60}, {name: "理科", value: 42}]},
        {name: "山西", value: [{name: "文科", value: 40}, {name: "理科", value: 41}]},
        {name: "内蒙古", value: [{name: "文科", value: 23}, {name: "理科", value: 24}]},
        {name: "辽宁", value: [{name: "文科", value: 39}, {name: "理科", value: 28}]},
        {name: "吉林", value: [{name: "文科", value: 41}, {name: "理科", value: 41}]},
        {name: "黑龙江", value: [{name: "文科", value: 35}, {name: "理科", value: 31}]},
        {name: "上海", value: [{name: "文科", value: 12}, {name: "理科", value: 12}]},
        {name: "江苏", value: [{name: "文科", value: 47}, {name: "理科", value: 45}]},
        {name: "浙江", value: [{name: "文科", value: 57}, {name: "理科", value: 57}]},
        {name: "安徽", value: [{name: "文科", value: 57}, {name: "理科", value: 52}]},
        {name: "福建", value: [{name: "文科", value: 59}, {name: "理科", value: 57}]},
        {name: "江西", value: [{name: "文科", value: 49}, {name: "理科", value: 42}]},
        {name: "山东", value: [{name: "文科", value: 67}, {name: "理科", value: 52}]},
        {name: "河南", value: [{name: "文科", value: 69}, {name: "理科", value: 68}]},
        {name: "湖北", value: [{name: "文科", value: 60}, {name: "理科", value: 56}]},
        {name: "湖南", value: [{name: "文科", value: 62}, {name: "理科", value: 52}]},
        {name: "重庆", value: [{name: "文科", value: 47}, {name: "理科", value: 44}]},
        {name: "四川", value: [{name: "文科", value: 65}, {name: "理科", value: 60}]},
        {name: "贵州", value: [{name: "文科", value: 32}, {name: "理科", value: 30}]},
        {name: "云南", value: [{name: "文科", value: 42}, {name: "理科", value: 41}]},
        {name: "西藏", value: [{name: "文科", value: 5}, {name: "理科", value: 4}]},
        {name: "陕西", value: [{name: "文科", value: 38}, {name: "理科", value: 42}]},
        {name: "甘肃", value: [{name: "文科", value: 28}, {name: "理科", value: 28}]},
        {name: "青海", value: [{name: "文科", value: 5}, {name: "理科", value: 5}]},
        {name: "宁夏", value: [{name: "文科", value: 10}, {name: "理科", value: 8}]},
        {name: "新疆", value: [{name: "文科", value: 36}, {name: "理科", value: 31}]},
        {name: "广东", value: [{name: "文科", value: 63}, {name: "理科", value: 60}]},
        {name: "广西", value: [{name: "文科", value: 29}, {name: "理科", value: 30}]},
        {name: "海南", value: [{name: "文科", value: 8}, {name: "理科", value: 6}]},
    ];

    /*获取地图数据*/
    myChart.showLoading();
    var mapFeatures = echarts.getMap(mapName).geoJson.features;
    myChart.hideLoading();
    mapFeatures.forEach(function (v) {
        // 地区名称
        var name = v.properties.name;
        // 地区经纬度
        geoCoordMap[name] = v.properties.cp;

    });

    // console.log("============geoCoordMap===================")
    // console.log(geoCoordMap)
    // console.log("================data======================")
    console.log(data)
    console.log(toolTipData)
    var max = 480,
        min = 9; // todo
    var maxSize4Pin = 100,
        minSize4Pin = 20;

    var convertData = function (data) {
        var res = [];
        for (var i = 0; i < data.length; i++) {
            var geoCoord = geoCoordMap[data[i].name];
            if (geoCoord) {
                res.push({
                    name: data[i].name,
                    value: geoCoord.concat(data[i].value),
                });
            }
        }
        return res;
    };
    option = {
        /*title: {
            text: name_title,
            subtext: subname,
            x: 'center',
            textStyle: {
                color: nameColor,
                fontFamily: name_fontFamily,
                fontSize: name_fontSize
            },
            subtextStyle:{
                fontSize:subname_fontSize,
                fontFamily:name_fontFamily
            }
        },*/
        tooltip: {
            trigger: 'item',
            formatter: function (params) {
                if (typeof (params.value)[2] == "undefined") {
                    var toolTiphtml = ''
                    for (var i = 0; i < toolTipData.length; i++) {
                        if (params.name == toolTipData[i].name) {
                            toolTiphtml += toolTipData[i].name + ':<br>'
                            for (var j = 0; j < toolTipData[i].value.length; j++) {
                                toolTiphtml += toolTipData[i].value[j].name + ':' + toolTipData[i].value[j].value + "<br>"
                            }
                        }
                    }
                    console.log(toolTiphtml)
                    // console.log(convertData(data))
                    return toolTiphtml;
                } else {
                    var toolTiphtml = ''
                    for (var i = 0; i < toolTipData.length; i++) {
                        if (params.name == toolTipData[i].name) {
                            toolTiphtml += toolTipData[i].name + ':<br>'
                            for (var j = 0; j < toolTipData[i].value.length; j++) {
                                toolTiphtml += toolTipData[i].value[j].name + ':' + toolTipData[i].value[j].value + "<br>"
                            }
                        }
                    }
                    console.log(toolTiphtml)
                    // console.log(convertData(data))
                    return toolTiphtml;
                }
            }
        },
        // legend: {
        //     orient: 'vertical',
        //     y: 'bottom',
        //     x: 'right',
        //     data: ['credit_pm2.5'],
        //     textStyle: {
        //         color: '#fff'
        //     }
        // },
        visualMap: {
            show: true,
            min: 0,
            max: 200,
            left: 'left',
            top: 'bottom',
            text: ['高', '低'], // 文本,默认为数值文本
            calculable: true,
            seriesIndex: [1],
            inRange: {
                // color: ['#3B5077', '#031525'] // 蓝黑
                // color: ['#ffc0cb', '#800080'] // 红紫
                // color: ['#3C3B3F', '#605C3C'] // 黑绿
                // color: ['#0f0c29', '#302b63', '#24243e'] // 黑紫黑
                // color: ['#23074d', '#cc5333'] // 紫红
                color: ['#00467F', '#A5CC82'] // 蓝绿
                // color: ['#1488CC', '#2B32B2'] // 浅蓝
                // color: ['#00467F', '#A5CC82'] // 蓝绿
                // color: ['#00467F', '#A5CC82'] // 蓝绿
                // color: ['#00467F', '#A5CC82'] // 蓝绿
                // color: ['#00467F', '#A5CC82'] // 蓝绿

            }
        },
        /*工具按钮组*/
        // toolbox: {
        //     show: true,
        //     orient: 'vertical',
        //     left: 'right',
        //     top: 'center',
        //     feature: {
        //         dataView: {
        //             readOnly: false
        //         },
        //         restore: {},
        //         saveAsImage: {}
        //     }
        // },
        geo: {
            show: true,
            map: mapName,
            label: {
                normal: {
                    show: false
                },
                emphasis: {
                    show: false,
                }
            },
            roam: true,
            itemStyle: {
                normal: {
                    areaColor: '#031525',
                    borderColor: '#3B5077',
                },
                emphasis: {
                    areaColor: '#2B91B7',
                }
            }
        },
        series: [{
            name: '散点',
            type: 'scatter',
            coordinateSystem: 'geo',
            data: convertData(data),
            symbolSize: function (val) {
                return val[2] / 10;
            },
            label: {
                normal: {
                    formatter: '{b}',
                    position: 'right',
                    show: true
                },
                emphasis: {
                    show: true
                }
            },
            itemStyle: {
                normal: {
                    color: '#05C3F9'
                }
            }
        },
            {
                type: 'map',
                map: mapName,
                geoIndex: 0,
                aspectScale: 0.75, //长宽比
                showLegendSymbol: false, // 存在legend时显示
                label: {
                    normal: {
                        show: true
                    },
                    emphasis: {
                        show: false,
                        textStyle: {
                            color: '#fff'
                        }
                    }
                },
                roam: true,
                itemStyle: {
                    normal: {
                        areaColor: '#031525',
                        borderColor: '#3B5077',
                    },
                    emphasis: {
                        areaColor: '#2B91B7'
                    }
                },
                animation: false,
                data: data
            },
            {
                name: '点',
                type: 'scatter',
                coordinateSystem: 'geo',
                symbol: 'pin', //气泡
                symbolSize: function (val) {
                    var a = (maxSize4Pin - minSize4Pin) / (max - min);
                    var b = minSize4Pin - a * min;
                    b = maxSize4Pin - a * max;
                    return a * val[2] + b;
                },
                label: {
                    normal: {
                        show: true,
                        textStyle: {
                            color: '#fff',
                            fontSize: 9,
                        }
                    }
                },
                itemStyle: {
                    normal: {
                        color: '#F62157', //标志颜色
                    }
                },
                zlevel: 6,
                data: convertData(data),
            },
            {
                name: 'Top 5',
                type: 'effectScatter',
                coordinateSystem: 'geo',
                data: convertData(data.sort(function (a, b) {
                    return b.value - a.value;
                }).slice(0, 5)),
                symbolSize: function (val) {
                    return val[2] / 10;
                },
                showEffectOn: 'render',
                rippleEffect: {
                    brushType: 'stroke'
                },
                hoverAnimation: true,
                label: {
                    normal: {
                        formatter: '{b}',
                        position: 'right',
                        show: true
                    }
                },
                itemStyle: {
                    normal: {
                        color: 'yellow',
                        shadowBlur: 10,
                        shadowColor: 'yellow'
                    }
                },
                zlevel: 1
            },

        ]
    };
    myChart.setOption(option);
</script>

<script type="text/javascript">
    var chartDom = document.getElementById('bintu');
    var myChart = echarts.init(chartDom);
    var option;

    var datas = [
        
        [
            {name: '圣彼得堡来客', value: 5.6},
            {name: '陀思妥耶夫斯基全集', value: 1},
            {name: '史记精注全译(全6册)', value: 0.8},
            {name: '加德纳艺术通史', value: 0.5},
            {name: '表象与本质', value: 0.5},
            {name: '其它', value: 3.8}
        ],
        // 
        [
            {name: '银河帝国5:迈向基地', value: 3.8},
            {name: '俞军产品方法论', value: 2.3},
            {name: '艺术的逃难', value: 2.2},
            {name: '第一次世界大战回忆录(全五卷)', value: 1.3},
            {name: 'Scrum 精髓', value: 1.2},
            {name: '其它', value: 5.7}
        ],
        
        [
            {name: '克莱因壶', value: 3.5},
            {name: '投资最重要的事', value: 2.8},
            {name: '简读中国史', value: 1.7},
            {name: '你当像鸟飞往你的山', value: 1.4},
            {name: '表象与本质', value: 0.5},
            {name: '其它', value: 3.8}
        ]
    ];
    option = {

        series: datas.map(function (data, idx) {
            var top = idx * 33.3;
            return {
                type: 'pie',
                radius: [20, 60],
                top: top + '%',
                height: '33.33%',
                left: 'center',
                width: 400,
                itemStyle: {
                    borderColor: '#fff',
                    borderWidth: 1
                },
                label: {
                    alignTo: 'edge',
                    formatter: '{name|{b}}\n{time|{c} 小时}',
                    minMargin: 5,
                    edgeDistance: 10,
                    lineHeight: 15,
                    rich: {
                        time: {
                            fontSize: 10,
                            color: '#999'
                        }
                    }
                },
                labelLine: {
                    length: 15,
                    length2: 0,
                    maxSurfaceAngle: 80
                },
                labelLayout: function (params) {
                    const isLeft = params.labelRect.x < myChart.getWidth() / 2;
                    const points = params.labelLinePoints;
                    // Update the end point.
                    points[2][0] = isLeft
                        ? params.labelRect.x
                        : params.labelRect.x + params.labelRect.width;
                    return {
                        labelLinePoints: points
                    };
                },
                data: data
            };
        })
    };

    option && myChart.setOption(option);
</script>

<script type="text/javascript">
    var app = {};

    var chartDom = document.getElementById('main');
    var myChart = echarts.init(chartDom);
    var option;

    option = {
        legend: {},
        tooltip: {},
        dataset: {
            dimensions: ['product', '2015', '2016', '2017'],
            source: [
                {product: 'Matcha Latte', 2015: 43.3, 2016: 85.8, 2017: 93.7},
                {product: 'Milk Tea', 2015: 83.1, 2016: 73.4, 2017: 55.1},
                {product: 'Cheese Cocoa', 2015: 86.4, 2016: 65.2, 2017: 82.5},
                {product: 'Walnut Brownie', 2015: 72.4, 2016: 53.9, 2017: 39.1}
            ]
        },
        xAxis: {type: 'category'},
        yAxis: {},
        // Declare several bar series, each will be mapped
        // to a column of dataset.source by default.
        series: [{type: 'bar'}, {type: 'bar'}, {type: 'bar'}]
    };

    option && myChart.setOption(option);
</script>
</body>
</html>

### 回答1: qtquick 是一种快速开发应用程序的框架,其中包含了各种各样的组件和模板,方便开发人员进行快速的应用开发。qtquick 通过其强大的绘图能力可以用来实现离线地图。 首先,我们可以利用 qtquick 提供的图形化编程界面设计地图的视图,包括地图的初始位置、缩放比例、地图标记和附近的公共设施等等。然后,我们可以加载本地的地图缓存文件,比如我们可以下载一些开源的地图缓存文件并存储在本地,然后在地图控件中设置加载本地文件的路径,这样即可实现离线地图的显示。 不仅如此,利用 qtquick 进行地图开发还可以实现定位、导航等功能,我们可以在地图上设置一个位置标记控件,实时更新用户的位置信息。同时,我们可以利用 qtquick 提供的网络模块加载实时的天气信息或交通状况,提供更加细致的地图服务。 需要注意的是,离线地图的开发需要先下载地图缓存文件,所以开发者需要在应用程序内提供下载缓存文件的功能,同时,地图缓存文件的更新和存储也需要进行定期管理。但是qtquick提供了较好的兼容性及良好的UI效果,使开发者可以快速实现离线地图的开发需求。 ### 回答2: QtQuick是Qt中用于构建图形界面的框架,它可以通过QML语言轻松实现各种UI效果。为了实现离线地图功能,我们可以利用Qt中的QML与C++结合的方式进行开发。 首先,在C++中使用QGeoTiledMappingManager引擎加载离线瓦片图层,这个类本身是可以支持加载在线瓦片图层。但是在加载离线瓦片时,可以自己实现缓存机制,避免多次读取离线瓦片。 然后,在QML中引用这个C++类并通过QML属性将地图上的视图坐标映射为地理坐标,同时地图上的图标、线、面等元素可以通过QML的Canvas来实现。通过绑定和交互,我们可以获得用户在地图上的操作,实现缩放、拖拽地图地图上标点、画线等操作。 此外,为了提升地图效率和交互体验,还可以通过QQuickFramebufferObject来实现自定义地图渲染,利用显卡进行加速。 综上,QtQuick结合C++可以快速实现离线地图功能,并借助Qt的丰富生态,可以轻松扩展到网络请求、数据存储等不同场景。 ### 回答3: 随着移动设备的普及,使用离线地图的需求越来越大。在Qt框架中,QtQuick是一种轻量级的用户界面呈现技术,非常适合开发移动应用程序。实现离线地图的过程可以通过以下几个步骤: 1. 获取地图数据 首先,需要获取离线地图数据。可以通过访问地图供应商的API获取数据,例如OpenStreetMap或Google Maps。然而,有些供应商可能需要支付费用才能使用API,而且有些很难获取。因此,如果需要使用免费的地图数据,你可以选择在OpenMapTiles等网站下载离线地图的数据。 2. 解析地图数据 获取地图数据后,需要使用Qt的API来解析它们,然后将它们转换为QtQuick中使用的格式。通常,地图数据包含在大型文件中,如GeoJSON或MBTiles。为了快速适配数据,可以使用QGeoJson或MBTiles格式,并使用QML中的Model来加载它们。 3. 使用QtQuick绘制地图 重要的一步是使用QtQuick中的MapType和Map对象来显示地图。QtQuick的MapType对象表示要显示的地图类型,如卫星影像或路线图。同时,Map对象是地图的主容器,控制它的平移和缩放。 4. 添加地图覆盖层 QtQuick还允许添加自定义图层到地图上,如标记点、线条、多边形或文字注释。这允许在地图上添加个性化信息或强化视觉效果。可以使用Image或Item组件制作标记点、方块或其他形状的图层,并使用QtQuick中的Canvas来绘制线条、多边形或自定义形状。 总之,使用QtQuick实现离线地图是一个高效而灵活的方法,可以使应用程序更加可扩展。可以使用QtQuick的API和组件以易于维护和更新的方式访问和处理地图数据。此外,QtQuick提供了灵活的功能,在创建高效可观察的应用程序时非常具有优势。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值