openmap_OpenMap教程3 –使用MapHandler构建基本的地图应用程序–第2部分
![](/assets/blank.gif)
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中列出。
PropertyHandler
( com.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
具有两层( shapePolitical
和graticule
)。
如果为PropertyHandler
提供了MapHandler
,则它将在创建之后将其创建的组件加载到其中。 智能组件( MapHandlerChildren
)非常聪明,可以将自身连接在一起。 顺序对于openmap.components
属性确实很重要,尤其是对于添加到列表和菜单中的组件。 将组件按您希望组件添加到MapHandler
的顺序放置在列表中。
当OpenMap应用程序通过openmap.components
属性创建对象时,该列表上的标记名称将成为组件的属性前缀。 代表PropertyHandler
创建组件的ComponentFactory
会检查该组件是否为PropertyConsumer
,如果是,它将对其调用setProperties(prefix, properties)
以让该组件自行配置。
清单2显示了使用上述内容的初始应用程序。 (代码基于com.bbn.openmap.app.OpenMap
)。
- 在NetBeans中,右键单击openmap包,然后创建一个新的Java类。 将其命名为
OpenMap
。 - 将清单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
。 第二个参数允许您延迟MapPanel
的create()
直到调用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 。 还添加了另外两个组件mouseDelegator
和onMouseMode
。
清单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体系结构支持对MouseEvent
和MouseMotionEvent
的分发进行管理,将它们定向到应用程序中的组件。 图层和其他工具组件可以使用这些事件来解释和响应地图上的用户手势,显示有关地图要素的更多信息,修改要素的位置或配置用于分析查询的工具。
MapMouseMode
描述了如何解释和使用MouseEvent
和MouseMotionEvent
。 该MouseDelegator
负责控制其MapMouseMode
是MouseListener
和MouseMotionListener
到MapBean
。 MouseDelegator
管理MouseMode
的列表,并知道在任何给定时间哪个是“活动的”。 它侦听MapBean
事件,该事件告诉它已将哪些图层添加到地图中。 当获得该层列表时,它将向每一层询问其MapMouseListener
,并将这些MapMouseListener
添加到侦听器指定的MapMouseMode
。 当MouseEvent
从MapBean
到活动的MapMouseMode
,该模式开始将MouseEvent
提供给其MapMouseListener
。 每个侦听器都有机会使用该事件。 MapMouseListener
可以自由地对事件进行操作而不使用事件,因此它可以继续传递给其他侦听器。 来自地图较高层的MapMouseListener
可以在较低层之前消耗MouseEvent
。 图层可以实现MapMouseListener
接口,或者可以将该职责委派给另一个对象,或者如果它不希望接收事件,则可以仅返回null(该Layer
默认设置)。
InformationDelegator
( com.bbn.openmap.InformationDelegator
)是用于向用户传达消息的中央组件。 当活动层更改时, InformationDelegator
侦听MapBean上的消息,并将其自身连接到这些层,以响应其在地图上对工具提示的请求,在不同文本区域中呈现信息文本,弹出对话框消息并用于处理在浏览器中显示信息的请求。 作为MapPanelChild
,它通常要求放置在地图下方。 默认情况下, InformationDelegator
仅具有两个文本区域,可用于在地图周围放置简洁的信息,一个文本区域通常用于MapMouseMode
提供的坐标信息,而一个文本区域用于有关用户正在浏览的地图上的数据的信息。 可以通过编程方式将更多文本区域添加到InformationDelegator
,并请求将新信息定向在这些区域中显示。
作为练习,通过相应地修改openmap.properties
,将InformationDelegator
实例添加到您的应用程序中。 只需运行它即可看到类似于图1的窗口。
![](/assets/blank.gif)
图1:添加了InformationDelegator的SimpleMap(位于底部)
ToolPanel
是一个JtoolBar
,OpenMap放置在地图上方。 ToolPanel
使用MapHandler
来定位实现Tool
接口的对象, MapHandler
在找到对象时将其添加到自身即可。 OMToolComponent
是一个便捷类,它实现Tool
, PropertyConsumer
和LightMapHandlerChild
接口,从而允许任何派生类出现在ToolPanel
,配置有属性并在MapHandler
找到其他组件。 一些OMToolComponent
包括:
NavigatePanel
提供了一组箭头,用于在8个不同方向上平移地图。 它使用MapHandler
查找MapBean
,该PanEvent
从NavigatePanel
按钮侦听PanEvent
。ZoomPanel
提供了一对用于放大和缩小的按钮。ScaleTextPanel
提供了一个文本字段,用于直接设置当前比例。ProjectionStackTool
提供了两个按钮,用于跟踪ProjectionStack
,该项目用于还原到过去的投影设置,然后转发到最新的投影设置。 为了使ProjectionStackTool
与MapBean
投影配合使用,还必须将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# ...
![](/assets/blank.gif)
图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 )。
![](/assets/blank.gif)
图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# ...
![](/assets/blank.gif)
图4:添加图层按钮
com.bbn.openmap.gui.menu.MenuList
对象负责创建Menu
,并向他们提供对其他MapHandler
组件的访问。MenuList
能够提供JMenuBar
或包含其菜单的JMenu
并维护菜单的定义顺序。AbstractOpenMapMenu
是JMenu抽象类,已通过PropertyConsumer
和LightMapHandlerChild
方法进行了增强。OMBasicMenu
是AbstractOpenMapMenu
的扩展,可以在属性文件中定义其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
# #################################################### ...
![](/assets/blank.gif)
图5:带有菜单栏和工具栏的OpenMap
- 添加
MouseModeButtonPanel
也很容易(请参见清单10 )。 四个模式:SelectMouseMode
,PanMouseMode
,DistanceMouseMode
和NavMouseMode2
已添加到其中。 请注意,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# ...
![](/assets/blank.gif)
图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# ...
![](/assets/blank.gif)
图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# ...
![](/assets/blank.gif)
图8:带有“删除”按钮的OpenMap
4。结论
在本教程中,我们通过将它们逐步添加到openmap.properties
文件中,了解了许多OpenMap小部件。 可以在此处配置新应用程序,而无需重新编译。 BeanContextChild
的定义组件openmap.components
属性列表是由自动连接在一起MapHandler
。 使用openmap.layers
属性列表定义组成地图的openmap.layers
。 LayerHandler
基于此列表构建地图。 以下是我们学习的小部件的列表: OpenMapFrame, LayerHandler, MouseDelegator, OMMouseMode, InformationDelegator, ToolPanel, LayersPanel, OverviewMapHandler, AddLayerPanel, MenuList, MouseModeButtonPanel,
绘图工具和DeleteButton
。
在下一个教程中,我们将更深入地了解OpenMap的内部知识。
参考文献
- OpenMap开发人员指南
- OpenMap开发人员提示
翻译自: https://www.javacodegeeks.com/2015/12/openmap-tutorial-3-build-basic-map-application-using-maphandler-part-2.html
openmap
openmap_OpenMap教程3 –使用MapHandler构建基本的地图应用程序–第2部分相关推荐
- pcl_openmap_OpenMap教程3 –使用MapHandler构建基本的地图应用程序–第2部分
pcl_openmap 1.简介 在上一教程中,我们了解了MapHandler如何将各种组件连接在一起(更具体地说,是从MapHandlerChild派生的类). 我们看到了如何以编程方式执行此操作, ...
- OpenMap教程3 –使用MapHandler构建基本的地图应用程序–第2部分
1.简介 在上一教程中,我们看到了MapHandler如何将各种组件连接在一起(更具体地说,是从MapHandlerChild派生的类). 我们看到了如何以编程方式执行此操作,但是还有另一种声明性地使 ...
- pcl_openmap_OpenMap教程第2部分–使用MapHandler构建基本地图应用程序–第1部分
pcl_openmap 1.简介 在第一个教程中,我们创建了一个基本的OpenMap GIS应用程序,该应用程序在JFrame中显示一个从文件系统加载的具有一个形状图层的地图. 该教程基于com.bb ...
- OpenMap教程第2部分–使用MapHandler构建基本地图应用程序–第1部分
1.简介 在第一个教程中,我们创建了一个基本的OpenMap GIS应用程序,该应用程序在JFrame中显示一个从文件系统加载的具有一个形状图层的地图. 该教程基于com.bbn.openmap.ap ...
- Xamarin XAML语言教程Xamarin.Forms中构建进度条
Xamarin XAML语言教程Xamarin.Forms中构建进度条 ProgressBar被称为进度条,它类似于没有滑块的滑块控件.进度条总是水平放置的.本节将讲解如何使用进度条. 注意:进度条在 ...
- 【Flutter教程】从零构建电商应用(一)
在这个系列中,我们将学习如何使用google的移动开发框架flutter创建一个电商应用.本文是flutter框架系列教程的第一部分,将学习如何安装Flutter开发环境并创建第一个Flutter应用 ...
- 七牛服务器入门教程_教程:使用无服务器,StepFunction和StackStorm构建社区的入门应用程序…...
七牛服务器入门教程 by Dmitri Zimine 由Dmitri Zimine 使用无服务器,StepFunction和StackStorm Exchange构建社区注册应用 (Building ...
- Flash AS3.0实例教程:构建简单的声音可视化程序(波型图)
本例为Flash AS3.0实例教程,在教程中我们将学习运用SoundMixer.computeSpectrum() 方法来构建简单的声音可视化程序(即波形图),希望能给朋友们带来帮助~~ AS3.0 ...
- Docker教程(四) Docker镜像构建
Docker教程(四) Docker镜像构建 本文链接:https://blog.csdn.net/yuan_xw/article/details/77744272 Docker教程(四) Docke ...
- Android源码编译环境搭建教程 (一) - Ubuntu系统构建
Android源码编译环境搭建教程 (一) - Ubuntu系统构建 本教程为感兴趣的同学提供Android源码编译的环境搭建,当然这里都是基于windows系统,mac系统也差不多,将相应的软件替换 ...
最新文章
- R语言dplyr包distinct函数去除重复数据行实战
- Codeforces Round #324 (Div. 2) E. Anton and Ira 贪心
- Class.forName解析以及使用
- 让element-ui的输入框聚焦的4种方式
- 解决http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar
- CSS : Cascading Style Sheets
- Boosting Adversarial Attacks with Momentum论文解读
- ios14描述文件无法与服务器连接,iOS14屏蔽更新描述文件已损坏,无法安装的解决办法...
- 计算机单元格数值不保留小数,excel如何用公式让单元格数值保留两位小数
- 在chrome的网址上搜索总是跳转到百度首页
- CSAPP-Lab02 Bomb Lab 详细解析
- 计算机组成CPU最佳配置,计算机组成原理--CPU
- 开源Odoo ERP13.2版本模块功能
- 用Ubuntu20.04开热点
- 使用TS开发小程序中遇到的问题
- 什么是虚拟机?Mac电脑怎么使用虚拟机安装双系统?
- MAYA打造复古风书房一角场景模型-3D建模场景模型教程
- 手机如何拍摄一寸证件照片
- VVC/VSEI 高层语法
- Illegal mix of collations (XXX) and (XXX) for operation ‘XXX’