`
yx200404
  • 浏览: 78557 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

搭建简单的EXT-GWT(GXT)的开发环境(四)ext-gwt(gxt)结合google map第三版开发

阅读更多
随便写着玩玩.不要太认真哦^^

这里说一下googlemap第三版和第二版的区别在于第三版能够在移动设备上运行得更快更好.而且第三版取消了key,无需为不同域名注册不用的key了.

为什么要是用第3方的library?如果不用,就需要在gwt项目中自己编写许多js代码来访问谷歌地图.使用后,就可以直接写java代码来访问啦^^.

gwt官方的google map api library还停留在第2版的基础上,还好.有个牛人把第三版的所有类都平移到了java上,并且发布成了gwt的插件.而且,此library在MVP下也能相当容易的被添加进来.

这个项目网址是 http://code.google.com/p/gwt-google-maps-v3/

有兴趣的朋友可以透过这个网址查询更多有用的信息.附件里面提供了google-map-v3的jar包下载.

开始前,没有google map js版基础的还是需要先看看官方的js版介绍.

网址是 http://code.google.com/apis/maps/documentation/javascript/

因为那个牛人是把js类,方法一字不差(目前还没发现有类名有区别的)的平移到gwt上的,所以熟悉js中的一些基本类还是有必要的.

PS:由于我能力有限..就没法把实现原理和大家分享了..

好了,废话不多说了,开始改造项目吧..^^

首先把jar包添加进来.然后在GoogleMapV3.gwt.xml中添加以下内容
  <inherits name='com.google.gwt.maps.Maps' />


我们要实现的基本功能是在地图上显示几个停车场的车位情况,这些情况都是从后台数据库中获取的.
第二个功能是使用者可以选择自己所在地址,然后通过"寻路"功能,在地图上显示出来从所选位置如何驾车到指定的停车场的路径.

有几个资源图片,我放在附件中了,其中有几个不同颜色的停车场图标,用于区分剩余车位情况.剩的少的,就用红色,黄色,剩的多的就用绿色,蓝色等.
拿到这借个图片后,想将他们拷贝到war下即可.

先简单的修改一下实体:ParkData.java,在这个bean里面存储一些显示用信息,这个bean将从后台传递到前台供显示.除了上次所说的需要将其序列化外,还需要让他继承com.extjs.gxt.ui.client.data.BaseModel.因为我们页面会用到一个gxt组件--下拉框.在这里不得不啰嗦一下,如果你需要将一个自己定义的实体放到gxt的组件中,基本上都要继承BaseModel.在gxt中的"bean"和java常规的bean是有一定区别的.java中使用get(),set(XXX)方法获取属性,而gxt bean则使用get("pname"),set("pname",object)方法设置和获取属性.以这个项目为例,我们要把ParkData中的parkName放到下拉框中显示,那么就需要将setParkName改造一下,如下
public void setParkName(String parkName) {
		this.parkName = parkName;
		set("name",parkName);
	}


然后前台的下拉框设置需要显示的字段如下:
  combox.setDisplayField("name");


这样,下拉框就能显示了.当然,这是只是gxt中显示实体中字段的一种方式,通过继承不同的父类,具体的编码方式又会有所改变.比如继承BeanModel,有些gxt组件就不需要显式的set这些
property,但ComboBox是必须要有这个set("pname",object)的方法的.

然后在GreetingService.java中添加方法
List<ParkData> getParks();

保存后你会发现这个类说有错误.这个时候转到GreetingServiceAsync.java,点击红色错误,选择第一个Generat method...........即可自动生成出对于的方法.继续保存,然后你会发现GreetingServiceImpl.java又有错误了..原因是没有实现方法getParks(),好吧,就实现它吧
@Override
	public List<ParkData> getParks() {
		//如果你数据库中有数据
//		return parkDataManager.getAll();
		
		List<ParkData> datas = new ArrayList<ParkData>();
		ParkData data = new ParkData();
		data.setAllNum("150");
		data.setLastNum("88");
		data.setIcon("parking_green.png");
		data.setId(1);
		data.setLat(22.57604477669078);
		data.setLng(113.95060540771487);
		data.setParkName("石鼓山公园停车场");
		data.setTel("18675511111");
		data.setDescs("每小时2元");
		data.setUpdateTime("2011-08-18 17:55:24");
		data.setAddress("石鼓山路1号");
		datas.add(data);
		
		ParkData data2 = new ParkData();
		data2.setAllNum("80");
		data2.setLastNum("0");
		data2.setIcon("parking_red.png");
		data2.setId(2);
		data2.setLat(22.58099803468149);
		data2.setLng(113.95493985748294);
		data2.setParkName("西丽天虹购物中心停车场");
		data2.setTel("0755-23336868");
		data2.setDescs("每小时5元");
		data2.setUpdateTime("2011-08-18 17:56:27");
		data2.setAddress("沙河西路2345号");
		datas.add(data2);
		
		ParkData data3 = new ParkData();
		data3.setAllNum("120");
		data3.setLastNum("50");
		data3.setIcon("parking_blue.png");
		data3.setId(2);
		data3.setLat(22.581047566362173);
		data3.setLng(113.9514744434357);
		data3.setParkName("西丽医院停车场");
		data3.setTel("0755-86655555");
		data3.setDescs("每小时3元");
		data3.setUpdateTime("2011-08-18 16:02:20");
		data3.setAddress("留仙大道54号");
		datas.add(data3);
		
		return datas;
	}


然后,修改GoogleMapV3.java,添加地图代码进去
import java.util.List;

import com.extjs.gxt.ui.client.GXT;
import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.Style.LayoutRegion;
import com.extjs.gxt.ui.client.Style.Scroll;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.util.Theme;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Viewport;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.maps.client.HasMapOptions;
import com.google.gwt.maps.client.MapOptions;
import com.google.gwt.maps.client.MapTypeId;
import com.google.gwt.maps.client.MapWidget;
import com.google.gwt.maps.client.base.HasInfoWindow;
import com.google.gwt.maps.client.base.HasInfoWindowOptions;
import com.google.gwt.maps.client.base.HasLatLng;
import com.google.gwt.maps.client.base.InfoWindow;
import com.google.gwt.maps.client.base.InfoWindowOptions;
import com.google.gwt.maps.client.base.LatLng;
import com.google.gwt.maps.client.directions.DirectionsCallback;
import com.google.gwt.maps.client.directions.DirectionsRenderer;
import com.google.gwt.maps.client.directions.DirectionsRequest;
import com.google.gwt.maps.client.directions.DirectionsService;
import com.google.gwt.maps.client.directions.DirectionsStatus;
import com.google.gwt.maps.client.directions.DirectionsTravelMode;
import com.google.gwt.maps.client.directions.HasDirectionsRenderer;
import com.google.gwt.maps.client.directions.HasDirectionsRequest;
import com.google.gwt.maps.client.directions.HasDirectionsResult;
import com.google.gwt.maps.client.directions.HasDirectionsService;
import com.google.gwt.maps.client.event.Event;
import com.google.gwt.maps.client.event.EventCallback;
import com.google.gwt.maps.client.event.HasMouseEvent;
import com.google.gwt.maps.client.event.MouseEventCallback;
import com.google.gwt.maps.client.overlay.HasMarker;
import com.google.gwt.maps.client.overlay.HasMarkerOptions;
import com.google.gwt.maps.client.overlay.Marker;
import com.google.gwt.maps.client.overlay.MarkerImage;
import com.google.gwt.maps.client.overlay.MarkerOptions;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.RootPanel;
import com.yx.map.client.bean.ParkData;

public class GoogleMapV3 implements EntryPoint {

	public static final String Greeting_SERVICE = "/greetingService.gwt";
	private final GreetingServiceAsync greetingService = GWT
			.create(GreetingService.class);
	private MapWidget mapWidget;
	private TextField<String> myLatLng = new TextField<String>();
	private HasInfoWindow lastInfoWindow = null;
	private HasMarker hasMarker = null;
	private ComboBox<ParkData> combox = new ComboBox<ParkData>();
	private ListStore<ParkData> stroe = new ListStore<ParkData>();
	private HasDirectionsService directionsService = new DirectionsService();
	private HasDirectionsRenderer directionsDisplay = new DirectionsRenderer();

	public void onModuleLoad() {

		ServiceDefTarget endpoint = (ServiceDefTarget) greetingService;
		String moduleRelativeURL = Greeting_SERVICE;
		endpoint.setServiceEntryPoint(moduleRelativeURL);
		Registry.register(Greeting_SERVICE, greetingService);

		// 设置样式
		GXT.setDefaultTheme(Theme.GRAY, true);
		
		//这个MapOptions对于js版本中的
//		 var myOptions = {
//			      zoom: 8,
//			      center: latlng,
//			      mapTypeId: google.maps.MapTypeId.ROADMAP
//			    };
		final HasMapOptions options = new MapOptions();
		// 设置缩放级别
		options.setZoom(14);
		// 设置地图中心位置
		// 22.57604477669078, 113.95060540771487
		options.setCenter(new LatLng(22.57604477669078, 113.95060540771487));
		// 设置地图样式.
		options.setMapTypeId(new MapTypeId().getRoadmap());
		
		// 启用拖动地图
		options.setDraggable(true);
		// 启用地图导航控件.其实就是左边的那个
		options.setNavigationControl(true);
		// 启用地图类型选择控制器.用于选择是卫星视图.还是普通的视图.
		options.setMapTypeControl(true);
		// 启用鼠标滚轮缩放
		options.setScrollwheel(true);

		//MapWidget是一个map容器,并不是真正的map对象,如果你要拿到map,需要mapWidget.getMap()
		mapWidget = new MapWidget(options);
		mapWidget.setSize("2000px", "2000px");
		directionsDisplay.setMap(mapWidget.getMap());

		Event.addListener(options, "click", new MouseEventCallback() {

			@Override
			public void callback(HasMouseEvent event) {
				myLatLng.setValue(event.getLatLng().getLatitude() + ","
						+ event.getLatLng().getLongitude());
				if (hasMarker != null) {
					hasMarker.setVisible(false);
				}
				HasMarkerOptions mymarkerOptions = new MarkerOptions();
				mymarkerOptions.setTitle("我的位置");
				mymarkerOptions.setPosition(event.getLatLng());
				mymarkerOptions.setClickable(true);
				mymarkerOptions.setMap(mapWidget.getMap());
				HasMarker mark = new Marker(mymarkerOptions);
				mark.setVisible(true);
				hasMarker = mark;
			}
		});

		greetingService.getParks(new AsyncCallback<List<ParkData>>() {

			@Override
			public void onSuccess(List<ParkData> result) {
				//把结果添加到stroe中用于给下拉列表做选择
				stroe.add(result);
				//循环结果,在地图上构建marker
				for (ParkData parkData : result) {
					MarkerImage.Builder builder = new MarkerImage.Builder(
							parkData.getIcon());

					HasMarkerOptions mymarkerOptions = new MarkerOptions();
					mymarkerOptions.setTitle(parkData.getParkName());
					mymarkerOptions.setPosition(new LatLng(parkData.getLat(),
							parkData.getLng()));
					mymarkerOptions.setClickable(true);
					mymarkerOptions.setIcon(builder.build());
					mymarkerOptions.setMap(mapWidget.getMap());
					final HasMarker mark = new Marker(mymarkerOptions);
					mark.setVisible(true);

					//构建对话框
					HasInfoWindowOptions infoWindowOptions = new InfoWindowOptions();
					infoWindowOptions.setContent("<h4>"
							+ parkData.getParkName() + "</h4><br/>"
							+ parkData.getAddress() + "<br/>" + "总车位: <b>"
							+ parkData.getAllNum() + "</b><br/>"
							+ "空车位: <b>" + parkData.getLastNum()
							+ "</b><br/>" + "费用简介:" + parkData.getDescs()
							+ "<br/>" + "电话:" + parkData.getTel() + "<br/>"
							+ "更新时间:" + parkData.getUpdateTime() + "<br/>");
					final HasInfoWindow infoWindow = new InfoWindow(
							infoWindowOptions);

					//添加marker的点击事件
					Event.addListener(mark, "click", new EventCallback() {

						@Override
						public void callback() {
							if (null != lastInfoWindow) {
								lastInfoWindow.close();
							}
							infoWindow.open(mapWidget.getMap(), mark);
							lastInfoWindow = infoWindow;
						}
					});
				}
				createMap();
				GXT.hideLoadingPanel("loading");
			}

			@Override
			public void onFailure(Throwable caught) {
			}
		});

	}

	private void createMap() {
		Viewport viewport = new Viewport();
		viewport.setLayout(new BorderLayout());

		ContentPanel panel2 = new ContentPanel();
		panel2.setSize(500, 500);
		panel2.setScrollMode(Scroll.NONE);
		panel2.setLayout(new FitLayout());

		panel2.add(mapWidget);

		Button button = new Button("查 询");
		button.addSelectionListener(new SelectionListener<ButtonEvent>() {

			@Override
			public void componentSelected(ButtonEvent ce) {
				// 获取目的地址
				HasLatLng desclan = new LatLng(combox.getValue().getLat(),
						combox.getValue().getLng());
				HasDirectionsRequest request = new DirectionsRequest();
				// request.setTravelMode("DRIVING");
//				Walking代表走路过去的路线,Driving代表驾车路线..一般驾车路线会比较绕......要遵守交通规则 哈哈.
//				request.setTravelMode(new DirectionsTravelMode().Walking());
				request.setTravelMode(new DirectionsTravelMode().Driving());
				request.setDestinationLatLng(desclan);
				//设置起始地址
				request.setOriginLatLng(hasMarker.getPosition());
				request.setProvideRouteAlternatives(false);
				//这段代码很重要,如果不加入,那么无法导航.
				//至于为什么要删除__gwt_ObjectId作者也没详说,只给出了这个解决方法.
				if (!GWT.isScript()) {
					removeGwtObjectId(request.getJso());
				}
				directionsService.route(request, new DirectionsCallback() {

					@Override
					public void callback(HasDirectionsResult response,
							String status) {
						if (status.equals(new DirectionsStatus().Ok())) {
							directionsDisplay.setDirections(response);
							if (hasMarker != null) {
								hasMarker.setVisible(false);
							}
						}
					}
				});

			}
		});

		ToolBar toolBar = new ToolBar();

		combox.setStore(stroe);
		combox.setTriggerAction(TriggerAction.ALL);
		//设置显示属性
		combox.setDisplayField("name");
		combox.setValue(stroe.getAt(0));
		toolBar.add(combox);
		toolBar.add(button);
		panel2.setTopComponent(toolBar);

		viewport.add(panel2, new BorderLayoutData(LayoutRegion.CENTER));
		viewport.add(myLatLng, new BorderLayoutData(LayoutRegion.NORTH, 50, 50,
				50));
		RootPanel.get().add(viewport);
	}

	private native void removeGwtObjectId(JavaScriptObject jso) /*-{
		delete jso['__gwt_ObjectId'];
	}-*/;

}


吼吼,最后修改html即可
在html中加入
<head>
<script src="http://maps.google.com/maps/api/js?sensor=false"></script>
<head>

<body>
	<div id="loading">正在加载停车场车位数据...</div>
  </body>






注意sensor=false,如果你在移动设备上运行,就可以改成true,那么就会启用gps等定位系统了,这个参数是必须有的!还有个language参数,你可以设置不同的语言.不依赖浏览器语言设置.

OK.OVER.
http://www.nptpark.com
  • lib.zip (350.8 KB)
  • 下载次数: 62
  • src.zip (16.2 KB)
  • 下载次数: 49
  • 大小: 198.9 KB
1
1
分享到:
评论
2 楼 xydkd 2012-01-30  
麻烦问一下,想要使用spring框架在后台添加标记点怎样在前台JS代码中接收Json数据解析并画出那个标注
1 楼 hbyanke 2011-11-15  
能不能提供一下项目的全部源码,正在学习中。。。

相关推荐

    EXT-GWT(GXT) 2.2.4 JAVA API DOC chm 版

    EXT-GWT,全称为Ext GWT,是Sencha公司推出的一款基于Java的开源富互联网应用程序(Rich Internet Application,RIA)开发框架。GXT是EXT-GWT的简称,它提供了丰富的用户界面组件,允许开发者用Java代码来构建复杂的...

    搭建简单的EXT-GWT(GXT)的开发环境

    本文将详细介绍如何搭建一个简单的EXT-GWT(GXT)开发环境。 首先,你需要安装Eclipse集成开发环境以及Google Plugin for Eclipse。Google Plugin for Eclipse包含了GWT的开发工具,使得在Eclipse中编写、测试和...

    搭建简单的EXT-GWT(GXT)的开发环境(三)gxt结合spring和hibernate进行数据操作

    EXT-GWT(GXT)是一种基于Google Web Toolkit (GWT) 的高级用户界面库,它提供了丰富的组件和样式,使得开发者能够构建出复杂的、企业级的Web应用。本篇文章将聚焦于如何在EXT-GWT中整合Spring框架和Hibernate ORM,...

    EXT-GWT(GXT)2.2.3 API DOC.zip

    EXT-GWT,全称为Ext GWT,是Sencha公司开发的一个强大的Java库,用于构建富互联网应用程序(RIA)。GXT是EXT-GWT的扩展,它提供了更多组件、样式和功能,使得开发者能够创建出与桌面应用相媲美的用户体验。GXT 2.2.3...

    EXT-GWT(GXT) 2.2.5 JAVA API DOC chm 版

    EXT-GWT(GXT) 2.2.4 JAVA API DOC chm 版.完美的的搜索功能,支持全文检索。2011年11月制作。如果打不开,请选中它,点右键 看属性,选择解除锁定。别再抱怨打不开了。

    EXT-GWT 2.2.0 API DOC (gxt) chm版

    EXT-GWT 2.2.0 API DOC (gxt) chm 版 。 2010年10月制作。完美的搜索功能。如果打不开,请选中它,点右键 看属性,选择解除锁定。别再抱怨打不开了。

    gxt-2.1.1-gwt2 最新的

    gxt-2.1.1-gwt2gxt-2.1.1-gwt2gxt-2.1.1-gwt2gxt-2.1.1-gwt2gxt-2.1.1-gwt2gxt-2.1.1-gwt2gxt-2.1.1-gwt2gxt-2.1.1-gwt2gxt-2.1.1-gwt2gxt-2.1.1-gwt2gxt-2.1.1-gwt2gxt-2.1.1-gwt2

    EXT-GWT 2.2.3 API DOC (gxt) chm 版

    EXT-GWT 2.2.3 API DOC (gxt) chm 版,完美的的搜索功能,支持全文检索。2011年3月制作。如果打不开,请选中它,点右键 看属性,选择解除锁定。别再抱怨打不开了。

    EXT-GWT 2.2.2 API DOC (gxt) chm 版

    EXT-GWT 2.2.2 API DOC (gxt) chm 版 。 2011年3月制作。完美的搜索功能。 如果打不开,请选中它,点右键 看属性,选择解除锁定。别再抱怨打不开了。

    ext-gwt的下载非常好

    gxt的下载非常好,ext-gwt的下载非常好

    gxt-2.2.4 EXT GWT

    gxt-2.2.4 EXT GWT Note : Ext GWT 2.X requires GWT 1.7+ or GWT 2.0+ (any build ending in "-gwt2.zip").

    ext-GXT-2.3

    Sencha GXT high performance UI widgets coupled with GXT's full interoperability with Google Web Toolkit components accelerate your web apps development process to increase your productivity

    gxt-2.2.5-gwt22.jar

    gxt用jar包,2.25版本,我自己用过的,没问题,放在这里备份下~

    搭建gxt-2.2.0环境,让我们第一个简单程序跑起来

    在本文中,我们将深入探讨如何搭建GXT (GWT eXtensions) 2.2.0开发环境,并实现一个简单的程序运行。GXT 是一个基于Google Web Toolkit (GWT) 的JavaScript库,提供了丰富的用户界面组件和强大的数据网格功能,广泛...

    英文版Developing with EXT-GWT-book

    ### GXT开发指南:《Developing with ExtGWT: Enterprise RIA Development》解析 #### 一、概述 《Developing with ExtGWT: Enterprise RIA Development》是一本针对ExtGWT框架的专业指导书籍,旨在帮助Java开发者...

    gxt-2.2.3-gwt22.jar

    gxt-2.2.3-gwt22.jar包,备份以自用。

    gwt + gxt jar包

    GWT(Google Web Toolkit)和GXT(EXT GWT)是两个重要的Java开发框架,用于构建富互联网应用程序(RIA)。GWT是由Google开发的一个开源工具,它允许开发者使用Java语言来编写前端用户界面,然后自动将Java代码编译...

Global site tag (gtag.js) - Google Analytics