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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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;有一个…

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

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

按钮自动居中布局_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;工作量小…

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

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

九九乘法表代码口述_利用随机函数实现座次表的随机排座

昨天听完讲座&#xff0c;晚上忍不住写了份学后感&#xff0c;今天有老师在文章下留言问如何实现随机排座&#xff0c;上午在快速理赔中心处理交通事故&#xff0c;处理完后将车开去4S店维修&#xff0c;回来后给娃做完中饭就开始写代码实现这个功能&#xff0c;因为有C功底&am…

jep使用_JEP 277“增强弃用”非常好。 但这是一个更好的选择

jep使用维护API很难。 我们正在维护非常复杂的jOOQ API。 但是就语义版本而言&#xff0c;我们遵循相对宽松的规则 。 当您阅读Brian Goetz和其他人关于在JDK中保持向后兼容性的评论时&#xff0c;我只能对他们的工作表示敬意。 显然&#xff0c;我们都希望最终移除Vector &a…

古巴比伦乘法_古巴平台中的通用过滤器–类固醇上的excel过滤器

古巴比伦乘法正如我上次承诺的那样&#xff0c;我计划浏览该平台的某些功能&#xff0c;这些功能我认为非常有价值。 所以我将在这里做一些系列。 从明显的用户界面&#xff0c;过滤&#xff0c;安全性到一些高级功能&#xff08;如Web Portal&#xff0c;可扩展性&#xff0c;…

excel运行没反应_Excel数据很少文件却很大,问题出在哪里呢?两种方法轻松解决...

经常和Excel打交道的小伙伴可能会有这样的困惑&#xff0c;一个Excel工作簿中的数据明明很少&#xff0c;文件所占的空间却很大。打开这种Excel工作簿后&#xff0c;电脑CPU占用率瞬间飙升&#xff0c;甚至遇见工作簿没有响应的情况出现。遇见这样的工作簿让人窝火&#xff0c;…

java lambda::_基准测试:Java 8 Lambda和流如何使您的代码慢5倍

java lambda::与长期的实现相比&#xff0c;Java 8 lambda和流的性能如何&#xff1f; Lambda表达式和流在Java 8中受到了热烈的欢迎。这些是迄今为止很激动人心的功能&#xff0c;很长一段时间以来&#xff0c;它们就已经应用到Java中了。 新的语言功能使我们可以在代码中采用…

如何在java中实现小数点自增_java编个计算器怎么在加入小数点

展开全部我做的可以运行&#xff0c;你看看吧&#xff01;import java.awt.*;import java.awt.event.*;import java.lang.*;import javax.swing.*;public class Counter extends Frame{//声明三个面板的布局GridLayout gl1,gl2,gl3;Panel p0,p1,p2,p3;JTextField tf1;TextField…

在Java中使用FileChannel和ByteBuffer对文件进行读写

过去&#xff0c;我讨论过RandomAccessFile以及如何将其用于在Java中进行更快的IO&#xff0c;在本Java NIO教程中&#xff0c;我们将了解如何通过使用FileChannel和ByteBuffer来使用读/写数据。 Channel提供了一种从文件读取数据的替代方法&#xff0c;它提供了比InputStream…

tp5防止sql注入mysql_PHP+Mysql防止SQL注入的方法(life)

这篇文章介绍的内容是关于PHPMysql防止SQL注入的方法&#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下我的官方群点击此处。方法一&#xff1a;mysql_real_escape_string -- 转义 SQL 语句中使用的字符串中的特殊字符&#xff0…

neo4j 关系属性_Neo4j:特定关系与一般关系+属性

neo4j 关系属性为了在Neo4j查询中获得最佳的遍历速度&#xff0c;我们应该使关系类型尽可能具体 。 让我们看一下几周前我在Skillsmatter上发表的“ 建模建议引擎建模 ”演讲中的一个例子。 我需要决定如何为成员和事件之间的“ RSVP”关系建模。 一个人可以对某个事件表示“…