OpenMap教程3 –使用MapHandler构建基本的地图应用程序–第2部分
1.簡介
在上一教程中,我們看到了MapHandler如何將各種組件連接在一起(更具體地說,是從MapHandlerChild派生的類)。 我們看到了如何以編程方式執(zhí)行此操作,但是還有另一種聲明性地使用openmap.properties 。
樣本OpenMap應(yīng)用程序配置有一個openmap.properties文件。 此屬性文件的內(nèi)容指定要創(chuàng)建的組件,并將其添加到應(yīng)用程序框架(包括層)中。 只需重新配置文本編輯器中的openmap.properties文件,即可配置新應(yīng)用程序而無需重新編譯。 只需將了解框架的組件添加到該屬性文件中,即可將它們添加到應(yīng)用程序中。 而且,將為使用屬性編寫的組件設(shè)置其設(shè)置,以便正確初始化自己。 例如,依賴于數(shù)據(jù)文件或服務(wù)器位置的層通常具有允許在運行時設(shè)置這些位置的屬性。
2. openmap.properties
openmap.properties文件具有一個openmap.components屬性,該屬性列出了組成應(yīng)用程序的所有組件。 要更改組成您的應(yīng)用程序的組件,只需編輯此列表。 如果您希望組件被告知BeanContext ,請將其設(shè)為BeanContextChild 。 它將添加到MapHandler以便其他組件可以找到它(如果它在openmap.components屬性列表中)。 如果要以編程方式創(chuàng)建自己的組件,只需將BeanContextChild組件自己添加到MapHandler ,如上一篇文章清單2所示 。
LayerHandler基于openmap.properties文件中的openmap.layers屬性創(chuàng)建可用于地圖的openmap.properties 。 修改openmap.layers屬性可讓您從應(yīng)用程序中添加和刪除圖層。 可以設(shè)置的OpenMap圖層屬性在圖層的JavaDocs中列出。
PropertyHandler ( com.bbn.openmap.PropertyHandler )使用openmap.properties文件配置應(yīng)用程序。 可以知道在Java類路徑和應(yīng)用程序用戶的主目錄中,從哪個文件讀取屬性或?qū)⑵淞艚o自己來查找openmap.properties文件。 openmap.components ,它使用openmap.components屬性,其中包含對象的標(biāo)記名稱列表。 然后,列表的每個成員都用于查找另一個屬性( 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 ,則它將在創(chuàng)建之后將其創(chuàng)建的組件加載到其中。 智能組件( MapHandlerChildren )足夠聰明,可以將自己連接在一起。 順序?qū)τ趏penmap.components屬性確實很重要,尤其是對于添加到列表和菜單中的組件。 將組件按希望將組件添加到MapHandler的順序放置在列表中。
當(dāng)OpenMap應(yīng)用程序通過openmap.components屬性創(chuàng)建對象時,該列表上的標(biāo)記名稱將成為組件的屬性前綴。 代表PropertyHandler創(chuàng)建組件的ComponentFactory會檢查該組件是否為PropertyConsumer ,如果是,它將對其調(diào)用setProperties(prefix, properties)以讓該組件自行配置。
清單2顯示了使用上述內(nèi)容的初始應(yīng)用程序。 (代碼基于com.bbn.openmap.app.OpenMap )。
清單2:使用openmap.properties文件的OpenMap應(yīng)用程序
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中調(diào)用靜態(tài)create()方法。 create()方法調(diào)用構(gòu)造函數(shù)并傳遞openmap.properties文件路徑。 方法configurePropertyHandler()從此屬性文件中創(chuàng)建一個新的PropertyHandler() 。 構(gòu)造函數(shù)將此屬性處理程序傳遞給configureMapPanel() ,后者使用它來創(chuàng)建MapPanel 。 第二個參數(shù)允許您延遲MapPanel的create()直到調(diào)用create()方法。 在這里,您可以使用BasicMapPanel basicMapPanel = new BasicMapPanel(propertyHandler, false); 無需調(diào)用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.擴展我們的應(yīng)用程序
只需修改openmap.properties即可擴展應(yīng)用程序! 我們已經(jīng)在清單5中看到了如何向地圖添加鼠標(biāo)事件支持。 讓我們看看還有哪些其他功能可用! OpenMap體系結(jié)構(gòu)支持管理MouseEvent和MouseMotionEvent的分發(fā),將它們定向到應(yīng)用程序中的組件。 圖層和其他工具組件可以使用這些事件來解釋和響應(yīng)地圖上的用戶手勢,顯示有關(guān)地圖要素的更多信息,修改要素的位置或配置用于分析查詢的工具。
MapMouseMode描述了如何解釋和使用MouseEvent和MouseMotionEvent 。 該MouseDelegator負(fù)責(zé)控制其MapMouseMode是MouseListener和MouseMotionListener到MapBean 。 MouseDelegator管理MouseMode的列表,并知道在任何給定時間哪個是“活動的”。 它偵聽MapBean事件,該事件告訴它已將哪些圖層添加到地圖中。 當(dāng)獲得該層列表時,它將向每個層詢問其MapMouseListener ,并將那些MapMouseListener添加到偵聽器指定的MapMouseMode 。 當(dāng)MouseEvent從MapBean到活動的MapMouseMode ,該模式開始將MouseEvent提供給其MapMouseListener 。 每個偵聽器都有機會使用該事件。 MapMouseListener可以自由地對事件進行操作而不使用事件,因此它可以繼續(xù)傳遞給其他偵聽器。 來自地圖較高層的MapMouseListener可以在較低層之前消耗MouseEvent 。 圖層可以實現(xiàn)MapMouseListener接口,或者可以將該職責(zé)委派給另一個對象,或者如果它不希望接收事件,則可以僅返回null(該Layer默認(rèn)設(shè)置)。
InformationDelegator ( com.bbn.openmap.InformationDelegator )是用于向用戶傳達消息的中央組件。 當(dāng)活動層更改時, InformationDelegator偵聽MapBean上的消息,并將其自身連接到這些層,以響應(yīng)其在地圖上對工具提示的請求,在不同文本區(qū)域中呈現(xiàn)信息文本,彈出對話框消息并用于處理在瀏覽器中顯示信息的請求。 作為MapPanelChild ,它通常要求放置在地圖下方。 默認(rèn)情況下, InformationDelegator僅具有兩個文本區(qū)域,用于在地圖周圍放置簡潔的信息,一個文本區(qū)域通常用于MapMouseMode提供的坐標(biāo)信息,而另一個文本區(qū)域用于有關(guān)用戶正在瀏覽的地圖上的數(shù)據(jù)的信息。 可以通過編程方式將更多文本區(qū)域添加到InformationDelegator ,并請求將新信息定向在這些區(qū)域中顯示。
作為練習(xí),通過相應(yīng)地修改openmap.properties ,將InformationDelegator實例添加到您的應(yīng)用程序中。 只需運行它即可看到類似于圖1的窗口。
圖1:添加了InformationDelegator的SimpleMap(位于底部)
ToolPanel是一個JtoolBar ,OpenMap放置在地圖上方。 ToolPanel使用MapHandler來定位實現(xiàn)Tool接口的對象, MapHandler在找到對象時將其添加到自身即可。 OMToolComponent是一個便捷類,它實現(xiàn)Tool , PropertyConsumer和LightMapHandlerChild接口,從而允許任何派生類出現(xiàn)在ToolPanel ,配置有屬性并在MapHandler找到其他組件。 一些OMToolComponent包括:
- NavigatePanel提供了一組箭頭,用于在8個不同方向上平移地圖。 它使用MapHandler查找MapBean ,該PanEvent從NavigatePanel按鈕監(jiān)聽PanEvent 。
- ZoomPanel提供了一對用于放大和縮小的按鈕。
- ScaleTextPanel提供了一個文本字段,用于直接設(shè)置當(dāng)前比例。
- ProjectionStackTool提供了兩個按鈕,用于跟蹤ProjectionStack ,該項目用于還原到過去的投影設(shè)置,然后轉(zhuǎn)發(fā)到最新的投影設(shè)置。 為了使ProjectionStackTool與MapBean投影配合使用,還必須將com.bbn.openmap.proj.ProjectionStack對象添加到MapHandler 。
- LayersPanel會彈出一個窗口,可用于設(shè)置可見或不可見的圖層以及配置圖層的屬性。 您還可以重新排序圖層。
清單6顯示了如何將上述小部件添加到openmap.properties 。 結(jié)果如圖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# ...圖2:打開了帶有圖層的OpenMap窗口
OverviewMapHandler提供了一個較小的縮小地圖,以顯示主MapBean所顯示的內(nèi)容。 它可以直接添加到任何其他組件中,但是由于使用了“ 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 ,即定義縮放區(qū)域的紅色矩形(請參見圖3 )。
圖3:概述圖窗口
- AddLayerPanel小部件允許將某些圖層/插件動態(tài)添加到應(yīng)用程序。 僅某些圖層/插件已更新,可以與Inspector一起設(shè)置其初始參數(shù)。 addlayer標(biāo)記名稱已添加到openmap.components列表中,并且此組件將查找openmap.addableLayers屬性以找出可用于動態(tài)添加的圖層。 要將圖層添加到此列表中,請為該圖層的通用實例創(chuàng)建一個唯一的標(biāo)記名稱,然后為該對象提供<layername>.class字段和<layername>.prettyName (請參見清單8 )。 class名將是由LayerAddPanel創(chuàng)建的圖層/插件的LayerAddPanel ,而其prettyName將是呈現(xiàn)給用戶的圖層的通用描述。 創(chuàng)建圖層時,用戶將有機會更改該名稱(請參見圖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:添加圖層按鈕
- com.bbn.openmap.gui.menu.MenuList對象負(fù)責(zé)創(chuàng)建Menu ,并向他們提供對其他MapHandler組件的訪問。 MenuList能夠提供JMenuBar或包含其菜單的JMenu并維護菜單的定義順序。 AbstractOpenMapMenu是JMenu抽象類,已通過PropertyConsumer和LightMapHandlerChild方法進行了增強。 OMBasicMenu是AbstractOpenMapMenu的擴展,可以在屬性文件中定義其MenuItem和分隔符。 如果它具有任何擴展MapHandlerMenuItem類的MenuItem ,它將自動照顧給予他們訪問MapHandler找到的對象的MapHandler 。
更改如清單9所示。 菜單在menulist.menus屬性中聲明。 請注意,菜單對象的添加順序很重要,但helpMenu總是被調(diào)整為最后一個。 但是,如果您運行該應(yīng)用程序,則會發(fā)現(xiàn)沒有菜單! 有毛病嗎 請執(zhí)行以下解決方法。 從openmap.components屬性列表中刪除openMapFrame ,然后重新添加清單2中的代碼。 現(xiàn)在,您應(yīng)該看到菜單欄(請參見圖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
- 添加MouseModeButtonPanel也很容易(請參見清單10 )。 四個模式: SelectMouseMode , PanMouseMode , DistanceMouseMode和NavMouseMode2已添加到其中。 請注意, mouseMode.class已從“ ### Key components部分移至此處。 您可能會在圖6中看到結(jié)果。
清單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
作為我們的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所示。 結(jié)果如圖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
當(dāng)然,如果我們可以繪圖,為什么不能刪除我們的繪圖。 執(zhí)行清單13的修改,以查看圖8中的結(jié)果。
清單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
4。結(jié)論
在本教程中,我們通過將它們逐步添加到openmap.properties文件中,了解了許多OpenMap小部件。 可以在那里重新配置新的應(yīng)用程序,而無需重新編譯。 BeanContextChild的定義組件openmap.components屬性列表是由自動連接在一起MapHandler 。 使用openmap.layers屬性列表定義組成地圖的openmap.layers 。 LayerHandler基于此列表構(gòu)建地圖。 以下是我們學(xué)習(xí)的小部件的列表: OpenMapFrame, LayerHandler, MouseDelegator, OMMouseMode, InformationDelegator, ToolPanel, LayersPanel, OverviewMapHandler, AddLayerPanel, MenuList, MouseModeButtonPanel,繪圖工具和DeleteButton 。
在下一個教程中,我們將更深入地了解OpenMap的內(nèi)部知識。
參考文獻
翻譯自: https://www.javacodegeeks.com/2015/12/openmap-tutorial-3-build-basic-map-application-using-maphandler-part-2.html
總結(jié)
以上是生活随笔為你收集整理的OpenMap教程3 –使用MapHandler构建基本的地图应用程序–第2部分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记本散热架(笔记本散热架怎么放)
- 下一篇: 电脑打开无法显示网页(电脑显示有网但网页