1. Введение
В предыдущем уроке мы видели, как MapHandler
может соединять вместе различные компоненты (точнее, классы, производные от MapHandlerChild
) Мы видели, как мы могли бы сделать это программно, но есть и другой способ, декларативно, используя openmap.properties
.
Пример приложения OpenMap настраивается с помощью файла openmap.properties
. Содержимое этого файла свойств указывает, какие компоненты создаются и добавляются в платформу приложения, включая слои. Новые приложения можно настроить без перекомпиляции, просто изменив файл openmap.properties
в текстовом редакторе. Компоненты, написанные с пониманием структуры, можно добавить в приложение, просто добавив их в этот файл свойств. Также компонентам, написанным для использования свойств, будут даны свои настройки для правильной инициализации. Например, слои, которые зависят от расположения файлов данных или серверов, обычно имеют свойства, позволяющие устанавливать эти расположения во время выполнения.
2. openmap.properties
Файл openmap.properties
имеет свойство openmap.components
котором перечислены все компоненты, составляющие приложение. Чтобы изменить компоненты, составляющие ваше приложение, просто отредактируйте этот список. Если вы хотите, чтобы о вашем компоненте сообщили BeanContext
, сделайте его BeanContextChild
. Он будет добавлен в MapHandler
чтобы другие компоненты могли его найти, если он находится в openmap.components
свойств openmap.components
. Если вы создаете свои собственные компоненты программно, просто добавьте компонент MapHandler
в MapHandler
самостоятельно, как мы видели в листинге 2 предыдущей статьи.
LayerHandler
создает слои, доступные для карты, на openmap.layers
свойства openmap.properties
файле openmap.properties
. Изменение свойства openmap.layers
позволяет добавлять и удалять слои из приложения. Свойства слоев OpenMap, которые можно установить, перечислены в JavaDocs слоя.
PropertyHandler
( com.bbn.openmap.PropertyHandler
) использует файл openmap.properties
для настройки приложения. Можно openmap.properties
из openmap.properties
файла считывать свойства, или оставить его самостоятельно, чтобы найти файл openmap.properties
в пути к классам Java и в домашнем каталоге пользователя приложения. Он использует свойство openmap.components
которое содержит список имен маркеров для объектов, как уже упоминалось. Каждый член списка затем используется для поиска другого свойства ( markername.class
), которое определяет классы, которые должны быть созданы.
Листинг 1: openmap.properties со свойством openmap.components
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
# 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
и shapePolitical
).
Если PropertyHandler
предоставлен MapHandler
, он загрузит созданные им компоненты после их создания. Интеллектуальные компоненты ( MapHandlerChildren
) достаточно умны, чтобы MapHandlerChildren
себя вместе. Порядок имеет значение для свойства openmap.components
, особенно для компонентов, которые добавляются в списки и меню. Разместите компоненты в списке в том порядке, в котором вы хотите добавить компоненты в MapHandler
.
Когда приложение OpenMap создает объекты из свойства openmap.components
, имя маркера в этом списке становится префиксом свойства для компонентов. ComponentFactory
, который создает компоненты от имени PropertyHandler
, проверяет, является ли компонент PropertyConsumer
, и если это так, он вызывает setProperties(prefix, properties)
для него, чтобы позволить компоненту конфигурировать себя.
В листинге 2 показано исходное приложение, в котором используется вышеуказанное. (Код основан на com.bbn.openmap.app.OpenMap
).
- В NetBeans щелкните правой кнопкой мыши пакет openmap и создайте новый класс Java. Назовите это
OpenMap
. - Скопируйте содержимое листинга 2 внутри этого класса.
Листинг 2: Приложение OpenMap, использующее файл openmap.properties
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
|
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()
вызывает статический метод create()
в EDT. Метод create()
вызывает конструктор, передавая openmap.properties
файлу openmap.properties
. Метод configurePropertyHandler()
создает новый PropertyHandler()
из этого файла свойств. Конструктор передает этот обработчик свойства в configureMapPanel()
который использует его для создания MapPanel
. Второй параметр позволяет отложить создание MapPanel
до MapPanel
метода create()
. Здесь вы могли бы использовать BasicMapPanel basicMapPanel = new BasicMapPanel(propertyHandler, false);
без необходимости вызывать create()
. Вы также можете использовать OverlayMapPanel
вместо BasicMapPanel
(см. Листинг 3 ).
Листинг 3: метод configureMapPanel () инициализирует OverlayMapPanel
1
2
3
|
private void configureMapPanel(PropertyHandler propertyHandler) { mapPanel = new OverlayMapPanel(propertyHandler, false ); } |
Наконец, showInFrame()
инициализирует OpenMapFrame
со свойствами с префиксом «openmap», добавляет его в обработчик карты и показывает его. Вам не нужно ничего определять, ни LayerHandler
, ни MouseDelegator
; все они определены в openmap.properties
.
Вы можете упростить showInFrame()
листинге 4 , избавившись от блока if, если добавите OpenMapFrame
в листинг 5 openmap.components
. Также были добавлены еще два компонента, mouseDelegator
и onMouseMode
.
Листинг 4: Упрощенный метод showInFrame ()
1
2
3
4
5
|
private void showInFrame() { MapHandler mapHandler = getMapHandler(); OpenMapFrame omf = (OpenMapFrame) mapHandler.get(OpenMapFrame. class ); omf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } |
Листинг 5: openmap.properties со свойством openmap.components
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
# 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
s. Каждому слушателю предоставляется возможность использовать событие. MapMouseListener
может воздействовать на событие и не использовать его, чтобы его можно было продолжать передавать другим слушателям. MapMouseListener
s из верхних слоев карты получают возможность использовать MouseEvent
раньше, чем нижние. Слой может реализовывать интерфейс MapMouseListener
, или он может делегировать эту ответственность другому объекту, или может просто возвращать ноль, если он не заинтересован в получении событий ( Layer
умолчанию).
InformationDelegator
( com.bbn.openmap.InformationDelegator
) является центральным компонентом, используемым для передачи сообщений пользователю. InformationDelegator
прослушивает MapBean для сообщений о том, когда изменяются активные слои, и подключается к этим слоям, чтобы отвечать на их запросы подсказок на карте, для представления информационного текста в различных текстовых областях, для извлечения диалоговых сообщений. и для обработки запросов для отображения информации в браузере. Как MapPanelChild
, он обычно просит поместить его под карту. По умолчанию InformationDelegator
имеет только две текстовые области, которые он использует для размещения краткой информации вокруг карты, одну для координатной информации, обычно предоставляемой с помощью MapMouseMode
, и одну для информации о данных на карте, над которыми пользователь жестикулирует. В InformationDelegator
можно программно добавить больше текстовых областей, при этом запросы направляют новую информацию для отображения в этих областях.
В качестве упражнения добавьте экземпляр InformationDelegator
в свое приложение, соответственно изменив openmap.properties
. Просто запустите его, чтобы увидеть окно, подобное изображенному на рисунке 1 .
Панель ToolPanel
— это JtoolBar
который OpenMap размещает прямо над картой. ToolPanel
использует MapHandler
для поиска объектов, которые реализуют интерфейс Tool
, просто добавляя их к себе по мере их обнаружения. OMToolComponent
— это удобный класс, который реализует интерфейсы Tool
, PropertyConsumer
и LightMapHandlerChild
, позволяя любому производному классу появляться в ToolPanel
, настраиваться со свойствами и находить другие компоненты в MapHandler
. Некоторые OMToolComponent
включают в себя:
-
NavigatePanel
предоставляет набор стрелок, используемых для панорамирования карты в 8 различных направлениях. Он используетMapHandler
для поискаMapBean
, который прослушиваетPanEvent
с помощью кнопокNavigatePanel
. -
ZoomPanel
предоставляет пару кнопок для увеличения и уменьшения масштаба. -
ScaleTextPanel
предоставляет текстовое поле для прямой установки текущего масштаба. -
ProjectionStackTool
предоставляет две кнопки, которые отслеживаютProjectionStack
использованный для возврата к прошлым настройкам проекции, а затем для перехода к самым последним настройкам проекции. ЧтобыProjectionStackTool
работал с проекциямиMapBean
, вcom.bbn.openmap.proj.ProjectionStack
также необходимо добавитьMapHandler
. - Панель
LayersPanel
вызывает окно, которое вы можете использовать, чтобы установить видимые или нет слои, а также настроить свойства слоев. Вы также можете изменить порядок слоев.
В листинге 6 показано, как добавить вышеуказанные виджеты в openmap.properties
. Результат показан на рисунке 2 .
Листинг 6: openmap.properties со свойством openmap.components
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
# 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 # ... |
OverviewMapHandler
предоставляет уменьшенную уменьшенную карту, чтобы показать, что отображает основной MapBean
. Его можно напрямую добавить к любому другому компоненту, но благодаря интерфейсу Tool
он предоставляет кнопку, которая отображает обзорную карту в отдельном окне. Это сложнее настроить, как вы можете увидеть в листинге 7 .
Листинг 7: openmap.properties с OverviewMapHandler
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
# 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 ).
- Виджет
AddLayerPanel
позволяет динамически добавлять в приложение определенные слои / плагины. Только некоторые слои / плагины были обновлены, чтобы иметь возможность работать сInspector
для установки их начальных параметров. Имя маркераaddlayer
было добавлено в списокopenmap.components
, и этот компонент ищет свойствоopenmap.addableLayers
чтобы выяснить, какие слои сделать доступными для динамического добавления. Чтобы добавить слой в этот список, создайте уникальное имя маркера для общего экземпляра слоя, а затем<layername>.class
для этого объекта поля<layername>.class
и<layername>.prettyName
(см. Листинг 8 ). Имяclass
будет типом слоя / плагина, созданногоLayerAddPanel
, а егоprettyName
будет общим описанием слоя, представленного пользователю. У пользователя будет возможность изменить это имя при создании слоя (см. Рисунок 4 ).
Листинг 8: openmap.properties с компонентом addLayer
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
# 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 # ... |
- Объект
com.bbn.openmap.gui.menu.MenuList
отвечает за созданиеMenu
и предоставление им доступа к другим компонентамMapHandler
.MenuList
способен предоставитьJMenuBar
илиJMenu
содержащий его меню, и поддерживать определенный порядок меню.AbstractOpenMapMenu
— это абстрактный класс JMenu, который был расширен сLightMapHandlerChild
методовPropertyConsumer
иLightMapHandlerChild
.OMBasicMenu
является расширениемAbstractOpenMapMenu
которое имеет возможность определять своиMenuItem
и разделители, определенные в файле свойств. Если у него есть какие-либоMenuItem
, расширяющие классMapHandlerMenuItem
, он автоматически позаботится о предоставлении им доступа к объектам, найденным вMapHandler
.
Изменения показаны в листинге 9 . Меню объявлено в собственности menulist.menus
. Обратите внимание, что порядок добавления объектов меню важен, кроме как из helpMenu
который всегда устанавливается последним Однако, если вы запустите приложение, вы заметите, что меню нет! Жук? Сделайте следующий обходной путь. Удалите openMapFrame
из openmap.components
свойств openmap.components
и верните код из листинга 2 . Теперь вы должны увидеть строку меню (см. Рисунок 5 ).
Листинг 9: openmap.properties с компонентом menulist
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
# 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 # ################################################### # ... |
-
MouseModeButtonPanel
тоже легко (см. Листинг 10 ). КNavMouseMode2
были добавлены четыре режима:SelectMouseMode
,PanMouseMode
,DistanceMouseMode
иNavMouseMode2
. Обратите внимание, чтоmouseMode.class
был перемещен сюда из части### Key components
. Вы можете увидеть результат на рисунке 6 .
Листинг 10: openmap.properties с компонентом mouseModePanel
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
# 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 # ... |
В качестве последнего компонента нашей выставки виджетов OpenMap, мы увидим, как мы можем рисовать на карте. Нам нужно добавить специальный слой, на котором мы можем рисовать, то есть один из типов OMGraphicHandlerLayer
(см. Листинг 11 ).
Листинг 11: openmap.properties со слоями рисования
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
# 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 с инструментами рисования
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
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 # ... |
И, конечно, если мы можем рисовать, почему бы не быть в состоянии удалить наши рисунки. Выполните изменения в листинге 13, чтобы увидеть результат на рисунке 8 .
Листинг 13: openmap.properties с кнопкой удаления
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
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 # ... |
4. Вывод
В этом руководстве мы узнали о многих виджетах OpenMap, шаг за шагом добавляя их в файл openmap.properties
. Новые приложения могут быть настроены там без перекомпиляции. Компоненты BeanContextChild
определенные в openmap.components
свойств openmap.components
, автоматически соединяются MapHandler
. Определите слои, составляющие карту, используя openmap.layers
свойств openmap.layers
. LayerHandler
строит карту на основе этого списка. Вот список изученных виджетов: OpenMapFrame, LayerHandler, MouseDelegator, OMMouseMode, InformationDelegator, ToolPanel, LayersPanel, OverviewMapHandler, AddLayerPanel, MenuList, MouseModeButtonPanel,
инструменты рисования и DeleteButton
.
В следующем уроке мы углубимся во внутреннюю часть OpenMap, изучая слои.