World Wind Java开发之十一——加载热点信息(仿Google Earth)

在GE的图层中有一个照片图层,在浏览时可以看到各地的一些图片,我们称之为热点信息,如下图所示:

再来看下本文的实现效果:

效果是不是很像呢,其实实现这个很简单,参照examples中的Balloons就可以很容易的实现,这里我自己封装了BalloonUtil类便于复用,代码很简单都加了注释就不再一一展开了,直接附上源代码,有看不明白的地方可以留言交流哈。

/**
 * @Copyright 2014-2020 @???
 **/

package edu.whu.vge.util;

import gov.nasa.worldwind.avlist.AVKey;
import gov.nasa.worldwind.awt.WorldWindowGLCanvas;
import gov.nasa.worldwind.geom.Position;
import gov.nasa.worldwind.layers.RenderableLayer;
import gov.nasa.worldwind.render.AbstractBrowserBalloon;
import gov.nasa.worldwind.render.BalloonAttributes;
import gov.nasa.worldwind.render.BasicBalloonAttributes;
import gov.nasa.worldwind.render.GlobeBrowserBalloon;
import gov.nasa.worldwind.render.PointPlacemark;
import gov.nasa.worldwind.render.Size;
import gov.nasa.worldwind.util.Logging;
import gov.nasa.worldwind.util.WWIO;
import gov.nasa.worldwindx.examples.util.BalloonController;
import gov.nasa.worldwindx.examples.util.HotSpotController;

import java.io.InputStream;

/**
 *
 * @项目名称:SMartScope
 * @类名称:BalloonsUtil
 * @类描述:
 * @创建人:刘硕
 * @创建时间:2015年2月3日 下午4:56:26
 * @修改备注:
 * @版本:
 */
public class BalloonsUtil
{

	private double balloonLat; // 气球纬度
	private double balloonLon; // 气球经度
	private String balloonContentPath; // html文件路径
	private String balloonName; // 气球名称
	protected HotSpotController hotSpotController;
	protected BalloonController balloonController;

	/**
	 *
	 * 创建一个新的实例 BalloonsUtil.
	 *
	 * @param balloonLat
	 * @param balloonLon
	 * @param balloonContentPath
	 * @param balloonName
	 */

	public BalloonsUtil(double balloonLat, double balloonLon,
			String balloonContentPath, String balloonName)
	{
		super();
		this.balloonLat = balloonLat;
		this.balloonLon = balloonLon;
		this.balloonContentPath = balloonContentPath;
		this.balloonName = balloonName;
	}

	/**
	 * s
	 *
	 * @方法名称: makeBrowserBalloon ;
	 * @方法描述: 生成Balloon标记图层 ;
	 * @参数 :@param windowGLCanvas
	 * @参数 :@return
	 * @返回类型: RenderableLayer ;
	 * @创建人:刘硕;
	 * @创建时间:2015年2月3日 下午5:01:03;
	 * @throws
	 */
	public RenderableLayer makeBrowserBalloon(WorldWindowGLCanvas windowGLCanvas)
	{
		// ???balloonController
		this.hotSpotController = new HotSpotController(windowGLCanvas);
		this.balloonController = new BalloonController(windowGLCanvas);
		RenderableLayer layer = new RenderableLayer();
		layer.setName(balloonName);

		String htmlString = null;
		InputStream contentStream = null;
		try
		{
			// 读取html文件内容
			contentStream = WWIO.openFileOrResourceStream(balloonContentPath,
					null);
			htmlString = WWIO.readStreamToString(contentStream, null);
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			WWIO.closeStream(contentStream, balloonContentPath);
		}

		if (htmlString == null) htmlString = Logging.getMessage(
				"generic.ExceptionAttemptingToReadFile", balloonContentPath);

		// 创建一个GlobeBrowserBalloon
		Position balloonPosition = Position.fromDegrees(balloonLat, balloonLon);
		AbstractBrowserBalloon balloon = new GlobeBrowserBalloon(htmlString,
				balloonPosition);

		// 设置GlobeBrowserBalloon属性
		BalloonAttributes attrs = new BasicBalloonAttributes();
		attrs.setSize(new Size(Size.NATIVE_DIMENSION, 0d, null,
				Size.NATIVE_DIMENSION, 0d, null));
		balloon.setAttributes(attrs);

		// 将GlobeBrowserBalloon与PointPlacemark关联起来
		PointPlacemark placemark = new PointPlacemark(balloonPosition);
		placemark.setLabelText(balloonName);
		placemark.setValue(AVKey.BALLOON, balloon);

		layer.addRenderable(balloon);
		layer.addRenderable(placemark);
		return layer;
	}

	public double getBalloonLat()
	{
		return balloonLat;
	}

	public void setBalloonLat(double balloonLat)
	{
		this.balloonLat = balloonLat;
	}

	public double getBalloonLon()
	{
		return balloonLon;
	}

	public void setBalloonLon(double balloonLon)
	{
		this.balloonLon = balloonLon;
	}

	public String getBalloonContentPath()
	{
		return balloonContentPath;
	}

	public void setBalloonContentPath(String balloonContentPath)
	{
		this.balloonContentPath = balloonContentPath;
	}

	public String getBalloonName()
	{
		return balloonName;
	}

	public void setBalloonName(String balloonName)
	{
		this.balloonName = balloonName;
	}
}

调用的时候,只需键入以下代码即可:

String htmlPath = System.getProperty("user.dir")
							+ "\\src\\edu\\whu\\vge\\data\\whu.html";
					BalloonsUtil balloonsUtil = new BalloonsUtil(30.5271,
							114.3604, htmlPath, "我在这里");

					wwPanel.getWorldWindowGLCanvas()
							.getModel()
							.getLayers()
							.add(balloonsUtil.makeBrowserBalloon(wwPanel
									.getWorldWindowGLCanvas()));

另外,附上whu.html网页的代码以供大家参考。

<html>
<head>
<style type='text/css'>
html, body {
	margin: 0 0;
	width: 100%;
	height: 100%;
	overflow: hidden
}

a:link {
	color: #0000CD;
	text-decoration: underline
}

table {
	font-family: verdana, 黑体, sans-serif;
	font-size: 12px;
	color: #4169E1;
	border-width: 1px;
	border-color: #a9c6c9;
	border-collapse: collapse
}

th {
	background-color: #4169E1;
	color: #fff
}

tr {
	background-color: #d4e3e5
}

td {
	border-width: 1px;
	border-style: solid;
	border-color: #a9c6c9
}
</style>
<title></title>
</head>
<body>
	<table border='0'>
		<tr>
			<th align='center' colspan='2'>武汉大学</th>
		</tr>
		<tr>
			<td rowspan='7'><a href="http://www.whu.edu.cn/index.htm"> <img
						border='0' alt='' width='300px' height='225px'
						src='http://news.whu.edu.cn/_mediafile/whu_news/2015/02/02/1eq0euop1q.jpg'>

			</a></td>
		</tr>

	</table>
</body>
</html>
时间: 2024-10-29 02:50:44

World Wind Java开发之十一——加载热点信息(仿Google Earth)的相关文章

World Wind Java开发之十一——加载热点信息(仿Google Earth)(转)

在GE的图层中有一个照片图层,在浏览时可以看到各地的一些图片,我们称之为热点信息,如下图所示: 再来看下本文的实现效果: 效果是不是很像呢,其实实现这个很简单,参照examples中的Balloons就可以很容易的实现,这里我自己封装了BalloonUtil类便于复用,代码很简单都加了注释就不再一一展开了,直接附上源代码,有看不明白的地方可以留言交流哈. [java] view plain copy print? /** * @Copyright 2014-2020 @??? **/ packa

World Wind Java开发之十三——加载Geoserver发布的WMS服务(转)

这篇是转载的平常心博客,原地址见:http://www.v5cn.cn/?p=171 1.WMSTiledImageLayer类说明 一个WMSTiledImageLayer类对象只能对应一个WMS发布的服务图层,使用WMS服务时需要使用到WMS元数据描述类WMSCapabilities对象,我们使用WMSCapabilites类的静态方法retrieve来获得它的对象.WMSCapabilites对象可以包含WMS服务中所以的图层和图层样式,我们通过把需要显示的图层名称保存到AVList对象中

World Wind Java开发之六——解析shape文件(上)

最近一直忙于导师项目的事情了,几天没更新了,昨天和今天研究了下WWJ解析shp文件的源代码,现在记录下,希望可以帮到更多的人! 上一篇博客:World Wind Java开发之五--读取本地shp文件只讲了如何加载shp文件,没有涉及到shp文件的解析,我们这篇博客紧接上一篇博客,利用WWJ来解析shp文件.首先来看用到的源码包和相关类,如下图所示.解析shp文件主要用到Shapefile(shapefile文件类).ShapefileRecord(shape文件记录类).DBaseRecord

好程序员Java学习路线分享Java面试题之加载机制

好程序员Java学习路线分享Java面试题之加载机制,面试场景:面试官第一问:请问,我现在编写一个类,类全名如下:java.lang.String,我们知道JDK也给我们听过了一个java.lang.String,那么,我们编写的这个String类能否替换到JDK默认提供,也就是说程序实际运行的时候,会加载我们的String还是JDK的String?为什么?如果,你无法确定?那么第二问:了解类的加载机制吗?知道JDK的类加载器吗?双亲委托机制说说看如果,你还不了解,那么我们聊聊今天的天气吧!1,

Java 类加载器及加载Class字节码

参考来源:http://www.cnblogs.com/fingerboy/p/5456371.html       java笔记--理解java类加载器以及ClassLoader类 参考来源:http://blog.csdn.net/shareus/article/details/52422788    Java 类加载器及加载Class字节码

java 自定义类的加载器

首先介绍自定义类的应用场景: (1)加密:Java代码可以轻易的被反编译,如果你需要把自己的代码进行加密以防止反编译,可以先将编译后的代码用某种加密算法加密,类加密后就不能再用Java的ClassLoader去加载类了,这时就需要自定义ClassLoader在加载类的时候先解密类,然后再加载. (2)从非标准的来源加载代码:如果你的字节码是放在数据库.甚至是在云端,就可以自定义类加载器,从指定的来源加载类. (3)以上两种情况在实际中的综合运用:比如你的应用需要通过网络来传输 Java 类的字节

World Wind Java开发之一

参照<World wind Java三维地理信息系统开发指南随书光盘>以及官网论坛,开始学习World Wind Java开发. 第一个demo //基础类 public class VGE_GFBasicClass extends JFrame { protected WorldWindowGLCanvas worldWindowGLCanvas; //WorldWind 画布 protected StatusBar statusBar; //状态栏 protected Model mode

java web 项目如何加载log4j配置文件

在整个WEB系统中,为了统一的使用日志管理,需要在系统启动的时候就加载Log4j的配置文件,这样才能保证以后使用log4j的格式是一致的,便于跟踪和解决问题. 那么,如何在系统启动的时候加载log4j的配置文件呢?下面我简单的介绍一下: 1.在web.xml文件中添加一个"监听器" Xml代码 <!-- 加载log4j的配置信息 --> <listener> <listener-class>hb.init.log4j.Log4jInit</li

《深入理解Java虚拟机》- Java虚拟机是如何加载Java类的?

Java虚拟机是如何加载Java类的?  这个问题也就是面试常问到的Java类加载机制.在年初面试百战之后,菜鸟喜鹊也是能把这流程倒背如流啊!但是,也只是字面上的背诵,根本就是像上学时背书考试一样. tonight ! 我们把它映射到实战里,看看如何用代码说明这个流程. ready! go!  ----------------在这之前还是搞点理论吧,不然又要先去百度加载机制流程了. 一.类加载机制(理论部分) 类加载机制有三大过程:加载.链接.初始化.其中链接又细分为验证.准备及解析. Java