map.html 10.7 KB

<div class="container-fluid page" id="split_data_page">
    <div class="card">

        <div class="card-body" style="height: 100%">
            <div class="top_form_card">
                <form onsubmit="return false;">
                    <div class="row">
                        <div class="col-md-8" style="padding-right: 0;">
                            <div class="form-group">
                                <label class="bmd-label-floating">输入线路</label>
                                <div class="ct_auto_wrap line_autocompleter">
                                    <input type="text" class="form-control">
                                </div>
                            </div>
                        </div>
                        <div class="col-md-4" style="padding-left: 0;">
                            <div class="form-group top_radio_wrap">
                                <div class="radio">
                                    <label>
                                        <input type="radio" name="upDownRadios" value=0 checked>
                                        上行
                                    </label>&nbsp;&nbsp;
                                    <label>
                                        <input type="radio" name="upDownRadios" value=1>
                                        下行
                                    </label>
                                </div>
                            </div>
                        </div>
                    </div>
                </form>
            </div>

            <div class="m_map_wrap">
                <div class="row" style="height: 100%;">
                    <div class="col-md-6 map_cont"></div>
                    <div class="col-md-6 map_cont"></div>
                </div>
            </div>
        </div>
    </div>
</div>

<script>
    (function () {
        var wrap = '#split_data_page'
            , map1, map2
            , point = new BMap.Point(121.544336, 31.221315)
            , zoom = 18;

        map1 = new BMap.Map($('.map_cont:eq(0)', wrap)[0]);
        map1.centerAndZoom(point, zoom);
        map1.enableScrollWheelZoom(true);
        map1.addEventListener('moveend', syncMaps);
        map1.addEventListener('zoomend', syncMaps);

        map2 = new BMap.Map($('.map_cont:eq(1)', wrap)[0]);
        map2.centerAndZoom(point, zoom);
        map2.enableScrollWheelZoom(true);
        //map2.addEventListener('moveend', syncMaps);
        //map2.addEventListener('zoomend', syncMaps);

        //线路自动补全
        $.get('/basic/lines', function (rs) {
            var data = [], item;
            for (var i = 0, len = rs.length; i < len; i++) {
                item = rs[i];
                data.push({
                    code: item.lineCode,
                    text: item.name,
                    others: [item.fullChars, item.camelChars]
                });
            }
            gb_ct_autocompleter.build($('.line_autocompleter', wrap), data);
        });

        //线路选择事件
        $('.line_autocompleter input', wrap).on('auto_change', function () {
            _curr.lineCode = $(this).data('val');

            $(loadShade).show();
            $.get('/geo_data/' + _curr.lineCode, function (rs) {
                var i;
                for (i = 0, len = rs.stations[0].length; i < len; i++)
                    _fixed(rs.stations[0][i])
                for (i = 0, len = rs.stations[1].length; i < len; i++)
                    _fixed(rs.stations[1][i])

                var t = '数据异常';
                if (rs.section[0].length == 0)
                    gb_utils.showNotification(t, '当前选择的线路缺少上行路段', 'danger');

                if (rs.section[1].length == 0)
                    gb_utils.showNotification(t, '当前选择的线路缺少下行路段', 'danger');

                if (rs.stations[0].length == 0)
                    gb_utils.showNotification(t, '当前选择的线路缺少上行站点', 'danger');

                if (rs.stations[1].length == 0)
                    gb_utils.showNotification(t, '当前选择的线路缺少下行站点', 'danger');
                drawMap(rs);
            });
        });

        function _fixed(s) {
            if (!isNaN(s.length))
                s.length = s.length.toFixed(2);
            else
                s.length = s.length + '  ';
            s._name = s.name + ' #' + s.length;
        }

        //切换上下行
        $('[name=upDownRadios]', wrap).on('click', function () {
            map1.setZoom(zoom);
            map2.setZoom(zoom);
            drawMap();
        });

        /**
         * 同步地图位置
         */
        var sync_delay = 300
            , sync_flag
            , sync_center, sync_zoom, sync_sub_map;

        function syncMaps() {
            sync_sub_map = this == map1 ? map2 : map1;
            sync_center = this.getCenter();
            sync_zoom = this.getZoom();

            if (sync_flag)
                return;
            sync_flag = true;

            setTimeout(function () {
                sync_sub_map.setCenter(sync_center);
                sync_sub_map.setZoom(sync_zoom);

                reDrawMarkers(sync_zoom);
                _curr.zoom = sync_zoom;
                sync_flag = false;
            }, sync_delay);
        }

        //当前选中线路信息
        var _curr = {
            lineCode: '',
            upDown: 0,
            data: {},
            stationMarkerArr: [],
            zoom: zoom
        };

        function drawMap(rs) {
            try{
                if (rs)
                    _curr.data = rs;
                if (!_curr.lineCode)
                    return;

                var updown = parseInt($('input[name="upDownRadios"]:checked').val());
                if (!rs && _curr.upDown == updown)
                    return;
                else if (_curr.data)
                    rs = _curr.data;

                $(loadShade).show();
                map1.clearOverlays();
                map2.clearOverlays();
                _curr.upDown = updown;
                _curr.stationMarkerArr = [];
                var stationArr = rs.stations[_curr.upDown];
                drawStations(stationArr, map1, true);//绘制站点
                drawSections(stationArr, map1);//绘制站点间路段
                //定位到起始站点
                map1.setCenter(
                    new BMap.Point(stationArr[0].bd_lon, stationArr[0].bd_lat));

                //map2
                drawStations(stationArr, map2);//绘制站点
                drawOriginSections(rs.section[_curr.upDown], map2);//绘制原始路段
            }catch (e) {
                console.log(e);
            }
            $(loadShade).hide();
        }

        function drawStations(arr, _map, showLen) {
            var s, point, marker, w, iw, icon, text;
            for (var i = 0, len = arr.length; i < len; i++) {
                s = arr[i];
                s.index = i + 1;
                transCoord(s);

                point = new BMap.Point(s.bd_lon, s.bd_lat);
                marker = new BMap.Marker(point);

                //根据站点名称 计算marker 宽度
                w = s._name.length * 12 - 10;
                iw = w - 2;

                icon = new BMap.Icon(gb_map_utils.createStationIcon(s, w)
                    , new BMap.Size(iw, 24), {anchor: new BMap.Size(iw / 2, 25)})
                marker.setIcon(icon);
                marker._data = s;
                _map.addOverlay(marker);

                _curr.stationMarkerArr.push(marker);
            }
        }

        function drawSections(arr, _map) {
            var s, coords, pos, polyline;
            var color = arr[0].upDown == 0 ? 'blue' : 'red'
                , style = {strokeWeight: 5, strokeColor: color, strokeOpacity: .7};

            for (var i = 0, len = arr.length; i < len; i++) {
                s = arr[i];
                pos = [];
                $.each(s.paths, function () {
                    coords = TransGPS.wgsToBD(this.lat, this.lon);
                    pos.push(new BMap.Point(coords.lng, coords.lat));
                });

                polyline = new BMap.Polyline(pos, style);
                _map.addOverlay(polyline);
            }
        }

        function drawOriginSections(arr, _map) {
            var ps, pos, coords, polyline;
            var color = arr[0].upDown == 0 ? 'blue' : 'red'
                , style = {strokeWeight: 5, strokeColor: color, strokeOpacity: .7};

            for (var i = 0, len = arr.length; i < len; i++) {
                ps = arr[i].ps;

                pos = [];
                for (var j = 0, jLen = ps.length; j < jLen; j++) {
                    coords = TransGPS.wgsToBD(ps[j].lat, ps[j].lon);
                    pos.push(new BMap.Point(coords.lng, coords.lat));
                }

                polyline = new BMap.Polyline(pos, style);
                _map.addOverlay(polyline);
            }
        }

        function transCoord(obj) {
            if (obj.bd_lat)
                return;
            var coord = TransGPS.wgsToBD(obj.lat, obj.lon);
            obj.bd_lat = coord.lat;
            obj.bd_lon = coord.lng;
        }

        /**
         * 根据缩放级别,重新绘制站点 ICON
         * @param zoom
         */
        var zommMapp = {
            3: 1,
            4: 1,
            5: 1,
            6: 1,
            7: 1,
            8: 1,
            9: 1,
            10: 1,
            11: 1,
            12: 1,
            13: 1,
            14: 1,
            15: 1,
            16: 1,
            17: 2,
            18: 2,
            19: 2
        };

        function reDrawMarkers(zoom) {
            if (zommMapp[_curr.zoom] == zommMapp[zoom])
                return;

            var array = _curr.stationMarkerArr, m, s, icon, w, iw;

            for (var i = 0, len = array.length; i < len; i++) {
                m = array[i];
                s = m._data;

                if (zommMapp[zoom] == 1) {
                    s._name = s['length'];
                    w = s._name.length * 12;
                }
                else if (zommMapp[zoom] == 2) {
                    s._name = s.name + ' #' + s.length;
                    w = s._name.length * 12 - 10;
                }

                iw = w - 2;
                icon = new BMap.Icon(gb_map_utils.createStationIcon(m._data, w)
                    , new BMap.Size(iw, 24), {anchor: new BMap.Size(iw / 2, 25)})
                m.setIcon(icon);
            }
        }
    })();
</script>