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

pcl_openmap

1.简介

在上一教程中,我们了解了MapHandler如何将各种组件连接在一起(更具体地说,是从MapHandlerChild派生的类)。 我们看到了如何以编程方式执行此操作,但是还有另一种声明性地使用openmap.properties

样本OpenMap应用程序配置有一个openmap.properties文件。 此属性文件的内容指定创建哪些组件并将其添加到应用程序框架(包括层)中。 只需重新配置文本编辑器中的openmap.properties文件,即可配置新应用程序而无需重新编译。 只需将了解框架的组件添加到该属性文件中,即可将它们添加到应用程序中。 此外,将为使用属性编写的组件设置其设置,以便正确初始化自己。 例如,依赖于数据文件或服务器位置的层通常具有允许在运行时设置这些位置的属性。

2. openmap.properties

openmap.properties文件具有一个openmap.components属性,该属性列出了组成应用程序的所有组件。 要更改组成您的应用程序的组件,只需编辑此列表。 如果您希望组件被告知BeanContext ,请将其设为BeanContextChild 。 它将添加到MapHandler以便其他组件可以找到它(如果它在openmap.components属性列表中)。 如果要以编程方式创建自己的组件,只需将BeanContextChild组件自己添加到MapHandler ,如上一篇文章的清单2所示 。

LayerHandler基于openmap.properties文件中的openmap.layers属性创建可用于地图的openmap.properties 。 修改openmap.layers属性可让您从应用程序中添加和删除图层。 可以设置的OpenMap图层属性在图层的JavaDocs中列出。

PropertyHandlercom.bbn.openmap.PropertyHandler )使用openmap.properties文件来配置应用程序。 可以知道在Java类路径和应用程序用户的主目录中,从哪个文件读取属性或将其留给自己来查找openmap.properties文件。 openmap.components ,它使用openmap.components属性,其中包含对象的标记名称列表。 列表中的每个成员然后用于查找另一个属性( markername.class ),该属性指定要实例化的类。

清单1:带有openmap.components属性的openmap.properties

# Marker name list that defines the general components to use in the
# application, OTHER than layers. Order is important
openmap.components=layerHandler# These layers are turned on when the map is first started.  Order
# does not matter here...
openmap.startUpLayers=graticule shapePolitical# Layers listed here appear on the Map in the order of their names.
openmap.layers=graticule shapePolitical### Key components
layerHandler.class=com.bbn.openmap.LayerHandler### Graticule layer
graticule.class=com.bbn.openmap.layer.GraticuleLayer
graticule.prettyName=Graticule### ShapeFile layers
shapePolitical.class=com.bbn.openmap.layer.shape.ShapeLayer
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

清单1显示了更新的openmap.properties 。 这里openmap.components被初始化用一个部件( layerHandler )和openmap.layers具有两层( shapePoliticalgraticule )。

如果为PropertyHandler提供了MapHandler ,则它将在创建之后将其创建的组件加载到其中。 智能组件( MapHandlerChildren )足够聪明,可以将自己连接在一起。 顺序对于openmap.components属性确实很重要,特别是对于添加到列表和菜单中的组件。 将组件按您希望组件添加到MapHandler的顺序放置在列表中。

当OpenMap应用程序通过openmap.components属性创建对象时,该列表上的标记名称将成为组件的属性前缀。 代表PropertyHandler创建组件的ComponentFactory会检查该组件是否为PropertyConsumer ,如果是,它将对其调用setProperties(prefix, properties)以让该组件自行配置。

清单2显示了使用上述内容的初始应用程序。 (代码基于com.bbn.openmap.app.OpenMap )。

  1. 在NetBeans中,右键单击openmap包,然后创建一个新的Java类。 将其命名为OpenMap
  2. 将清单2的内容复制到该类中。

清单2:使用openmap.properties文件的OpenMap应用程序

public class OpenMap {/** The main panel of the application. */private MapPanel mapPanel;/*** Schedule creation of this application's GUI in the event-dispatching* thread.** @param args*/public static void main(String[] args) {SwingUtilities.invokeLater(() -> {OpenMap.create("./openmap.properties").showInFrame();});}/** Passes a null property handler. Use {@code create()} instead. */public OpenMap() {this((PropertyHandler) null);}/*** Configures the map pane with this property handler.** @param propertyHandler*/private OpenMap(PropertyHandler propertyHandler) {configureMapPanel(propertyHandler);}/*** Factory method.** @param propertiesFile path to {@code openmap.properties}* @return new {@code OpenMap} instance*/public static OpenMap create(String propertiesFile) {return new OpenMap(configurePropertyHandler(propertiesFile));}/*** Given a path to a properties file, try to configure a* {@code PropertyHandler} with it. If the properties file is not valid, the* returned {@code PropertyHandler} will look for the* {@code openmap.properties} file in the classpath and the user's home* directory.** @param propertiesFile path to {@code openmap.properties}* @return the respective {@code PropertyHandler} or an empty one if an* error occurs* @throws MalformedURLException, IOException*/private static PropertyHandler configurePropertyHandler(String propertiesFile) {try {return new PropertyHandler.Builder().setPropertiesFile(propertiesFile).build();} catch (MalformedURLException murle) {Logger.getLogger(OpenMap.class.getName()).log(Level.WARNING, murle.getMessage(), murle);} catch (IOException ioe) {Logger.getLogger(OpenMap.class.getName()).log(Level.WARNING, ioe.getMessage(), ioe);}return new PropertyHandler();}/** @return the MapHandler */public MapHandler getMapHandler() {return mapPanel.getMapHandler();}/*** If there is no {@code OpenMapFrame} specified in the properties file, we* need to create one and configure it from the current properties.*/private void showInFrame() {MapHandler mapHandler = getMapHandler();OpenMapFrame omf = (OpenMapFrame) mapHandler.get(OpenMapFrame.class);if (omf == null) {omf = new OpenMapFrame(Environment.get(Environment.Title));PropertyHandler propertyHandler = (PropertyHandler) mapHandler.get(PropertyHandler.class);if (propertyHandler != null) {// Use the default property prefix for the default window// property settings.omf.setProperties("openmap", propertyHandler.getProperties());}getMapHandler().add(omf);}omf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);omf.setVisible(true);}/*** Creates the components in the main application thread. If any of these* components need to update their GUI, they should pass a {@code Runnable}* object to the {@code SwingUtilities.invokeLater(Runnable)} method, and it* will be updated accordingly.** @param propertyHandler*/private void configureMapPanel(PropertyHandler propertyHandler) {BasicMapPanel basicMapPanel = new BasicMapPanel(propertyHandler, true);basicMapPanel.create();mapPanel = basicMapPanel;}
}

main()方法在EDT中调用静态create()方法。 create()方法调用构造函数并传递openmap.properties文件路径。 方法configurePropertyHandler()从此属性文件中创建一个新的PropertyHandler() 。 构造函数将此属性处理程序传递给configureMapPanel() ,后者使用它来创建MapPanel 。 第二个参数允许您延迟MapPanelcreate()直到调用create()方法。 在这里,您可以使用BasicMapPanel basicMapPanel = new BasicMapPanel(propertyHandler, false); 无需调用create() 。 您还可以使用OverlayMapPanel而不是BasicMapPanel (请参见清单3 )。

清单3:configureMapPanel()方法初始化OverlayMapPanel

private void configureMapPanel(PropertyHandler propertyHandler) {mapPanel = new OverlayMapPanel(propertyHandler, false);
}

最后, showInFrame()方法使用前缀为“ openmap”的属性初始化一个OpenMapFrame ,将其添加到地图处理程序中并进行显示。 您不需要定义其他任何东西,不需要LayerHandler ,不需要MouseDelegator ; 所有这些都在openmap.properties中定义。

如果在openmap.components 清单5中添加OpenMapFrame可以通过除去if块来简化showInFrame() 清单4的方法。 还添加了另外两个组件mouseDelegatoronMouseMode

清单4:简化的showInFrame()方法

private void showInFrame() {MapHandler mapHandler = getMapHandler();OpenMapFrame omf = (OpenMapFrame) mapHandler.get(OpenMapFrame.class);omf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}

清单5:带有openmap.components属性的openmap.properties

# Marker name list that defines the general components to use in the
# application, OTHER than layers. Order is important
openmap.components=openMapFrame layerHandler mouseDelegator mouseMode# These layers are turned on when the map is first started.  Order
# does not matter here...
openmap.startUpLayers=graticule shapePolitical# Layers listed here appear on the Map in the order of their names.
openmap.layers=graticule shapePolitical### Key components
layerHandler.class=com.bbn.openmap.LayerHandler
mouseDelegator.class=com.bbn.openmap.MouseDelegator
openMapFrame.class=com.bbn.openmap.gui.OpenMapFrame
mouseMode.class=com.bbn.openmap.event.OMMouseMode### Graticule layer
graticule.class=com.bbn.openmap.layer.GraticuleLayer
graticule.prettyName=Graticule### ShapeFile layers
shapePolitical.class=com.bbn.openmap.layer.shape.ShapeLayer
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

您可能会在此处找到可用属性的列表。

3.扩展我们的应用程序

只需修改openmap.properties即可扩展应用程序! 我们已经在清单5中看到了如何向地图添加鼠标事件支持。 让我们看看还有哪些其他功能可用! OpenMap体系结构支持对MouseEventMouseMotionEvent的分发进行管理,将它们定向到应用程序中的组件。 图层和其他工具组件可以使用这些事件来解释和响应地图上的用户手势,显示有关地图要素的更多信息,修改要素的位置或配置用于分析查询的工具。

MapMouseMode描述了如何解释和使用MouseEventMouseMotionEvent 。 该MouseDelegator负责控制其MapMouseModeMouseListenerMouseMotionListenerMapBeanMouseDelegator管理MouseMode的列表,并知道在任何给定时间哪个是“活动的”。 它侦听MapBean事件,该事件告诉它已将哪些图层添加到地图中。 当获得该层列表时,它将向每一层询问其MapMouseListener ,并将这些MapMouseListener添加到侦听器指定的MapMouseMode 。 当MouseEventMapBean到活动的MapMouseMode ,该模式开始将MouseEvent提供给其MapMouseListener 。 每个侦听器都有机会使用该事件。 MapMouseListener可以自由地对事件进行操作而不使用事件,因此它可以继续传递给其他侦听器。 来自地图较高层的MapMouseListener可以在较低层之前消耗MouseEvent 。 图层可以实现MapMouseListener接口,或者可以将该职责委派给另一个对象,或者,如果它对接收事件不感兴趣,则可以仅返回null(该Layer默认设置)。

InformationDelegatorcom.bbn.openmap.InformationDelegator )是用于向用户传达消息的中央组件。 当活动层更改时, InformationDelegator侦听MapBean上的消息,并将其自身连接到这些层,以响应其在地图上对工具提示的请求,在不同文本区域中呈现信息文本,弹出对话框消息并用于处理在浏览器中显示信息的请求。 作为MapPanelChild ,它通常要求放置在地图下方。 默认情况下, InformationDelegator仅具有两个文本区域,可用于在地图周围放置简洁的信息,一个文本区域通常用于由MapMouseMode提供的坐标信息,而另一个文本区域用于存储有关用户正在浏览的地图数据的信息。 可以通过编程方式将更多文本区域添加到InformationDelegator ,并请求将新信息定向在这些区域中显示。

作为练习,通过相应地修改openmap.properties ,将InformationDelegator实例添加到您的应用程序中。 只需运行它即可看到类似于图1的窗口。

图1:添加了InformationDelegator的SimpleMap(位于底部)

图1:添加了InformationDelegator的SimpleMap(位于底部)

ToolPanel是一个JtoolBar ,OpenMap放置在地图上方。 ToolPanel使用MapHandler来定位实现Tool接口的对象, MapHandler在找到对象时将其添加到自身即可。 OMToolComponent是一个便捷类,它实现ToolPropertyConsumerLightMapHandlerChild接口,从而允许任何派生类出现在ToolPanel ,配置有属性并在MapHandler找到其他组件。 一些OMToolComponent包括:

  • NavigatePanel提供了一组箭头,用于在8个不同方向上平移地图。 它使用MapHandler查找MapBean ,该PanEventNavigatePanel按钮监听PanEvent
  • ZoomPanel提供了一对用于放大和缩小的按钮。
  • ScaleTextPanel提供了一个文本字段,用于直接设置当前比例。
  • ProjectionStackTool提供了两个按钮,用于跟踪ProjectionStack ,该项目用于还原到过去的投影设置,然后转发到最新的投影设置。 为了使ProjectionStackToolMapBean投影配合使用,还必须将com.bbn.openmap.proj.ProjectionStack对象添加到MapHandler
  • LayersPanel会弹出一个窗口,可用于设置可见或不可见的图层以及配置图层的属性。 您还可以重新排序图层。

清单6显示了如何将上述小部件添加到openmap.properties 。 结果如图2所示。

清单6:具有openmap.components属性的openmap.properties

# Marker name list that defines the general components to use in the
# application, OTHER than layers. Order is important
openmap.components=openMapFrame informationDelegator projectionstack toolBar zoompanel navpanel scalepanel projectionstacktool layersPanel layerHandler mouseDelegator mouseMode# ...### Key components
layerHandler.class=com.bbn.openmap.LayerHandler
informationDelegator.class=com.bbn.openmap.InformationDelegator
mouseDelegator.class=com.bbn.openmap.MouseDelegator
openMapFrame.class=com.bbn.openmap.gui.OpenMapFrame
mouseMode.class=com.bbn.openmap.event.OMMouseMode
toolBar.class=com.bbn.openmap.gui.ToolPanel
navpanel.class=com.bbn.openmap.gui.NavigatePanel
scalepanel.class=com.bbn.openmap.gui.ScaleTextPanel
zoompanel.class=com.bbn.openmap.gui.ZoomPanel
projectionstack.class=com.bbn.openmap.proj.ProjectionStack
projectionstacktool.class=com.bbn.openmap.gui.ProjectionStackTool
layersPanel.class=com.bbn.openmap.gui.LayersPanel# ...
OpenMap with Layers窗口打开

图2:打开了带有图层的OpenMap窗口

OverviewMapHandler提供了一个较小的缩小地图,以显示主MapBean所显示的内容。 它可以直接添加到任何其他组件中,但是由于使用了“ Tool界面,它提供了一个按钮,该按钮可以在单独的窗口中显示概览图。 如清单7所示 ,配置起来更加困难。

清单7:带有OverviewMapHandler的openmap.properties

# Marker name list that defines the general components to use in the
# application, OTHER than layers. Order is important
openmap.components=openMapFrame informationDelegator projectionstack toolBar zoompanel navpanel scalepanel projectionstacktool layersPanel overviewMapHandler layerHandler mouseDelegator mouseMode# ...# ###
# Properties defined for the overview map handler.
# ###
overviewMapHandler.class=com.bbn.openmap.gui.OverviewMapHandler
# marker name list defining background layers used on overview map.
# The layers are defined as any other layer is below, look
# for 'overviewLayer' properties.  This is a space-separated list of
# marker names.
overviewMapHandler.overviewLayers=overviewLayer
# how zoomed out to keep the overview map versus the main map
overviewMapHandler.overviewScaleFactor=10f
# when to stop zooming in
overviewMapHandler.overviewMinScale=10000000f
# the layer to use to render on top, showing where the main map covers.
overviewMapHandler.overviewStatusLayer=com.bbn.openmap.layer.OverviewMapAreaLayer
overviewMapHandler.lineColor=ffff0000
overviewMapHandler.fillColor=66ff0000
# ###### Layer used by the overview handler
overviewLayer.class=com.bbn.openmap.layer.shape.ShapeLayer
overviewLayer.prettyName=Overview
overviewLayer.shapeFile=resources/map/shape/dcwpo-browse.shp
overviewLayer.spatialIndex=resources/map/shape/dcwpo-browse.ssx
overviewLayer.lineColor=ff000000
overviewLayer.fillColor=DAD5CB# ...

您需要定义要使用的图层以及OverviewMapAreaLayer ,即定义缩放区域的红色矩形(请参见图3 )。

图3:概述图窗口

图3:概述图窗口

  • AddLayerPanel小部件允许将某些图层/插件动态添加到应用程序。 仅某些图层/插件已更新,可以与Inspector一起设置其初始参数。 addlayer标记名称已添加到openmap.components列表中,并且此组件将查找openmap.addableLayers属性以找出可用于动态添加的图层。 要将图层添加到此列表中,请为该图层的通用实例创建一个唯一的标记名,然后为该对象提供<layername>.class字段和<layername>.prettyName (请参见清单8 )。 class名称将是由LayerAddPanel创建的图层/插件的LayerAddPanel ,而其prettyName将是呈现给用户的图层的通用描述。 创建图层时,用户将有机会更改该名称(请参见图4 )。

清单8:带有addLayer组件的openmap.properties

# Marker name list that defines the general components to use in the
# application, OTHER than layers. Order is important
openmap.components=openMapFrame informationDelegator projectionstack toolBar zoompanel navpanel scalepanel projectionstacktool addlayer layersPanel layerHandler mouseDelegator mouseMode# ...# Define the class for the component listed in the openmap.components list:
addlayer.class=com.bbn.openmap.gui.LayerAddPanel# Define a list of addable layers:
openmap.addableLayers=shape grat utmgrid rpf shispi eipi wmsp epi# Define the properties of the addable layers:
shape.class=com.bbn.openmap.layer.shape.ShapeLayer
shape.prettyName=Shape Layer
grat.class=com.bbn.openmap.layer.GraticuleLayer
grat.prettyName=Graticule Layer
utmgrid.class=com.bbn.openmap.plugin.UTMGridPlugIn
utmgrid.prettyName=UTM Grid Overlay
rpf.class=com.bbn.openmap.layer.rpf.RpfLayer
rpf.prettyName=RPF Layer
shispi.class=com.bbn.openmap.plugin.shis.SHISPlugIn
shispi.prettyName=Simple Http Image Server (SHIS) Plugin
eipi.class=com.bbn.openmap.plugin.earthImage.EarthImagePlugIn
eipi.prettyName=Earth Image Plugin
wmsp.class=com.bbn.openmap.plugin.wms.WMSPlugIn
wmsp.prettyName=WMS Layer
epi.class=com.bbn.openmap.plugin.esri.EsriPlugIn
epi.prettyName=Shape Layer with Attributes# ...
图4:添加图层按钮

图4:添加图层按钮

  • com.bbn.openmap.gui.menu.MenuList对象负责创建Menu ,并向他们提供对其他MapHandler组件的访问。 MenuList能够提供JMenuBar或包含其菜单的JMenu并维护菜单的定义顺序。 AbstractOpenMapMenu是JMenu抽象类,已通过PropertyConsumerLightMapHandlerChild方法进行了增强。 OMBasicMenuAbstractOpenMapMenu的扩展,可以在属性文件中定义其MenuItem和分隔符。 如果它具有任何扩展MapHandlerMenuItem类的MenuItem ,它将自动照顾给予他们访问MapHandler找到的对象的MapHandler

更改如清单9所示。 菜单在menulist.menus属性中声明。 请注意,菜单对象的添加顺序很重要,但helpMenu总是被调整为最后一个。 但是,如果您运行该应用程序,则会发现没有菜单! 有毛病吗 请执行以下解决方法。 从openmap.components属性列表中删除openMapFrame ,然后重新添加清单2中的代码。 现在,您应该看到菜单栏(请参见图5 )。

清单9:带有菜单列表组件的openmap.properties

# Marker name list that defines the general components to use in the
# application, OTHER than layers. Order is important
openmap.components=openMapFrame informationDelegator projectionstack menulist toolBar zoompanel navpanel scalepanel projectionstacktool addlayer layersPanel layerHandler mouseDelegator mouseMode# ...
# ###################################################
# Menu configuration, defining the menu items listed in the
# openmap.components list.menulist.class=com.bbn.openmap.gui.menu.MenuList
menulist.menus=fileMenu controlMenu navigateMenu layersMenu gotoMenu helpMenu
fileMenu.class=com.bbn.openmap.gui.FileMenu
controlMenu.class=com.bbn.openmap.gui.ControlMenu# INTERNATIONALIZATION
# To get the BasicI18n class to create the internationalization property
# files after you have set the Debug statements described above, you can add this
# toolMenu to the menulist.menus list above:
toolMenu.class=com.bbn.openmap.gui.menu.OMBasicMenu
toolMenu.prettyName=Tools
toolMenu.mnemonic=T
toolMenu.items=i18ndump
i18ndump.class=com.bbn.openmap.gui.menu.I18nFileCreateMenuItem###
# Adding a menu item to toggle on/off the OMControlPanel if it is
# added to the openmap.components list.
controlMenu.items=controlPanelToggle
controlPanelToggle.class=com.bbn.openmap.gui.menu.ControlPanelToggleMenuItem
###navigateMenu.class=com.bbn.openmap.gui.NavigateMenu
layersMenu.class=com.bbn.openmap.gui.LayersMenu
gotoMenu.class=com.bbn.openmap.gui.GoToMenu
gotoMenu.addDefaults=true# ...#...
### Add your own views to the GoToMenu
#gotoMenu.views=Argentina India United_States
#Argentina.latitude=-39.760445
#Argentina.longitude=-65.92294
#Argentina.name=Argentina
#Argentina.projection=Mercator
#Argentina.scale=5.0E7
#India.latitude=20.895763
#India.longitude=80.437485
#India.name=India
#India.projection=Mercator
#India.scale=3.86688E7
#United_States.latitude=38.82259
#United_States.longitude=-96.74999
#United_States.name=United States
#United_States.projection=Mercator
#United_States.scale=5.186114E7
###helpMenu.class=com.bbn.openmap.gui.DefaultHelpMenu
helpMenu.items=helpUserMenuItem
helpUserMenuItem.class=com.bbn.openmap.gui.UserGuideMenuItems
helpUserMenuItem.class=com.bbn.openmap.gui.menu.WebSiteHelpMenuItem# End menu item definitions
# #################################################### ...
图5:带有菜单栏和工具栏的OpenMap

图5:带有菜单栏和工具栏的OpenMap

  • 添加MouseModeButtonPanel也很容易(请参见清单10 )。 四个模式: SelectMouseModePanMouseModeDistanceMouseModeNavMouseMode2已添加到其中。 请注意, mouseMode.class已从“ ### Key components部分移至此处。 您可能会在图6中看到结果。

清单10:带有mouseModePanel组件的openmap.properties

# Marker name list that defines the general components to use in the
# application, OTHER than layers. Order is important
openmap.components=menulist informationDelegator projFactory projectionstack toolBar zoompanel navpanel scalepanel projectionstacktool addlayer layersPanel overviewMapHandler layerHandler mouseDelegator mouseModePanel selectMouseMode navMouseMode distanceMouseMode panMouseMode# ...# Mouse handling components
mouseModePanel.class=com.bbn.openmap.gui.MouseModeButtonPanel
selectMouseMode.class=com.bbn.openmap.event.SelectMouseMode
distanceMouseMode.class=com.bbn.openmap.event.DistanceMouseMode
panMouseMode.class=com.bbn.openmap.event.PanMouseMode
panMouseMode.azPanningShapefile=resources/map/shape/dcwpo-browse.shp
# Floating number between 0-1, with 1 being opaque, default .5
panMouseMode.opaqueness=1
# True/false, to leave old map up behind panned version.
panMouseMode.leaveShadow=false
# There's a NavMouseMode, too.  This one defines boxes from center
navMouseMode.class=com.bbn.openmap.event.NavMouseMode2
nullMouseMode.class=com.bbn.openmap.event.NullMouseMode
# Mouse mode 
mouseMode.class=com.bbn.openmap.event.OMMouseMode
mouseMode.azPanningShapefile=resources/map/shape/dcwpo-browse.shp# ...
图6:带有MouseModeButtonPanel的OpenMap

图6:带有MouseModeButtonPanel的OpenMap

作为我们的OpenMap小部件展览的最后一个组成部分,我们将看到如何在地图上绘制。 我们需要添加一个可以在其上绘制的特殊层,即OMGraphicHandlerLayer类型的OMGraphicHandlerLayer (请参见清单11 )。

清单11:带有绘图层的openmap.properties

# These layers are turned on when the map is first started.  Order
# does not matter here...
openmap.startUpLayers=demo graticule shapePolitical
# Layers listed here appear on the Map in the order of their names.
openmap.layers=demo graticule shapePolitical# ...###
# Demo layer - the layer's palette has a bunch of buttons to call
# the Drawing Tool.
demo.class=com.bbn.openmap.layer.DemoLayer
demo.prettyName=Demo# ...

然后,我们需要添加可用的工具,如清单12所示。 结果如图7所示。

清单12:带有绘图工具的openmap.properties

openmap.components=menulist informationDelegator projFactory projectionstack toolBar zoompanel navpanel scalepanel projectionstacktool addlayer layersPanel overviewMapHandler layerHandler mouseDelegator mouseModePanel selectMouseMode navMouseMode distanceMouseMode panMouseMode omdtl omdrawingtool omlineloader omcircleloader omrectloader ompointloader omsplineloader ompolyloader# ...# Drawing tool parts
omdtl.class=com.bbn.openmap.tools.drawing.OMDrawingToolLauncher
omcircleloader.class=com.bbn.openmap.tools.drawing.OMCircleLoader
omdecsplineloader.class=com.bbn.openmap.tools.drawing.OMDecoratedSplineLoader
omdistloader.class=com.bbn.openmap.tools.drawing.OMDistanceLoader
omdrawingtool.class=com.bbn.openmap.tools.drawing.OMDrawingTool
omlineloader.class=com.bbn.openmap.tools.drawing.OMLineLoader
ompointloader.class=com.bbn.openmap.tools.drawing.OMPointLoader
ompolyloader.class=com.bbn.openmap.tools.drawing.OMPolyLoader
omrectloader.class=com.bbn.openmap.tools.drawing.OMRectLoader
omscalingrasterloader.class=com.bbn.openmap.tools.drawing.OMScalingRasterLoader
omsplineloader.class=com.bbn.openmap.tools.drawing.OMSplineLoader# ...
图7:带有绘图工具启动器的OpenMap

图7:带有绘图工具启动器的OpenMap

当然,如果我们可以绘图,为什么不能删除我们的绘图。 执行清单13的修改,以查看图8中的结果。

清单13:带有删除按钮的openmap.properties

openmap.components=menulist informationDelegator projFactory projectionstack toolBar zoompanel navpanel scalepanel projectionstacktool addlayer layersPanel overviewMapHandler layerHandler mouseDelegator mouseModePanel selectMouseMode navMouseMode distanceMouseMode panMouseMode omdtl omdrawingtool omlineloader omcircleloader omrectloader ompointloader omsplineloader ompolyloader deleteButton# ...# Drawing tool parts
omdtl.class=com.bbn.openmap.tools.drawing.OMDrawingToolLauncher
omcircleloader.class=com.bbn.openmap.tools.drawing.OMCircleLoader
omdecsplineloader.class=com.bbn.openmap.tools.drawing.OMDecoratedSplineLoader
omdistloader.class=com.bbn.openmap.tools.drawing.OMDistanceLoader
omdrawingtool.class=com.bbn.openmap.tools.drawing.OMDrawingTool
omlineloader.class=com.bbn.openmap.tools.drawing.OMLineLoader
ompointloader.class=com.bbn.openmap.tools.drawing.OMPointLoader
ompolyloader.class=com.bbn.openmap.tools.drawing.OMPolyLoader
omrectloader.class=com.bbn.openmap.tools.drawing.OMRectLoader
omscalingrasterloader.class=com.bbn.openmap.tools.drawing.OMScalingRasterLoader
omsplineloader.class=com.bbn.openmap.tools.drawing.OMSplineLoader
deleteButton.class=com.bbn.openmap.gui.OMGraphicDeleteTool# ...
图8:带有“删除”按钮的OpenMap

图8:带有“删除”按钮的OpenMap

4。结论

在本教程中,我们通过将它们逐步添加到openmap.properties文件中,了解了许多OpenMap小部件。 可以在那里重新配置新的应用程序而无需重新编译。 BeanContextChild的定义组件openmap.components属性列表是由自动连接在一起MapHandler 。 使用openmap.layers属性列表定义组成地图的openmap.layersLayerHandler基于此列表构建地图。 以下是我们学习的小部件的列表: OpenMapFrame, LayerHandler, MouseDelegator, OMMouseMode, InformationDelegator, ToolPanel, LayersPanel, OverviewMapHandler, AddLayerPanel, MenuList, MouseModeButtonPanel,绘图工具和DeleteButton

在下一个教程中,我们将更深入地了解OpenMap的内部知识。

参考资料

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

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

pcl_openmap

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

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

相关文章

文件服务器缓存加速,存储缓存为文件传输提速

存储缓存为文件传输提速本文首次刊登于《网络世界》。著作权&复制权属于《网络世界》。保留所有权利。 一种新型产品实现了WAN上的文件缓存&#xff0c;使以LAN速度长距离存取数据成为可能。存储缓存设备消除了通常困扰远程文件共享的延迟难题。 在当前的办公室环境…

xy轴坐标图数字表示_【相机标定】四个坐标系之间的变换关系

点击上方“新机器视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达世界坐标系&#xff0c;相机坐标系&#xff0c;图像物理坐标系&#xff0c;像素坐标系之间的关系&#xff1a;首先看下几个坐标系在放在一块的样子&#xff1a;1&#xff…

完全二叉树基本操作(不含遍历)

/*准备数据*/#define MANLEN 20 //最大长度 typedef char DATA; //定义元素类型 typedef struct CBT //定义二叉树结点类型 {DATA data; //元素数据struct CBT* left; //左子树结点指针struct CBT* r…

1.0jpa 2.0_Java EE 7之前版本替代JPA 2.1非同步持久性上下文

1.0jpa 2.0Java EE 7中的非同步持久性上下文 JPA 2.1引入了非同步持久性上下文的概念&#xff0c;该概念允许对JPA实体管理器的刷新进行细粒度控制&#xff0c;即通过显式调用EntityManager&#xff03;joinTransaction 。 以前&#xff0c;这默认情况下是JTA事务的结束&#x…

算法:删除顺序表中重复的元素

//删除数组中重复的元素 //思路&#xff1a;通过起始位置的元素&#xff0c;逐个和后面的元素进行比较&#xff0c;找到相同的元素后执行删除操作。没有发现执行第二次循环void purge(int a[], int len) {int i 0, j;while (i<len) //从数组开始第一个位置开始循环{j …

设计模式的Java 8 Lambda表达式-策略设计模式

策略模式定义封装在通常称为Context的驱动程序类中的一系列算法&#xff0c;并使这些算法可互换。 它使算法易于互换&#xff0c;并提供了在特定时间选择适当算法的机制。 算法&#xff08;策略&#xff09;在运行时由客户端或上下文选择。 在与客户端交互期间&#xff0c;Con…

调用打印机_涨知识|你不知道的关于打印机的打印过程和打印机驱动的那些事...

以前一直以为打印很简单&#xff0c;不就是编辑好文件按个“打印”就行了&#xff1f;但其实打印过程可以复杂到你分分钟“怀疑人生”。你以为的打印过程可能是这样的 ↓。我们看到的打印过程然而&#xff0c;真正的打印过程是这样的 ↓。实际上的打印过程打印机打印一页文件或…

String大小转换函数

transform(s1.begin(), s1.end(), s1.begin(), toupper); 小写变大写transform(s1.begin(), s1.end(), s1.begin(), tolower); 大写变小写

kite 使用 go_使用Apache Storm和Kite SDK Morphlines的可配置ETL处理

kite 使用 go从我担任软件工程师的第一天起&#xff0c;我总是听到很多方面的相同要求&#xff1a; “ 我们希望所有内容都可配置&#xff0c;我们希望在运行时更改所有内容&#xff0c;我们希望有一个可视化工具来应用所有这些逻辑&#xff0c;以便非开发人员使用和配置我们的…

使用react实现select_使用 Hooks 优化 React 组件

奇技指南本文内容主要是我之前分享的文字版&#xff0c;若想看重点的话可以看之前的Slide: https://ppt.baomitu.com/d/75fc979a本文作者奇舞团前端开发工程师李喆明。需求描述由于作者所在的业务是资讯内容类业务&#xff0c;因而在业务中会经常碰到如下场景&#xff1a;有一个…

Windows内存修改初篇

​ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <windows.h>BOOL FindFirst(DWORD dwValue);//对目标进程空间进行查找 BOOL FindNext(DWORD dwValue);//对目标空间进行2&#xff0c;3&#xff0c;4。。查找//查找数据的地址列表 DWORD g_arList…

斐波那契实现阶乘js_功能与命令式编程。 Java 8中的斐波那契,素数和阶乘

斐波那契实现阶乘js有多种编程风格/范例&#xff0c;但是两个著名的风格是Imperative和Functional 。 命令式编程是最主要的范例&#xff0c;因为几乎所有主流语言&#xff08;C &#xff0c;Java&#xff0c;C&#xff03;&#xff09;都在推广它。 但是在最近几年中&#xf…

cacti不能实时刷新流量图_介绍一种编码帧内刷新算法

0.引言本文主要介绍一种帧内刷新算法&#xff0c;解决I帧太大带来的延迟问题&#xff0c;可以在调优时&#xff0c;值得借鉴。帧内刷新技术避免 I 帧尖峰带来的带宽压力&#xff0c;可以有效地降低视频通信中的缓冲区延迟。帧内刷新算法是一种视频错误恢复的方法&#xff0c;通…

python kotlin_Java和Python中类似Kotlin的生成器,续:附加参数

python kotlin介绍 在今天的文章中&#xff0c;我们将继续上周的文章&#xff0c;内容涉及使用Java和Python创建类似Kotlin的构建器&#xff0c;并扩展了构建器API以采用一些可选参数以提高灵活性。 我们继续我们HTML示例&#xff0c;尝试添加标记属性&#xff0c;例如class&am…

按钮自动居中布局_CSS布局技巧

css实现左右布局和居中布局显示是前端进行页面设计的基础&#xff0c;也是全面了解并学习css一个很好的切入点&#xff0c;因为其中会涉及到对许多css基础点的认知。实现css入门&#xff0c;理解左右布局的实现方式是必经之路&#xff0c;同时也能使我们在项目中涉及前端编码的…

jooq_jOOQ星期二:拉斐尔·温特豪德(Rafael Winterhalter)正在与字节好友合作字节码...

jooq欢迎来到jOOQ Tuesdays系列。 在本系列文章中&#xff0c;我们每隔一个月的第三个星期二发布一篇文章&#xff0c;从jOOQ的角度采访我们发现该行业令人兴奋的人。 这包括从事SQL&#xff0c;Java&#xff0c;开放源代码以及各种其他相关主题的人员。 我们很高兴在第七版中…

多方法接口回调_啊?Java反射遇到接口

本文适合有点Java反射基础的同学&#xff0c;在Java反射调用方法时遇到接口参数是一件很蛋疼的事情。在反射调用方法时需要传参数&#xff0c;像传递基本数据类型进去用就完事&#xff0c;传个对象进去怎么整都没关系&#xff0c;因为你在外部有对象的引用&#xff0c;但 如果需…

0与1世界的初级编程篇之C语言

C语言是一门面向过程的计算机编程语言&#xff0c;与C、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言描述问题比汇编语言迅速&#xff0c;工作量小…

swarm部署集群_WildFly Swarm –将Java EE应用程序部署为独立的Jar

swarm部署集群WildFly Swarm提供了一个简单的解决方案&#xff0c;用于将Java EE应用程序部署为独立的Jar文件。 这使得部署应用程序非常容易&#xff0c;尤其是REST或Web服务。 Swarm在这方面与Spring Boot非常相似&#xff0c;因为它可以快速开发Web&#xff08;.War&#xf…

QT 手动创建信号函数 与 槽函数

自定义信号槽必须要有Q_OBJCT 自己通过关键字signals创建信号函数,只声明信号函数即可&#xff0c;系统会自动定义它。 利用 public slots: 声明一个槽函数&#xff0c;槽函数不会自动生成&#xff0c;并且去定义它。