构建自己的LBS

原文地址:http://twaver.servasoft.com/?p=2908

 

随着网络和手持终端的迅猛发展,地理数据相关的应用已经渗入到了各个应用领域,常见的位置服务例如搜索最近的银行,身边的餐馆,甚至最近的微博好友等等,这些基于位置信息的应用已经是遍地开花,这些应用都是以海量的服务数据为基础的,同时目前在国内被一些所谓的”巨头”把持,并且还不提供友好的免费接口,这就造成了一些技术爱好者无法达成低成本应用该技术的愿望;与此同时,一些企业级的应用需求,例如搜索500米内的基站,10公里内出现故障的终端设备等等,往往也因为购置高昂的相关专业应用软件和数据,而导致项目成本居高不小.今天我们针对这些情况,结合TWaverGIS在实际中的一些应用为大家介绍一种构建自定制LBS(location-based service)的技巧.
TWaverGIS可以非常容易的辅助用户将自己的业务数据和地理数据实现快速混搭,地理特征的数据往往来源于我们项目中购置的地图数据,而需要提供出位置服务的数据,例如终端设备的位置,基站位置,餐馆位置等等这些业务数据则属于特殊需求的图层数据,由于两种数据的性质不同,前者是不太容易省却购买成本的,但是后者由于目前GPS终端的普及而可以很容易的就获取到其位置信息,然后有用户自行购建相关的业务数据层,填充进空间数据库,免除采购成本.这部分可以自定制的数据可以通过高昂的商业软件进行构建和发布,也可以借助TWaverGIS创建维护自己的shp格式数据,生成完全低成本的空间数据,然后借助于GeoServer这个免费的应用服务提供数据发布的服务,通过TWaverGIS实现自己位置搜索、查询和展示,构建自己定制的LBS。
具体的步骤可以参考如下:
第一步:创建自己的空间数据。TWaverGIS对于开源的geotools进行了简单封装,帮助用户创建自定义的shp格式数据,用来构建自定义的数据层。

然后将这个数据发布在GeoServer中。
第二步:通过TWaverGIS搭建一个可视化的空间数据生成器,向该数据层注入准确的空间数据。参考代码如下:

 

public class TowerCreator {
	public static String WFS_SERVER_PSTH = "http://localhost:8000/geoserver/wfs?";
	public static String SERVA_NAMESPACE = "serva=\"http://www.servasoftware.com/gis\"";	

	public static void main(String[] args){
		JFrame frame = new JFrame();
		final TNetwork network = new TNetwork();
		GisNetworkAdapter adapter = new GisNetworkAdapter(network);
		adapter.installAdapter();
		JButton s = new JButton("Insert Tower");

		final GeographyMap map = adapter.getMap();
		map.addLayer("Google", TWaverGisConst.EXECUTOR_TYPE_GOOGLETERRAINMAP);
		map.setCenterPoint(new GeoCoordinate(121.5,31.233));
		map.setZoom(14);
		StatusBar bar = new StatusBar(map, network.getCanvas());
		final List points = new Vector();
		final Vector features = new Vector();
		s.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				features.clear();
				Calendar time = Calendar.getInstance();
				String[] an = {"NAME","ADDRESS","BID"};
				int length = points.size();
				int hour = time.get(Calendar.HOUR_OF_DAY);
				int min = time.get(Calendar.MINUTE);
				for(int i=0;i<length ;i++){
					String t = hour+"-"+min;
					String[] vn = {"Custom 你好_"+t+"_i","Shanghai 中文 _"+t+"_"+i,"BID "+i};
					Vector ps = new Vector();
					ps.add(points.get(i));
					GeographyFeature feature = GisToolkits.createFeture(ps, Geom.GEOM_MULTIPOINT,
							an, vn);
					features.add(feature);
				}
				String operation = WFSUtils.buildInsertAction(WFS_SERVER_PSTH, SERVA_NAMESPACE,
						"serva:TShpFile", features);
				String rc;
				try {
					rc = WFSRequest.httpPost(WFS_SERVER_PSTH, operation, "xml");
					System.out.println("Result is :\n"+rc);
					network.getDataBox().clear();
					points.clear();
				} catch (Exception e1) {

				}

			}
		});
		network.getCanvas().addMouseListener(new MouseAdapter() {
			 public void mouseClicked(MouseEvent e) {
				 if(SwingUtilities.isLeftMouseButton(e)){
					 GeoCoordinate geo = GisToolkits.convertScreenToLatLong(map, e.getPoint());
					 points.add(geo);
					 Rack rack = new Rack();
					 rack.setWidthSize(5);
					 rack.setHeightSize(5);
					 rack.putBodyColor(Color.RED);
					 rack.putClientProperty(TWaverGisConst.GEOCOORDINATE, geo);
					 network.getDataBox().addElement(rack);
					 System.out.println(geo.getLongitude()+","+geo.getLatitude());
				 }else{
					 System.out.println("Clear");
					 network.getDataBox().clear();
					 points.clear();
				 }
			 }
		});
		network.getToolbar().add(s);
		frame.getContentPane().add(network,BorderLayout.CENTER);
		frame.getContentPane().add(bar,BorderLayout.SOUTH);
		frame.setSize(800,600);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		frame.setLocationRelativeTo(null);
	}
}
 

在实际应用中,往往是在项目施工的时候,使用GPS终端到现场采集大量数据回来,然后再参考代码

String[] an = {"NAME","ADDRESS","BID"};
int length = points.size();
int hour = time.get(Calendar.HOUR_OF_DAY);
int min = time.get(Calendar.MINUTE);
for(int i=0;i<length ;i++){
	String t = hour+"-"+min;
	String[] vn = {"Custom 你好_"+t+"_i","Shanghai 中文 _"+t+"_"+i,"TEL"+i};
	Vector ps = new Vector();
	ps.add(points.get(i));
	GeographyFeature feature = GisToolkits.createFeture(ps, Geom.GEOM_MULTIPOINT,
			an, vn);
	features.add(feature);
}
String operation = WFSUtils.buildInsertAction(WFS_SERVER_PSTH, SERVA_NAMESPACE,
		"serva:TShpFile", features);
String rc;
try {
	rc = WFSRequest.httpPost(WFS_SERVER_PSTH, operation, "xml");
	System.out.println("Result is :\n"+rc);
	network.getDataBox().clear();
	points.clear();
} catch (Exception e1) {

}
 

实现大量数据的注入。
第三步:前面两步我们已经组织好了必要的数据基石,那么我们就可以组织我们自己的LBS应用了。
例如我们可以以某一坐标为中心点,查询周围500米范围内的基站

 

SpatialOperateCondition condition = new SpatialOperateCondition(TWaverGisConst.GML_TYPE_POINT);
condition.setCoordinates(new GeoCoordinate[]{queryCenter});
condition.setUnit("m");
condition.setOperatorType(TWaverGisConst.SPATIAL_OPERATOR_TYPE_DWITHIN);
condition.setDistance(500);
String operation = WFSUtils.buildSpatialOperation(LAYER,new String[]{},condition);
System.out.println(operation);
GeographyFeature[] features = WFSRequest.requireFeatures(WFS_SERVER_PSTH, operation);
if(features==null){
	return;
}
for(int i=0;i<features .length;i++){
	List p = features[i].getPoints();
	Rack result = new Rack();
	GeoCoordinate geo = (GeoCoordinate)p.get(0);
	result.putClientProperty(TWaverGisConst.GEOCOORDINATE, geo);
	result.setWidthSize(5);
	result.setHeightSize(5);
	result.putBodyColor(Color.RED);
	network.getDataBox().addElement(result);
}
System.out.println("result num is "+features.length);
  当然也可以根据基站的名字或者街道地址什么的进行查询,这些可以通过TWaverGIS提供WFS查询接口进行处理。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值