Статьи

OpenMap Tutorial 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 свойств 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 ).

  1. В NetBeans щелкните правой кнопкой мыши пакет openmap и создайте новый класс Java. Назовите это OpenMap .
  2. Скопируйте содержимое листинга 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 ).

Листинг 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, изучая слои.

использованная литература

  1. Руководство разработчика OpenMap
  2. OpenMap Developer Советы