Extjs 百度地图扩展

支持 地址定位 ,标注,放大,缩小

今天上传不了效果图...

var bmapps;
Bsprint.EditMapInfoWindow = Ext.extend(Ext.Window, {
    form: null,
    constructor: function () {
        this.form = new Ext.form.FormPanel({
            plain: true,
            baseCls: "x-plain",
            labelWidth: 90,
            defaults: { allowBlank: false, anchor: "92%", xtype: "textfield" },
            keys: [{
                key: 13,
                fn: this.OnSubmit,
                scope: this
            }],
            items: [{
                xtype: "panel",
                baseCls: "x-plain",
                defaults: { border: false, anchor: "100%", plain: true, baseCls: "x-plain", style: "margin:0px 0px 10px 0px;" },
                plain: true,
                layout: "table",
                layoutConfig: {
                    columns: 2
                },
                items: [{
                    html: "地图精度:",
                    style: 'text-align:right;margin:0px 0px 10px 0px'
                }, {
                    xtype: "textfield",
                    allowBlank: false,
                    id: "TxtLng",
                    name: "TxtLng",
                    width: 180
                }, {
                    html: "地图纬度:",
                    style: 'text-align:right;margin:0px 0px 10px 0px'
                }, {
                    xtype: "textfield",
                    allowBlank: false,
                    id: "TxtLat",
                    name: "TxtLat",
                    width: 180
                }, {
                    html: "选择公司:",
                    style: 'text-align:right;margin:0px 0px 10px 0px'
                }, {
                    colspan: "2",
                    layout: "column",
                    items: [{
                        xtype: "textfield",
                        allowBlank: true,
                        id: "MapComapny",
                        blankText: "公司不能为空",
                        columnWidth: .8
                    }, {
                        xtype: "button",
                        text: "选择",
                        handler: this.SelectCompany,
                        scope: this,
                        width: 48,
                        columnsWidth: .2
                    }, { xtype: "hidden", id: "HdMapMemberID"}],
                    width: 180
                },
                {
                    html: "公司名称:",
                    style: 'text-align:right;margin:0px 0px 10px 0px'
                }, {
                    xtype: "textfield",
                    allowBlank: false,
                    id: "TxtCompanyName",
                    name: "TxtCompanyName",
                    width: 180
                }, {
                    html: "公司主营:",
                    style: 'text-align:right;margin:0px 0px 10px 0px'
                }, {
                    xtype: "textarea",
                    allowBlank: false,
                    id: "TxtStype",
                    name: "TxtStype",
                    height: 40,
                    width: 194
                },
                {
                    html: "公司地址:",
                    style: 'text-align:right;margin:0px 0px 10px 0px'
                }, {
                    xtype: "textfield",
                    allowBlank: false,
                    id: "TxtAddress",
                    name: "TxtAddress",
                    width: 180
                }, {
                    html: "联系电话:",
                    style: 'text-align:right;margin:0px 0px 10px 0px'
                }, {
                    xtype: "textfield",
                    allowBlank: false,
                    id: "TxtPhone",
                    name: "TxtPhone",
                    width: 180
                },
                {
                    html: "联系人:",
                    style: 'text-align:right;margin:0px 0px 10px 0px'
                }, {
                    xtype: "textfield",
                    allowBlank: false,
                    id: "TxtLinkMan",
                    name: "TxtLinkMan",
                    width: 180
                }

            ]
            }]
        });
        Bsprint.EditMapInfoWindow.superclass.constructor.call(this, {
            title: "编辑标注信息",
            modal: true,
            collapsible: true,
            closeAction: "hide",
            width: 400,
            shadow: false,
            height: 350,
            resizable: false,
            bodyStyle: "padding:10px",
            frame: true,
            items: [this.form],
            buttons: [{
                text: "保存",
                icon: "Ext/icon/37.png",
                handler: this.OnSubmit,
                scope: this
            }]

        });
    },
    OnLoad: function () {
        var record = this["record"];
        if (record != undefined && record != null) {
            Ext.getCmp("TxtLng").setValue(record.lng);
            Ext.getCmp("TxtLat").setValue(record.lat);
        }
    },
    SelectCompany: function () {
        if (_selMemberWindow == null) {
            _selMemberWindow = new Bsprint.PublicSelMemberWindow(EditMapWindows);
        }
        _selMemberWindow.show();
    },
    ReturnData: function () {
        var form = this.form.getForm();
        var record = this["recordq"];
        Ext.getCmp("MapComapny").setValue(record.get("companyname"));
        Ext.getCmp("HdMapMemberID").setValue(record.get("id"));
        Ext.getCmp("TxtStype").setValue(record.get("stype"));
        Ext.getCmp("TxtAddress").setValue(record.get("address"));
        Ext.getCmp("TxtPhone").setValue(record.get("phone"));
        Ext.getCmp("TxtLinkMan").setValue(record.get("linkman"));
        Ext.getCmp("TxtCompanyName").setValue(record.get("companyname"));
    },
    OnSubmit: function () {
        var w = this;
        var form = this.form.getForm();
        var Lat = Ext.getCmp("TxtLat").getValue(),
            Lng = Ext.getCmp("TxtLng").getValue(),
            Mid = Ext.getCmp("HdMapMemberID").getValue(),
            ise = 0,
            Stype = Ext.getCmp("TxtStype").getValue(),
            Address = Ext.getCmp("TxtAddress").getValue(),
            Phone = Ext.getCmp("TxtPhone").getValue(),
            LinkMan = Ext.getCmp("TxtLinkMan").getValue(),
            CompanyName = Ext.getCmp("TxtCompanyName").getValue();
        var params = {
            lat: Lat,
            lng: Lng,
            mid: Mid,
            ise: ise,
            stype: Stype,
            address: Address,
            phone: Phone,
            linkman: LinkMan,
            companyname:CompanyName
        };
        loadMask.show();
        if (form.isValid()) {
            Ext.Ajax.request({
                url: "DATA/MapAdd.ashx",
                params: params,
                success: function (response, options) {
                    loadMask.hide();
                    if (response.responseText == "1") {
                        Ext.Msg.alert("提示", "坐标存入成功!");
                        w.hide();
                    }
                    else if (response.responseText == "-1") {
                        Ext.Msg.confirm("提示", "已经存在\""+CompanyName+"\"的坐标,数据将会替换数据库原有数据,是否继续?", function (_btn) {//重新请求
                            if (_btn == "yes") {
                                options.params.ise = 1;
                                Ext.Ajax.request(options);
                            }
                        }, this);
                    }
                },
                failure: function (form, options) {
                    loadMask.hide();
                    Ext.Msg.confirm("错误", "验证失败,是否重新验证?", function (_btn) {//重新请求
                        if (_btn == "yes") {
                            Ext.Ajax.request(options);
                        }
                    }, this);
                }
            });
        }

    }
});
Bsprint.MapPanel = Ext.extend(Ext.Panel, {
    constructor: function () {
        Bsprint.MapPanel.superclass.constructor.call(this, {
            tbar: ["<font color='red'>步骤:1.右键标注,点击红点完善信息  2.右键点击搜索地址,再完善信息</font>"],
            id: "BMAP"
        });
    },
    initComponent: function () {
        //测试配置
        var defConfig = {
            width: 300,
            height: 400,
            plain: true,
            border: false,
            zoomLevel: 15,
            gmapType: 'map',
            ContextMenus: ['放大', '缩小', '放置到最大级', '查看全国', '在此添加标注', { setZoom: '缩小' }, "搜索"],
            mapControls: ['NavigationControl', 'ScaleControl', 'OverviewMapControl', 'MapTypeControl'],
            x: 104.072206,
            y: 30.665474
        };
        Ext.applyIf(this, defConfig);
        Bsprint.MapPanel.superclass.initComponent.call(this);
    }
    , afterRender: function () {
        Bsprint.MapPanel.superclass.afterRender.call(this);

        //实例地图
        this.bmap = new BMap.Map(this.body.dom);
        //设置中心位置
        this.bmap.centerAndZoom(new BMap.Point(this.x, this.y), this.zoomLevel);
        //地图加载完成后加载控件和菜单
        this.bmap.addEventListener("tilesloaded", this.onMapReady());

    }
    , getMap: function () {
        return this.bmap;
    }
    , onMapReady: function () {
        //添加地图控件
        this.addMapControls();
        //添加标注
        // this.addMarkers(this.markers);
        //添加右击菜单
        this.addContextMenus();
        this.getMap().enableScrollWheelZoom();

    }
    , addMapControls: function () {
        //根据配置设置地图默认控件
        if (this.gmapType === 'map') {
            if (Ext.isArray(this.mapControls)) {
                for (var i = 0; i < this.mapControls.length; i++) {
                    this.addMapControl(this.mapControls[i]);
                }
            } else if (typeof this.mapControls === 'string') {
                this.addMapControl(this.mapControls);
            } else if (typeof this.mapControls === 'object') {
                this.getMap().addControl(this.mapControls);
            }
        }
    }
    , addMapControl: function (mc) {
        //Check是否是百度地图的事件
        var mcf = BMap[mc];
        if (typeof mcf === 'function') {
            this.getMap().addControl(new mcf());
        }

    }
    , addContextMenus: function () {
        var contextMenu = new BMap.ContextMenu();
        //根据配置设置地图右击菜单
        if (Ext.isArray(this.ContextMenus)) {
            for (i = 0; i < this.ContextMenus.length; i++) {
                contextMenu.addItem(this.addContextMenu(this.ContextMenus[i]));
            }
        }
        this.bmap.addContextMenu(contextMenu);
    }
     , addContextMenu: function (Menu) {
         //var mcf = BMap[mc];
         if (typeof Menu === 'string') {
             switch (Menu) {
                 case '放大': return new BMap.MenuItem(Menu, function () { this._map.zoomIn() }, 100)
                 case '缩小': return new BMap.MenuItem(Menu, function () { this._map.zoomOut() }, 100)
                 case '放置到最大级': return new BMap.MenuItem(Menu, function () { this._map.setZoom(18) }, 100)
                 case '查看全国': return new BMap.MenuItem(Menu, function () { this._map.setZoom(4) }, 100)
                 case '在此添加标注':
                     return new BMap.MenuItem(Menu, function (p) {
                         var marker = new BMap.Marker(p), px = this._map.pointToPixel(p);
                         this._map.addOverlay(marker);
                         //启动标注可移动
                         marker.enableDragging(true);
                         //取得标记坐标
                         var nPosition = marker.getPosition();
                         //创建信息窗口)
                         // var infoWindow = new BMap.InfoWindow(nPosition.lat + ',' + nPosition.lng);
                         //绑定click事件
                         marker.addEventListener("click", function () {

                             if (EditMapWindows == null) {
                                 EditMapWindows = new Bsprint.EditMapInfoWindow();
                             }
                             var data = { lat: nPosition.lat, lng: nPosition.lng };
                             //这里的弹出框与我自己定义的Window相关,可以自定义其他方法....
EditMapWindows["record"] = data; EditMapWindows.show(); EditMapWindows.OnLoad(); // this.openInfoWindow(infoWindow); //Ext.Msg.alert("提示", nPosition.lng); }); //移动标注后取坐标 marker.addEventListener("dragend", function () { nPosition = marker.getPosition(); infoWindow = new BMap.InfoWindow(nPosition.lat + ',' + nPosition.lng); }) }, 100) case '搜索': return new BMap.MenuItem(Menu, function (p) { bmapps = this; Ext.MessageBox.prompt("输入框", "请输入详细地址:", function (bu, txt) { if (bu == "ok") { var myGeo = new BMap.Geocoder(); myGeo.getPoint(txt, function (point) { if (point) { bmapps._map.clearOverlays(); var marker = new BMap.Marker(point); bmapps._map.centerAndZoom(point, 19); bmapps._map.addOverlay(marker); var nPosition = marker.getPosition(); marker.addEventListener("click", function () { if (EditMapWindows == null) { EditMapWindows = new Bsprint.EditMapInfoWindow(); } var data = { lat: nPosition.lat, lng: nPosition.lng }; EditMapWindows["record"] = data; EditMapWindows.show(); EditMapWindows.OnLoad(); // this.openInfoWindow(infoWindow); //Ext.Msg.alert("提示", nPosition.lng); }); } else { Ext.Msg.alert("提示", "无法定位到地址!"); } }, ""); } }); }); } } } , addMarkers: function (markers) { if (Ext.isArray(markers)) { for (var i = 0; i < markers.length; i++) { var mkr_point = new BMap.Point(markers[i].lat, markers[i].lng); var markerS = new BMap.Marker(mkr_point); this.addMarker(mkr_point, markerS, false, true, markers[i].listeners); } } }, addMarker: function (point, markerS, clear, center, listeners) { // Ext.applyIf(marker, G_DEFAULT_ICON); if (clear === true) { this.getMap().clearOverlays(); } if (center === true) { this.getMap().setCenter(point, this.zoomLevel); } if (typeof listeners === 'object') { for (evt in listeners) { markerS.addEventListener(evt, listeners[evt]); } } this.getMap().addOverlay(markerS); }, OnSearch: function () { var tbar = this.getTopToolbar().items; var text = tbar.itemAt(1).getValue(); var myGeo = new BMap.Geocoder(); myGeo.getPoint(text, function (point) { if (point) { var bmap = new BMap.Map(this.body); this.bmap.clearOverlays(); initlng = point.lng; initlat = point.lat; var newPoint; var myIcon = new BMap.Icon("http://google-maps-icons.googlecode.com/files/walking-tour.png", new BMap.Size(30, 35), { offset: new BMap.Size(10, 25), imageOffset: new BMap.Size(0, 0 - 0 * 25) }); if (initlng == "" || initlat == "") { newPoint = map.getCenter(); } else { newPoint = new BMap.Point(newlng, newlat); } this.bmap.centerAndZoom(newPoint, bili); var marker = new BMap.Marker(newPoint, { icon: myIcon }); this.bmap.addOverlay(marker); } else { Ext.Msg.alert("提示", "无法定位到地址!"); } }, ""); } }); Ext.reg('bmappanel', Ext.ux.BMapPanel);

  

posted @ 2013-01-29 09:18  *.D.龙  阅读(620)  评论(0编辑  收藏  举报