<!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">
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <script src="lib/simpleRequire.js"></script>
        <script src="lib/config.js"></script>
        <script src="lib/jquery.min.js"></script>
        <script src="lib/facePrint.js"></script>
        <script src="lib/testHelper.js"></script>
        <!-- <script src="ut/lib/canteen.js"></script> -->
        <link rel="stylesheet" href="lib/reset.css" />
    </head>
    <body>
        <style>
        </style>



        <div id="main_simple_geo_svg_coord"></div>
        <div id="main_simple_geo_svg_viewBox_svgWH"></div>
        <div id="main_geo_json_focus_blur"></div>
        <div id="main_geo_svg_emphasis_select"></div>
        <div id="main_pure_geo_svg"></div>
        <div id="main_pure_map_svg"></div>
        <div id="main_map_geo_svg"></div>
        <div id="main_geo_svg_click_finder"></div>
        <div id="main_geo_svg_multiple_geo"></div>





        <script>
            function listenAndPrintEvent(chart) {
                if (!chart) {
                    return;
                }
                const out = {
                };
                chart.on('geoselectchanged', function (params) {
                    out.geoselectechanged = {
                        allSelected: params.allSelected
                    };
                    console.log('geoselectechanged', params);
                    chart.__testHelper.updateInfo(out, 'event');
                });
                chart.on('selectchanged', function (params) {
                    out.selectechanged = {
                        selected: params.selected
                    };
                    console.log('selectechanged', params);
                    chart.__testHelper.updateInfo(out, 'event');
                });
                chart.on('click', function (params) {
                    out.click = {
                        componentIndex: params.componentIndex,
                        componentType: params.componentType,
                        geoIndex: params.geoIndex,
                        name: params.name
                    };
                    console.log('click', params);
                    chart.__testHelper.updateInfo(out, 'event');
                });
            }
        </script>








        <script>
        require(['echarts'/*, 'map/js/china' */], function (echarts) {
            const svg = [
                '<?xml version="1.0" encoding="utf-8"?>',
                '<svg xmlns="http://www.w3.org/2000/svg" xmlns:ooo="http://xml.openoffice.org/svg/export" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" fill-rule="evenodd" xml:space="preserve">',
                '<path name="left_rect" d="M 0,0 L 0,100 100,100 100,0 Z" fill="#765" stroke="rgb(56,93,138)" stroke-width="0" stroke-linecap="square" stroke-linejoin="miter"/>',
                '<path name="right_rect" d="M 150,0 L 150,100 250,100 250,0 Z" fill="#567" stroke="rgb(56,93,138)" stroke-width="0" stroke-linecap="square" stroke-linejoin="miter"/>',
                '</svg>'
            ].join('')

            echarts.registerMap('testGeoSVG_coord', { svg: svg });

            option = {
                animation: false,
                tooltip: {
                },
                geo: {
                    map: 'testGeoSVG_coord',
                    roam: true,
                    top: 0,
                    bottom: 0,
                    left: 0,
                    right: 0,
                },
                series: [{
                    type: 'scatter',
                    geoIndex: 0,
                    coordinateSystem: 'geo',
                    symbolSize: 30,
                    data: [{
                        value: [200, 50],
                        itemStyle: {
                            color: 'blue'
                        }
                    }]
                }]
            };

            var chart = testHelper.create(echarts, 'main_simple_geo_svg_coord', {
                title: [
                    'A **blue circle** should be in the center of the right rect.',
                    '**Click** inside the rect or outside the rect.',
                    'Check SVG coord displayed (via convertFromPixel).',
                    '(The left rect is 100*100 and left-top corner is (0,0))',
                    '**Click btn1**, check Pixel.point[1] should be around 100',
                    '**Click btn2**, check Pixel.point[1] should be around 200'
                ],
                option: option,
                infoKey: 'SVG coord',
                info: {},
                height: 200,
                buttons: [{
                    text: 'converToPixel({ geoIndex: 0 }, "left_rect")',
                    onclick: function () {
                        var point = chart.convertToPixel({ geoIndex: 0 }, 'left_rect');
                        console.log(point);
                        chart.__testHelper.updateInfo(
                            { point: point },
                            'Pixel'
                        );
                    }
                }, {
                    text: 'convertToPixel({ geoIndex: 0 }, [100, 100])',
                    onclick: function () {
                        var point = chart.convertToPixel({ geoIndex: 0 }, [100, 100]);
                        console.log(point);
                        chart.__testHelper.updateInfo(
                            { point: point },
                            'Pixel'
                        );
                    }
                }]
            });

            if (chart) {
                chart.getZr().on('click', function (event) {
                    var x = event.offsetX;
                    var y = event.offsetY;
                    console.log(x, y);
                    var svgCoord = chart.convertFromPixel({ geoIndex: 0 }, [x, y]);
                    console.log(svgCoord);
                    chart.__testHelper.updateInfo(
                        { x: svgCoord[0], y: svgCoord[1] },
                        'SVG coord'
                    );
                });
            }

        });
        </script>






        <script>
        require(['echarts'], function (echarts) {
            const xmlHeader = '<?xml version="1.0" encoding="utf-8"?>';
            const svgTagCommonAttr = ' xmlns="http://www.w3.org/2000/svg" xmlns:ooo="http://xml.openoffice.org/svg/export" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" fill-rule="evenodd" xml:space="preserve" ';

            // Both svgWdith svgHeight viewBox
            const svg1 = [
                xmlHeader,
                '<svg ' + svgTagCommonAttr,
                'viewBox="99500 99500 1000 1000"',
                'width="5px" height="5px"',
                '>',
                '<circle cx="100000" cy="100000" r="500" fill="blue" stroke-linecap="square" stroke-linejoin="miter"/>',
                '</svg>'
            ].join(' ');
            // Both svgWdith svgHeight viewBox and clip
            const svg2 = [
                xmlHeader,
                '<svg ' + svgTagCommonAttr,
                'viewBox="99500 99500 500 500"',
                'width="5px" height="5px"',
                '>',
                '<circle cx="100000" cy="100000" r="500" fill="blue" stroke-linecap="square" stroke-linejoin="miter"/>',
                '</svg>'
            ].join(' ');
            // Only svgWdith svgHeight
            const svg3 = [
                xmlHeader,
                '<svg ' + svgTagCommonAttr,
                'width="100000" height="100000"',
                '>',
                '<circle cx="100000" cy="100000" r="100000" fill="blue" stroke-linecap="square" stroke-linejoin="miter"/>',
                '</svg>'
            ].join(' ');
            // Only viewBox
            const svg4 = [
                xmlHeader,
                '<svg ' + svgTagCommonAttr,
                'viewBox="99500 99500 500 500"',
                '>',
                '<circle cx="100000" cy="100000" r="500" fill="blue" stroke-linecap="square" stroke-linejoin="miter"/>',
                '</svg>'
            ].join(' ');
            // Neither viewBox and svgWidth svgHeight
            const svg5 = [
                xmlHeader,
                '<svg ' + svgTagCommonAttr,
                '>',
                '<circle cx="100000" cy="100000" r="500" fill="blue" stroke-linecap="square" stroke-linejoin="miter"/>',
                '</svg>'
            ].join(' ');
            // Both viewBox but only svgHeight no svgWidth
            const svg6 = [
                xmlHeader,
                '<svg ' + svgTagCommonAttr,
                'viewBox="99500 99500 1000 1000"',
                'height="500"',
                '>',
                '<circle cx="100000" cy="100000" r="500" fill="blue" stroke-linecap="square" stroke-linejoin="miter"/>',
                '</svg>'
            ].join(' ');

            echarts.registerMap('testGeoSVG_viewBox_svgWH_1', { svg: svg1 });
            echarts.registerMap('testGeoSVG_viewBox_svgWH_2', { svg: svg2 });
            echarts.registerMap('testGeoSVG_viewBox_svgWH_3', { svg: svg3 });
            echarts.registerMap('testGeoSVG_viewBox_svgWH_4', { svg: svg4 });
            echarts.registerMap('testGeoSVG_viewBox_svgWH_5', { svg: svg5 });
            echarts.registerMap('testGeoSVG_viewBox_svgWH_6', { svg: svg6 });

            const RECT_SIZE = 50;
            const Y_TOP = 10;
            const X_LEFT = 10;
            const GAP = 20;

            var _itemIndex = 0;
            var _graphicOptionArr = [];
            var _geoOptionArr = [];

            function makeItem(text, mapType) {
                var x = X_LEFT + (RECT_SIZE + GAP) * _itemIndex++;
                _graphicOptionArr.push({
                    type: 'rect',
                    silent: true,
                    shape: { x: x, y: Y_TOP, width: RECT_SIZE, height: RECT_SIZE },
                    style: { stroke: 'red', lineWidth: 1, fill: null }
                }, {
                    type: 'text',
                    silent: true,
                    style: {
                        text: text, x: x + RECT_SIZE / 2, y: Y_TOP + RECT_SIZE + GAP,
                        fill: '#000', textAlign: 'center', textVerticalAlign: 'middle'
                    }
                });
                _geoOptionArr.push({
                    map: mapType,
                    left: x, top: Y_TOP, width: RECT_SIZE, height: RECT_SIZE,
                    itemStyle: { color: 'blue' }
                });
            }

            makeItem('circle', 'testGeoSVG_viewBox_svgWH_1');
            makeItem('1/4 sector', 'testGeoSVG_viewBox_svgWH_2');
            makeItem('1/4 sector', 'testGeoSVG_viewBox_svgWH_3');
            makeItem('1/4 sector', 'testGeoSVG_viewBox_svgWH_4');
            makeItem('circle', 'testGeoSVG_viewBox_svgWH_5');
            makeItem('thin ellipse', 'testGeoSVG_viewBox_svgWH_6');

            option = {
                animation: false,
                tooltip: {
                },
                graphic: _graphicOptionArr,
                geo: _geoOptionArr
            };

            var chart = testHelper.create(echarts, 'main_simple_geo_svg_viewBox_svgWH', {
                title: [
                    'viewBox test:',
                    'Check each shape should be inside each red rect.',
                    'Check each shape be correspondence with the text.',
                ],
                option: option,
                height: 100
            });
        });
        </script>






        <script>
        require(['echarts'/*, 'map/js/china' */], function (echarts) {
            const testGeoJson1 = {
                'type': 'FeatureCollection',
                'features': [
                    {
                        'type': 'Feature',
                        'geometry': {
                            'type': 'Polygon',
                            'coordinates': [
                                [[2000, 2000], [5000, 2000], [5000, 5000], [2000, 5000]]
                            ]
                        },
                        'properties': {
                            'name': 'Afghanistan'
                        }
                    },
                    {
                        'type': 'Feature',
                        'geometry': {
                            'type': 'Polygon',
                            'coordinates': [
                                [[6000, 2300], [9300, 2300], [9000, 5000]]
                            ]
                        },
                        'properties': {
                            'name': 'BBB'
                        }
                    }
                ]
            };

            echarts.registerMap('testGeoJson2', testGeoJson1);

            option = {
                tooltip: {
                },
                geo: {
                    map: 'testGeoJson2',
                    roam: true,
                    selectedMode: 'single',
                    label: {
                        show: true
                    },
                    emphasis: {
                        focus: 'self'
                    },
                    // height: '100%',
                    // center
                    // layoutCenter: ['30%', 40],
                    // layoutSize: 40,
                    // boundingCoords
                    zoom: 1,
                    aspectScale: 1
                }
            };

            var chart = testHelper.create(echarts, 'main_geo_json_focus_blur', {
                title: [
                    'check geoJSON focus-blur',
                    '**Click** them, check click info'
                ],
                option: option,
                info: {},
                infoKey: 'event',
                height: 200
            });

            listenAndPrintEvent(chart);

        });
        </script>






        <script>
        require(['echarts'/*, 'map/js/china' */], function (echarts) {
            const svg = [
                '<?xml version="1.0" encoding="utf-8"?>',
                '<svg xmlns="http://www.w3.org/2000/svg" xmlns:ooo="http://xml.openoffice.org/svg/export" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" fill-rule="evenodd" xml:space="preserve">',
                '<path name="a" d="M 0,0 L 0,100 100,100 100,0 Z" transform="rotate(45)" fill="rgb(16,193,138)" stroke="green" stroke-width="2" stroke-linecap="square" stroke-linejoin="miter"/>',
                '<path name="a" d="M 110,0 L 110,100 210,100 210,0 Z" fill="rgb(16,193,138)" stroke="green" stroke-width="2" stroke-linecap="square" stroke-linejoin="miter"/>',
                '<g name="b">',
                    '<path d="M 0,110 L 0,210 100,110 Z" fill="rgb(16,193,138)" stroke="green" stroke-width="2" stroke-linecap="square" stroke-linejoin="miter"/>',
                    '<path d="M 110,110 L 110,210 210,110 Z" fill="rgb(16,193,138)" stroke="green" stroke-width="2" stroke-linecap="square" stroke-linejoin="miter"/>',
                '</g>',
                '<radialGradient id="XMLID_1_" cx="0" cy="220" r="59.4363" gradientUnits="userSpaceOnUse">',
                    '<stop  offset="0" style="stop-color:#E6E6E6"/>',
                    '<stop  offset="1" style="stop-color:#4D4D4D"/>',
                '</radialGradient>',
                '<path name="c" d="M 0,220 L 0,320 100,220 Z" fill="url(#XMLID_1_)" stroke="green" stroke-width="2" stroke-linecap="square" stroke-linejoin="miter"/>',
                '<radialGradient id="XMLID_2_" cx="110" cy="220" r="59.4363" gradientUnits="userSpaceOnUse">',
                    '<stop  offset="0" style="stop-color:#E6E6E6"/>',
                    '<stop  offset="1" style="stop-color:#4D4D4D"/>',
                '</radialGradient>',
                '<path name="c" d="M 110,220 L 110,320 210,220 Z" fill="url(#XMLID_2_)" stroke="green" stroke-width="2" stroke-linecap="square" stroke-linejoin="miter"/>',
                '</svg>'
            ].join('')

            echarts.registerMap('testGeoSVG_select_hover', { svg: svg });

            option = {
                // tooltip: {
                // },
                geo: {
                    map: 'testGeoSVG_select_hover',
                    roam: true,
                    selectedMode: 'single',
                    // height: '100%',
                    // center
                    // layoutCenter: ['30%', 40],
                    // layoutSize: 40,
                    // boundingCoords
                    zoom: 1,
                    aspectScale: 1,
                    label: {
                        show: true
                    },
                    emphasis: {
                        focus: 'self',
                        label: {
                            show: true,
                            fontSize: 100
                        }
                    },
                    select: {
                        itemStyle: {
                            color: 'red'
                        }
                    }
                }
            };

            var chart = testHelper.create(echarts, 'main_geo_svg_emphasis_select', {
                title: [
                    'click buttons',
                    'hover check',
                    'check focus-blur',
                    'check label no scale/rotate'
                ],
                option: option,
                info: {},
                infoKey: 'event',
                height: 200,
                button: [{
                    text: 'highlight a',
                    onclick: function () {
                        chart.dispatchAction({ type: 'highlight', geoIndex: 0, name: 'a' });
                    }
                }, {
                    text: 'downplay a',
                    onclick: function () {
                        chart.dispatchAction({ type: 'downplay', geoIndex: 0, name: 'a' });
                    }
                }, {
                    text: 'select a',
                    onclick: function () {
                        chart.dispatchAction({ type: 'geoSelect', geoIndex: 0, name: 'a' });
                    }
                }, {
                    text: 'unselect a',
                    onclick: function () {
                        chart.dispatchAction({ type: 'geoUnSelect', geoIndex: 0, name: 'a' });
                    }
                }, {
                    text: 'highlight b',
                    onclick: function () {
                        chart.dispatchAction({ type: 'highlight', geoIndex: 0, name: 'b' });
                    }
                }, {
                    text: 'downplay b',
                    onclick: function () {
                        chart.dispatchAction({ type: 'downplay', geoIndex: 0, name: 'b' });
                    }
                }, {
                    text: 'select b',
                    onclick: function () {
                        chart.dispatchAction({ type: 'geoSelect', geoIndex: 0, name: 'b' });
                    }
                }, {
                    text: 'unselect b',
                    onclick: function () {
                        chart.dispatchAction({ type: 'geoUnSelect', geoIndex: 0, name: 'b' });
                    }
                }]
            });

            listenAndPrintEvent(chart);

            if (chart) {
                chart.on('highlight', function () {
                });
            }

        });
        </script>







        <script>
            require([
                'echarts',
                'data/svg/flight-seats.svg'
            ], function (echarts, svg) {
                echarts.registerMap('flight-seats', {
                    svg: svg
                });

                option = {
                    tooltip: {
                    },
                    geo: {
                        map: 'flight-seats',
                        roam: true,
                        selectedMode: 'multiple',
                        tooltip: {
                            show: true
                        },
                        emphasis: {
                            itemStyle: {
                                color: null,
                                borderColor: '#780705',
                                borderWidth: 3
                            },
                            label: {
                                textBorderColor: '#fff',
                                textBorderWidth: 2
                            }
                        },
                        select: {
                            itemStyle: {
                                color: '#b50205'
                            },
                            label: {
                                show: false,
                                textBorderColor: '#fff',
                                textBorderWidth: 2
                            }
                        }
                    }
                };

                var chart = testHelper.create(echarts, 'main_pure_geo_svg', {
                    title: [
                        'pure geo component with svg resource',
                        'click seat: check **allSelected** correct.',
                        'hover seat: check **tooltip** and **label** correct.'
                    ],
                    option: option,
                    info: {},
                    infoKey: 'event',
                    height: 300
                });

                listenAndPrintEvent(chart);

            });
        </script>






        <script>
            require([
                'echarts',
                'data/svg/seatmap-example.svg'
            ], function (echarts, svg) {
                echarts.registerMap('seatmap', {
                    svg: svg
                });

                option = {
                    tooltip: {
                    },
                    series: {
                        type: 'map',
                        map: 'seatmap',
                        roam: true,
                        selectedMode: 'multiple',
                        // height: 100,
                        // zoom: 1.5
                        emphasis: {
                            label: {
                                textBorderColor: '#fff',
                                textBorderWidth: 2
                            }
                        },
                        select: {
                            itemStyle: {
                                color: '#b50205'
                            },
                            label: {
                                show: false,
                                textBorderColor: '#fff',
                                textBorderWidth: 2
                            }
                        }
                    }
                };

                var chart = testHelper.create(echarts, 'main_pure_map_svg', {
                    title: [
                        'pure map series with svg resource',
                        'Hover seat: check **tooltip** correct.'
                    ],
                    option: option,
                    info: {},
                    infoKey: 'event',
                    height: 300
                    // buttons: [{text: 'btn-txt', onclick: function () {}}],
                    // recordCanvas: true,
                });

                listenAndPrintEvent(chart);
            });
        </script>





        <script>
            require([
                'echarts',
                'data/svg/seatmap-example.svg'
            ], function (echarts, svg) {
                var option;
                echarts.registerMap('seatmap', {
                    svg: svg
                });

                option = {
                    tooltip: {
                    },
                    geo: {
                        map: 'seatmap',
                        roam: true,
                        selectedMode: 'multiple',
                        // height: 100,
                        // zoom: 1.5
                        tooltip: {
                            show: true
                        },
                        emphasis: {
                            label: {
                                textBorderColor: '#fff',
                                textBorderWidth: 2
                            }
                        },
                        select: {
                            itemStyle: {
                                color: '#b50205'
                            },
                            label: {
                                show: false,
                                textBorderColor: '#fff',
                                textBorderWidth: 2
                            }
                        }
                    },
                    series: {
                        type: 'map',
                        selectedMode: 'multiple',
                        coordinateSystem: 'geo',
                        geoIndex: 0
                    }
                };

                var chart = testHelper.create(echarts, 'main_map_geo_svg', {
                    title: [
                        'map series on declared geo with svg resource',
                        'Hover seat: check **tooltip** correct.'
                    ],
                    option: option,
                    info: {},
                    infoKey: 'event',
                    height: 300
                    // buttons: [{text: 'btn-txt', onclick: function () {}}],
                    // recordCanvas: true,
                });

                listenAndPrintEvent(chart);
            });
        </script>






        <script>
        require(['echarts'/*, 'map/js/china' */], function (echarts) {
            const svg = [
                '<?xml version="1.0" encoding="utf-8"?>',
                '<svg xmlns="http://www.w3.org/2000/svg" xmlns:ooo="http://xml.openoffice.org/svg/export" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" fill-rule="evenodd" xml:space="preserve">',
                '<path name="a" d="M 0,0 L 0,100 100,100 100,0 Z" fill="green" stroke="rgb(56,93,138)" stroke-width="2" stroke-linecap="square" stroke-linejoin="miter"/>',
                '<path name="b" d="M 150,0 L 150,100 250,100 250,0 Z" fill="blue" stroke="rgb(56,93,138)" stroke-width="2" stroke-linecap="square" stroke-linejoin="miter"/>',
                '</svg>'
            ].join('')

            echarts.registerMap('testGeoSVGclick', { svg: svg });

            var option = {
                geo: {
                    map: 'testGeoSVGclick',
                    selectedMode: 'single',
                    zoom: 1,
                    aspectScale: 1,
                    label: {
                        show: true
                    }
                }
            };

            var chart = testHelper.create(echarts, 'main_geo_svg_click_finder', {
                title: [
                    'Click green rect, should display click event.',
                    'Click blue rect, should display nothing.'
                ],
                option: option,
                info: {},
                infoKey: 'click event',
                height: 200
            });

            if (chart) {
                chart.on('click', { geoIndex: 0, name: 'a' }, function (params) {
                    console.log(params);
                    chart.__testHelper.updateInfo({
                        componentIndex: params.componentIndex,
                        componentType: params.componentType,
                        geoIndex: params.geoIndex,
                        name: params.name
                    }, 'click event');
                });
            }

        });
        </script>







        <script>
        require(['echarts'/*, 'map/js/china' */], function (echarts) {
            const svg = [
                '<?xml version="1.0" encoding="utf-8"?>',
                '<svg xmlns="http://www.w3.org/2000/svg" xmlns:ooo="http://xml.openoffice.org/svg/export" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" fill-rule="evenodd" xml:space="preserve">',
                '<path name="a" d="M 0,0 L 0,100 100,100 100,0 Z" fill="green" stroke="rgb(56,93,138)" stroke-width="2" stroke-linecap="square" stroke-linejoin="miter"/>',
                '</svg>'
            ].join('')

            echarts.registerMap('testGeoSVG_for_multiple_test', { svg: svg });

            var option = {
                geo: [{
                    id: 'g1',
                    map: 'testGeoSVG_for_multiple_test',
                    selectedMode: 'single',
                    layoutCenter: ['25%', '50%'],
                    layoutSize: 20,
                    select: {
                        itemStyle: { color: 'red' }
                    }
                }, {
                    id: 'g2',
                    map: 'testGeoSVG_for_multiple_test',
                    selectedMode: 'single',
                    layoutCenter: ['50%', '50%'],
                    layoutSize: 20,
                    select: {
                        itemStyle: { color: 'red' }
                    },
                }, {
                    id: 'g3',
                    map: 'testGeoSVG_for_multiple_test',
                    selectedMode: 'single',
                    layoutCenter: ['75%', '50%'],
                    layoutSize: 20,
                    select: {
                        itemStyle: { color: 'red' }
                    },
                }]
            };

            var chart = testHelper.create(echarts, 'main_geo_svg_multiple_geo', {
                title: [
                    'Select the three rect to red.',
                    'click btn. Check all of the existing rect removed,',
                    'and only one new green rect generated.'
                ],
                option: option,
                height: 200,
                buttons: [{
                    text: 'change geo (replaceMerge)',
                    onclick: function (params) {
                        chart.setOption({
                            geo: {
                                id: 'g4',
                                map: 'testGeoSVG_for_multiple_test',
                                selectedMode: 'single',
                                layoutCenter: ['40%', '50%'],
                                layoutSize: 40,
                                select: {
                                    itemStyle: { color: 'red' }
                                }
                            }
                        }, { replaceMerge: 'geo' });
                    }
                }]
            });

        });
        </script>






    </body>
</html>

