<!doctype html>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->


<html>
    <head>
        <meta charset="utf-8">
        <title>Scatter</title>
        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
        <meta name="apple-mobile-web-app-capable" content="yes"> <!-- Fullscreen Landscape on iOS -->
    </head>
    <body>
        <style>
            html, body, #main {
                background: #111;
                width: 100%;
                height: 100%;
                margin: 0;
            }
        </style>
        <div id="main"></div>
        <div id="data-count">
            <span>LOADED: </span>
            <span id="data-count-number"></span>
        </div>
        <style>
            #data-count {
                font-size: 30px;
                color: #fff;
                position: absolute;
                z-index: 1000;
                left: 10px;
                bottom: 10px;
            }
            #data-count-number {
                font-size: 80px;
            }
        </style>
        <script src="../dist/echarts.js"></script>
        <script src="./data/map/js/world.js"></script>
        <script src="lib/jquery.min.js"></script>
        <script src="lib/countup.js"></script>
        <script>
            var chart = echarts.init(document.getElementById('main'));

            var dataCount = 0;
            var CHUNK_COUNT = 200;
            // var CHUNK_COUNT = 20;
            // https://blog.openstreetmap.org/2012/04/01/bulk-gps-point-data/
            function fetchData(idx) {
                if (idx >= CHUNK_COUNT) {
                    return;
                }
                // var dataURL = `../../echarts-gl/test/data/gps/gps_${idx}.bin`;
                // var dataURL = `../../data-online/gps/gps_${idx}.bin`;
                var dataURL = `../../echarts-examples/public/data/asset/data/gps2/gps_${idx}.bin`;
                var xhr = new XMLHttpRequest();
                xhr.open('GET', dataURL, true);
                xhr.responseType = 'arraybuffer';

                xhr.onload = function (e) {
                    var rawData = new Int32Array(this.response);
                    var data = new Float32Array(rawData.length);
                    var addedDataCount = rawData.length / 2;
                    for (var i = 0; i < rawData.length; i += 2) {
                        data[i] = rawData[i+1] / 1e7;
                        data[i+1] = rawData[i] / 1e7;
                    }

                    chart.appendData({
                        seriesIndex: 0,
                        data: data
                    });

                    var countUp = new CountUp('data-count-number', dataCount, dataCount + addedDataCount, 0, 1);
                    countUp.start();
                    dataCount += addedDataCount;

                    fetchData(idx + 1);
                }

                xhr.send();
            }

            chart.setOption({
                backgroundColor: '#000',
                geo: {
                    map: 'world',
                    roam: true,
                    label: {
                        emphasis: {
                            show: false
                        }
                    },
                    silent: true,
                    itemStyle: {
                        normal: {
                            areaColor: '#323c48',
                            borderColor: '#111'
                        },
                        emphasis: {
                            areaColor: '#2a333d'
                        }
                    }
                },
                series: [{
                    name: '弱',
                    type: 'scatter',
                    progressive: 1e5,
                    coordinateSystem: 'geo',
                    symbolSize: 0.5,
                    blendMode: 'lighter',
                    large: true,
                    itemStyle: {
                        normal: {
                            color: 'rgb(20, 15, 2)'
                        }
                    },
                    postEffect: {
                        enable: true
                    },
                    silent: true,
                    dimensions: ['lng', 'lat'],
                    data: new Float32Array()
                }]
            });

            fetchData(0);
        </script>
    </body>
</html>