pcl_openmap_OpenMap教程第2部分–使用MapHandler构建基本地图应用程序–第1部分

pcl_openmap

1.简介

在第一个教程中,我们创建了一个基本的OpenMap GIS应用程序,该应用程序在JFrame中显示一个从文件系统加载的具有一个形状图层的地图。 该教程基于com.bbn.openmap.app.example.SimpleMap 。 在该教程中,我们使用了以下OpenMap类: MapBean, PropertyHandler, ShapeLayer, com.bbn.openmap.util.SwingWorker

我们向JFrame添加了MapBean 。 但是,OpenMap提供了自己的JFrameOpenMapFrame ,它可以容纳MapPanelMapPanel是一个接口(参见图1),描述了一个组件,该组件包含MapBean, MapHandler ,菜单小部件以及所有其他组成OpenMap地图小部件的组件。 MapPanel是一个独立的OpenMap Swing组件。 预期MapPanel将从java.awt.Container扩展,否则,如果在OpenMapFrame中找到了它,它可能不会自动添加到MapHandler (我们将在本文后面讨论MapHandler )。

所述com.bbn.openmap.BufferedMapBean延伸MapBean通过迫使其层油漆他们的地图特征为缓冲的图像。 每当调用Java AWT线程绘制图层时,都会渲染此绘制缓冲区。 由于它避免了(可能很昂贵的) Layer绘制过程,因此极大地提高了性能。 如果图层请求绘制,则图层将重新生成绘制缓冲区并将其绘制到地图窗口中。

com.bbn.openmap.BufferedLayerMapBean用特殊的内部图像缓冲区扩展了BufferedMapBean ,该缓冲区保存了所有被指定为“背景”层的层。 当某些图层为移动的地图要素设置动画并且地图经常被重新绘制时,此缓冲区特别有用。 将单独的缓冲图像用于背景图层可大大减少渲染地图所需的时间和工作量,从而提高了地图更新的速度。 默认情况下,由于提高了性能,因此OpenMap应用程序使用BufferedLayerMapBean而不是MapBean

2. OpenMapFrame和MapPanel

让我们看看如何修改上一教程中的MapFram e,以利用上述OpenMap类:

  1. 修改MapFrame ,使其扩展OpenMapFrame而不是javax.swing.JFrame
  2. 修复导入(Ctrl + I)。 (可选)您可以执行该应用程序,以确保它像以前一样运行。
  3. 通过单击“设计”按钮切换到“设计”视图。
  4. 选择并删除MapBean实例(从“ 导航”窗口中)。
  5. OpenMapFrameOpenMap面板组拖到BasicMapPanel上。
  6. 将其重命名为mapPanel
  7. 在“ 属性”窗口中将其布局方向更改为“ 居中 ”。
  8. 返回源代码视图,修改行mapBean.add(shapeLayer);mapPanel.getMapBean().add(shapeLayer);

结果如清单1所示(假设您选择了教程1中的最后一个实现)。

作为练习,在上面的步骤5中用OverlayMapPanel替换BasicMapPanel 。 各种MapPanel (请参见图1)包含一个BufferedLayerMapBean因此您无需执行任何其他操作即可提高性能。

清单1:MapFrame Basic OpenMap应用程序

public class MapFrame extends OpenMapFrame {/** Creates new form MapFrame */public MapFrame() {super("Simple Map");initComponents();initMap();}@SuppressWarnings("unchecked")                         private void initComponents() {mapPanel = new com.bbn.openmap.gui.BasicMapPanel();setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);getContentPane().add(mapPanel, java.awt.BorderLayout.PAGE_END);pack();}  /** @param args the command line arguments */public static void main(String args[]) {/* Create and display the form */java.awt.EventQueue.invokeLater(() -> new MapFrame().setVisible(true));}// Variables declaration - do not modify                     private com.bbn.openmap.gui.BasicMapPanel mapPanel;// End of variables declaration  private void initMap() {CompletableFuture.supplyAsync(() -> getShapeLayer()).thenAcceptAsync(shapeLayer -> {// Add the political layer to the mapmapPanel.getMapBean().add(shapeLayer);MapFrame.this.revalidate();});}// ...
}
图1:OpenMap的主类类图

图1:OpenMap的主类类图

3. MapHandler

MapHandler是一个java.beans.beancontext.BeanContext ,可以认为是一个大型存储桶,可以在其中添加或删除对象。 将BeanContext对象作为体系结构的中心的好处是,当其对象成员身份更改时,它将事件发送给侦听器。 添加到BeanContext任何java.beans.beancontext.BeanContextMembershipListener都将接收这些事件,并且可以使用这些事件来建立或提供与要添加或删除的对象的连接。

可以将MapHandler视为一个地图,其中包含MapBeanLayer以及其中包含的其他管理组件。 那些需要获取其他对象和服务句柄的组件可以使用它。 它可用于在运行时向应用程序添加或删除组件,并且添加到MapHandler所有其他对象会自动收到添加/删除的通知。

让我们看看如何利用MapHandler 。 清单2显示了修改后的initMap() 。 如前所述,您可以将MapHandler视为一个大型存储桶,可以在其中添加对象或从中删除对象。 我们拿到的MapHandlerMapPanel 。 为了能够向其添加图层,我们需要向LayerHandler添加一个MapHandler 。 我们将shapeLayer以及GraticuleLayer到其中。 顺序重要,即最后添加的层是显示在最上面的层。 最后,我们需要将OpenMapFrame添加到MapHandlerMapHandler是将所有这些粘合在一起的实体。 com.bbn.openmap.app.example.SimpleMap2检查com.bbn.openmap.app.example.SimpleMap2

与简单地使用BeanContext ,存在MapHandler的原因是它是扩展的BeanContext ,可以跟踪SoloMapComponentcom.bbn.openmap.SoloMapComponents )。 SoloMapComponent是一个接口,可用于对象上,以指示BeanContext中一次仅存在该组件类型的一个实例。 例如, MapBeanSoloMapComponent ,并且只能有一个 MapBeanMapHandler在时间(汉兰达!)。 MapHandler有一个com.bbn.openmap.SoloMapComponentPolicy ,它告诉它如果添加了SoloMapComponent的重复实例的情况该怎么办。 根据政策, MapHandler将拒绝的第二个实例SoloMapComponentcom.bbn.openmap.SoloMapComponentRejectPolicy )或替换以前的组件( com.bbn.openmap.SoloMapComponentReplacePolicy )。

清单2:使用MapHandler的initMap()

private void initMap() {try {// Get the default MapHandler the BasicMapPanel created.MapHandler mapHandler = mapPanel.getMapHandler();// Set the map's centermapPanel.getMapBean().setCenter(new LatLonPoint.Double(38.0, 24.5));// Set the map's scale 1:120 millionmapPanel.getMapBean().setScale(120000000f);/** Create and add a LayerHandler to the MapHandler. The LayerHandler* manages Layers, whether they are part of the map or not.* layer.setVisible(true) will add it to the map. The LayerHandler* has methods to do this, too. The LayerHandler will find the* MapBean in the MapHandler.*/mapHandler.add(new LayerHandler());CompletableFuture.supplyAsync(() -> getShapeLayer()).thenAcceptAsync(shapeLayer -> {// Add the political layer to the mapmapHandler.add(shapeLayer);mapHandler.add(new GraticuleLayer());MapFrame.this.revalidate();});// Add the map to the framemapHandler.add(this);} catch (MultipleSoloMapComponentException msmce) {// The MapHandler is only allowed to have one of certain// items. These items implement the SoloMapComponent// interface. The MapHandler can have a policy that// determines what to do when duplicate instances of the// same type of object are added - replace or ignore.// In this example, this will never happen, since we are// controlling that one MapBean, LayerHandler,// MouseDelegator, etc is being added to the MapHandler.}
}

但是,此基本应用程序缺少许多东西。 例如,无法在地图上执行任何操作,例如放大/缩小,平移等。 但是可以借助MapHandler轻松添加它们。 相关处理程序只需添加到MapHandler的try-catch块内initMap()如清单3所示。现在,您可以在输入/输出放大与鼠标中间的滚轮和泛用鼠标左键地图。

清单3:带有鼠标事件的initMap()

private void initMap() {//...// Add MouseDelegator, which handles mouse modes (managing mouse// events)mapHandler.add(new MouseDelegator());     // Add OMMouseMode, which handles how the map reacts to mouse// movementsmapHandler.add(new OMMouseMode());//... 
}

到目前为止,我们已经看到了如何使用: MapBean, MapHandler, LayerHandler, PropertyHandler, ShapeLayer, GraticuleLayer, OpenMapFrame

4. openmap.properties

但是,OpenMap的灵活性甚至更高。 借助BeanContext技术,我们可以在属性文件openmap.properties定义组成应用程序的组件。 我们已经在应用程序中创建了一个openmap.properties ,其中包含ESRI形状图层的属性。 属性文件可以包含针对特定组件的范围内的属性。 使用属性前缀执行作用域确定,因此可以将属性定义为:

prefix.property=value

让我们从为现有属性添加前缀开始,看看在我们的代码中需要进行哪些修改。

清单4:openmap.properties

shapePolitical.prettyName=Political Solid
shapePolitical.lineColor=000000
shapePolitical.fillColor=BDDE83
shapePolitical.shapeFile=resources/map/shape/dcwpo-browse.shp
shapePolitical.spatialIndex=resources/map/shape/dcwpo-browse.ssx

PropertyHandler支持前缀,如清单5中的粗体所示。在下一教程中,我们将看到属性作用域的有用性。 由于下一部分内容会很广泛,因此最好在这里进行介绍。

清单5:具有前缀支持的PropertyHandler

private ShapeLayer getShapeLayer() {PropertyHandler propertyHandler = null;try {propertyHandler = new PropertyHandler.Builder().setPropertiesFile("./openmap.properties").setPropertyPrefix("shapePolitical").build();} catch (IOException ex) {Logger.getLogger(MapFrame.class.getName()).log(Level.SEVERE, null, ex);}//ShapeLayer: ShapeLayer shapeLayer = new ShapeLayer(); if (propertyHandler != null) {shapeLayer.setProperties(propertyHandler.getPropertyPrefix(), propertyHandler.getProperties(propertyHandler.getPropertyPrefix()));}return shapeLayer;
}

5.结论

在本教程中,我们学习了如何使用: MapBean, MapHandler, LayerHandler, PropertyHandler, ShapeLayer, GraticuleLayer, OpenMapFrame 。 我们还看到了openmap.properties文件提供的灵活性。 可以在那里重新配置新的应用程序而无需重新编译。 在下一个教程中,我们将看到如何执行此操作而无需重新编译我们的应用程序。

参考资料

  1. OpenMap开发人员指南
  2. OpenMap开发人员提示

翻译自: https://www.javacodegeeks.com/2015/11/openmap-tutorial-part-2-build-basic-map-application-using-maphandler-part-1.html

pcl_openmap

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336896.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql7.5安装教程_CentOS7.5下yum安装MySQL8图文教程

卸载MariaDB1.列出所有安装的MariaDB rpm 包rpm -qa | grep mariadb2.强制卸载rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64安装MySQL1. 环境CentOS7.52. 获取MySQL最新版 rpm包yum仓库下载MySQLyum localinstall https://repo.mysql.com//mysql80-community-release-e…

字符串url获取参数_如何从URL查询字符串获取示例参数或将其附加到URL查询字符串(示例)?...

字符串url获取参数让我们剖析几个简单的用例,并查看视图参数的工作原理(视图参数名称不是强制性的,以匹配通过URL查询字符串传递的请求参数,但在本文中,我们将重点讨论这种情况): 情况1 在inde…

mysql和sqlserver分页的区别_关于SQLServer和MySQL 查询分页语句区别

首先来定义几个要用到的参数(例子)t_user数据表int currentPage ; //当前页int pageRecord ; //每页显示记录数关于SqlServer数据库分页SQL语句为:String sql "select top "pageRecord " * from t_user where id not in (select top "(currentPage-1)*pag…

java 微型数据库_Java 9代码工具:使用Java微型基准测试工具的实践会话

java 微型数据库用肉眼看,基准测试似乎只是确定执行某些代码需要花费多长时间的简单问题。 但是,通常情况下,这是幼稚的方法。 提供具有准确和可重复结果的有意义的基准并非易事。 在本文中,我们将向您介绍OpenJDK代码工具项目&a…

mysql快速随机_MySQL随机取数据最高效的方法

mysql随机取数据最高效率的方法发现在SQL语句里有一个 ORDER BY rand() 这样的一个语句,这个说是用着方便,但是效率实在是太低了,于是我用了以下的方法来优化,就是用JOIN表的方法来达到这个取随机数据行的方法,你可以用…

部署被测软件应用和中间件_使用FlexDeploy对融合中间件应用程序进行自动化软件测试...

部署被测软件应用和中间件自动化软件测试是任何软件组织都必须执行的强制性活动之一,以保证其产品质量。 但是,此过程通常变得相当复杂,尤其是涉及由多个不同部分组成的现代复杂系统的自动化测试时。 所有这些部分都基于不同的技术&#xff0…

python batch_size_python 實現動態 batch size,多張圖片如何堆疊轉成指針

前陣子有發問,關於 python 動態 batch size 如何實現,目前解決之前問題現在遇到的問題是當我把兩張圖片直接用 numpy concat 堆疊在一起 進行 acl.util.numpy_to_ptr 轉換成指針進行推理後,得到的結果只有第一張圖片是對的,第二張…

投行数据_投行对Java的二十大核心访谈问答

投行数据这是在金融领域(主要是在大型投资银行)共享Java核心访谈问题和答案的新系列。 在JP Morgan,Morgan Stanley,Barclays或Goldman Sachs上会问许多这些Java面试问题。 银行主要从多线程 , 集合 ,序列化…

php中mysql_fetch_row_php中的mysql_fetch_row,mysql_fetch_array,mysql_fetch_object

1.mysql_fetch_rowmysql_fetch_row,这个函数是从结果集中取一行作为枚举数据,从和指定的结果标识关联的结果集中取得一行数据并作为数组返回。每个结果的列储存在一个数组的单元中,偏移量从 0 开始。 注意,这里是从0开始偏移&…

primefaces_通过OmniFaces缓存组件以编程方式缓存PrimeFaces图表

primefaces在这篇文章中&#xff0c;您将看到如何结合PrimeFaces和OmniFaces获得可缓存的图表。 为了使事情变得简单&#xff0c;我们将使用PrimeFaces 折线图。 对于这种图表&#xff0c;我们可以在页面中使用<p&#xff1a;chart />标签和一个简单的托管bean。 因此&am…

mysql开发问题解决_开发过程中mysql常见问题的解决方法

本篇文章给大家带来的内容是关于开发过程中mysql常见问题的解决方法&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。记录开发过程中遇到mysql相关的问题以及解决方法&#xff0c;长期更新。远程连接问题mysql默认连接只能给本…

javaone_JavaOne 2015继续进行,Java将永远存在(……也许是长篇大论)

javaone好的。 也许我的标题太夸张了。 我确实相信Java&#xff0c;生态系统&#xff0c;社区&#xff0c;虚拟机和母编程语言将会存在很长一段时间。 有什么可以偏离的&#xff1f; 假定在我的酒店房间中花费很多时间&#xff0c;在我的演讲中增加技巧之间&#xff0c;我认为…

hmailserver mysql密码_第二步:点晴MIS系统Email模块hMailServer数据库连接配置指引

点击&#xff1a;windows系统-》开始-》所有程序-》hmailserver-》hMailServer Database Setup&#xff0c;在弹出的对话框中输入默认管理密码“clicksun2010”&#xff0c;进入后按照以下步骤操作&#xff1a;输入登陆密码&#xff1a;clicksun2010&#xff0c;务必使用这个密…

spring3.0异步_在Spring 4.2中更简单地处理异步事务绑定事件

spring3.0异步介绍 如您可能已经知道的&#xff08;例如&#xff0c;从我以前的博客文章中 &#xff09;&#xff0c;不再需要创建一个单独的类来实现带有onApplicationEvent方法的ApplicationListener &#xff0c;以便能够对应用程序事件做出响应&#xff08;包括来自Spring …

java 插入mysql 日期_Java日期-插入数据库

我需要找出一种将带有java.util.Date字段的记录插入数据库的方法&#xff0c;但我陷入了困境。有谁知道我该怎么做&#xff1f;现在我有类似的东西。java.util.Date myDate new java.util.Date("01/01/2009");sb.append("INSERT INTO USERS");sb.append(&…

jboss fuse 教程_JBoss Fuse –使用MVEL将您的静态配置转换为动态模板

jboss fuse 教程最近&#xff0c;我重新发现了我已经忘记的JBoss Fuse功能&#xff0c;并且我认为其他人可能会从此提醒中受益 。 这篇文章将重点放在JBoss Fuse和Fabric8上&#xff0c;但所有正在寻找最小侵入性方法来为其静态配置文件添加一定程度的动态支持的开发人员也可能…

mysql客户库_你应该知道的10个MySQL客户启动选项

大部分服务器管理员知道MySQL数据库管理系统(RDBMS)是高度灵活的软件块&#xff0c;带有范围广阔的启动选项&#xff0c;可以用来修改相关行为。然而&#xff0c;大部分人却不清楚&#xff0c;标准MySQL客户端带有同等大量的启动选项&#xff0c;其中一些在日常MySQL交互作用中…

java实现ldap服务器_Java到LDAP教程(包括如何安装LDAP服务器/客户端)

java实现ldap服务器本教程将向您展示如何编写Java代码以与LDAP交互。 但是在执行此操作之前&#xff0c;我们需要在计算机上设置LDAP服务器和客户端。 如果此时您不确定到底是什么LDAP&#xff0c;建议您使用这篇文章&#xff0c;其中提供了一个很好的定义示例。 &#xff08;…

java 程序增加 防盗_防盗Java EE –保护Java EE企业应用程序的安全

java 程序增加 防盗redev离我们仅有几天的路程&#xff0c;我受邀作了两次演讲。 其中之一是关于我最喜欢的主题&#xff1a;安全性和Java EE。 它旨在实现两个目标。 一方面向典型的Java EE开发人员介绍整个应用程序安全过程和主要目标。 而且还要查看有关Java EE在满足典型需…

php对mysql基础操作_php+mysql的基础操作

标签&#xff1a;PHP可以说是当下很火的一门后端语言了,它小巧玲珑,和html等前端语言配合的可以说是天衣无缝,加之xampp,wampp等工具的出现,更是前端开发者的福音,作为一名前端ER,如果不熟悉一门后端语言的话,那简直都不好意思说自己要加薪,那么我们对于php这门语言学习时,如果…