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

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中定义。

您可以简化showInFrame() 清单4方法,通过摆脱的if块如果添加OpenMapFrame里面openmap.components 清单5 。 还添加了另外两个组件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

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

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

相关文章

《javaScript100例|01》超级经典一套鼠标控制左右滚动图片带自动翻滚

目录 HTML示例 图片示例 HTML示例 <html > <head> <meta http-equiv"Content-Type" content"text/html; charsetgb2312" /> <title>超级经典一套鼠标控制左右滚动图片带自动翻滚</title> <style type"text/css&quo…

[BZOJ1007] [HNOI2008] 水平可见直线 (凸包)

Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的. 例如,对于直线:L1:yx; L2:y-x; L3:y0 则L1和L2是可见的,L3是被覆盖的. 给出n条直线,表示成yAxB的形式(|A|,|B|<500000),且n条直线两…

《javaScript100例|02》超级经典一套鼠标控制左右滚动图片带自动翻滚

目录 效果图 JS示例 源码地址&#xff1a; 效果图 JS示例 <title>JavaScript切换图片</title> <script> function showDaTu(src){ document.getElementById("defaultImg").srcsrc; } </script> <img src"wall1.jpg" id"…

抽象工厂设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

《javaScript100例|03》自写javaScript+CSS轮显效果

目录 效果图 代码示例 源码地址&#xff1a;自写JsCSS轮显效果.rar-互联网文档类资源-CSDN下载https://download.csdn.net/download/weixin_41937552/37380520 效果图 代码示例 <html xmlns"http://www.w3.org/1999/xhtml"> <head> <meta http-equ…

《javaScript100例|04》自动播放——Js幻灯片缓冲效果

目录 效果图 示例 源码地址&#xff1a; 效果图 示例 <html> <head> <title>自动播放——幻灯片缓冲效果</title> <style> body,div,ul,li{margin:0;padding:0;} ul{list-style-type:none;} body{background:#000;text-align:center;font:12p…

PHP+jquery 树状菜单

本项目开发过程中涉及树状菜单&#xff0c;于是做如下分享菜单实现 不足之处请大牛指点并见谅&#xff08;如图&#xff09; 1&#xff1a;数据表涉及字段 id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 系统菜单ID, pid int(10) DEFAULT NULL COMMENT 父级ID, name va…

vue计算属性computed与监听属性watch的基本使用

目录 Vue.js 计算属性 Vue.js 监听属性 Vue.js 计算属性 计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 反转字符串的示例 <!DOCTYPE html> <html> <he

vue样式绑定与事件处理器的基本使用

目录 Vue.js 样式绑定 Vue.js 事件处理器 事件修饰符 Vue.js 样式绑定

Finally 与 return

网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行&#xff1f;很多人都说不是&#xff0c;当然他们的回答是正确的&#xff0c;经过我试验&#xff0c;至少有两种情况下finally语句是不会被执行的&#xff1a; &#xff08;1&…

vue表单的基本使用

Vue.js 表单 介绍 一下Vue.js 表单上的应用。你可以用 v-model 指令在表单控件元素上创建双向数据绑定。 v-model 会根据控件类型自动选取正确的方法来更新元素。 input 和 textarea 元素中使用 v-model 实现双向数据绑定: <!DOCTYPE html> <html> <head…

fold函数_Java中使用Map and Fold进行函数式编程

fold函数在函数式编程中&#xff0c;Map和Fold是两个非常有用的运算符&#xff0c;它们属于每种函数式语言。 如果Map和Fold运算符是如此强大且必不可少&#xff0c;那么您如何解释说即使Java编程语言缺少这两个运算符&#xff0c;我们也可以使用Java来完成工作&#xff1f; 事…

NVIC优先级分组

挂起&#xff0c;解挂&#xff0c;使能&#xff0c;失能 转载于:https://www.cnblogs.com/alantechnique/p/5598374.html

【Egret】Wing3发布移动APP功能,打包APK流程以及会遇到的问题

流程&#xff1a;1.安装好wing 3&#xff0c;然后 插件——Egret项目工具——发布移动APP——Build android native project 2.配置发布环境&#xff1a; Android 1.egret engine 点击下载2.android sdk mac版下载 windows版下载3.java sdk mac版下载 windows版…

有效运维的 on-call 机制

[编者按]本文作者为云告警平台OneAlert负责人&#xff0c;著《云计算与OpenStack》&#xff0c;在IT运营管理、云计算方面从业10多年。 正文 互联网技术的发展&#xff0c;离不开运维支撑工作&#xff0c;没有零bug的程序&#xff0c;没有不出问题的系统&#xff0c;问题故障不…

团队项目:界面设计

游戏内关卡为2D横版界面&#xff0c;背景为楼群贴图&#xff0c;整体色调以灰色为主&#xff0c;与摩托车手的主题相配。游戏中配有音效及背景音乐&#xff0c;背景音乐为我组成员自行创作录制完成。界面展示如下&#xff1a; 图1 游戏中设计图 图中显示的摩托车手即为玩家操控…

Hystrix简介

在过去的几天里&#xff0c;我一直在探索Netflix Hystrix库&#xff0c;并欣赏了这个出色的库所提供的功能。 引用Hystrix网站上的内容&#xff1a; Hystrix是一个延迟和容错库&#xff0c;旨在隔离对远程系统&#xff0c;服务和第三方库的访问点&#xff0c;停止级联故障&am…

MP3音乐播放器搜索引擎-鼠标拖动窗口

定义鼠标的按压&#xff0c;移动&#xff0c;施放事件 &#xff08;1&#xff09;鼠标的按压事件 globalpos是全局坐标&#xff0c;即鼠标相对于桌面屏幕左上角的坐标我们通过this->frameGeometry().topLeft();可以获得当前窗口的左上角的x左边或y坐标 在移动事件中我们可以…

SpringMVC学习--文件上传

简介文件上传是web开发中常见的需求之一&#xff0c;springMVC将文件上传进行了集成&#xff0c;可以方便快捷的进行开发。 springmvc中对多部件类型解析在 页面form中提交enctype"multipart/form-data"的数据时&#xff0c;需要springmvc对multipart类型的数据进行解…

VS code常用的快捷键

在前端的开发过程中&#xff0c;如果有一个比较好的开发工具&#xff0c;配合一些常用的快捷键&#xff0c;开发效率将大大提升&#xff0c;正所谓工具善其事必先利其器。前端推荐使用编辑器VS code,用过HB-X&#xff0c;ST3,Webstorm等编译器之后就会发现&#xff0c;前端编辑…