geoMap
Основы
Объявите пространство имен maps в XML-дескрипторе экрана:
<view xmlns="http://jmix.io/schema/flowui/view"
xmlns:maps="http://jmix.io/schema/maps/ui"
title="msg://mapBasicView.title">
|
Studio автоматически добавляет пространство имен, когда вы добавляете компонент с помощью действия Add Component на верхней панели действий. См. Палитра компонентов. |
Затем добавьте элемент geoMap:
<maps:geoMap id="map"
height="100%"
width="100%"/>
Если задан атрибут id, компонент GeoMap можно инжектировать в контроллер и обращаться непосредственно к его API:
@ViewComponent
private GeoMap geoMap;
@Subscribe
public void onInit(final InitEvent event) {
geoMap.addLayer(new TileLayer()
.withSource(new OsmSource()
.withUrl("https://tile.openstreetmap.org/{z}/{x}/{y}.png")
.withOpaque(true)
.withMaxZoom(10)));
}
Слой
Компонент GeoMap может включать несколько слоев, отображающих разные типы географической информации.
Изначально карта не содержит слоев.
Дополнение Maps предоставляет следующие типы слоев:
-
TileLayer отображает предварительно отрисованные тайловые изображения, организованные по уровням масштабирования.
-
ImageLayer отображает статические изображения или изображения, полученные от Web Map Service (WMS).
-
VectorLayer отображает объекты и геометрии.
-
HeatmapLayer отображает точечные объекты в виде тепловой карты.
Описание источников, поддерживаемых каждым типом слоя, и примеры использования приведены в разделе Слои и источники.
Слой можно инжектировать в контроллер и использовать программно:
@ViewComponent("map.tile")
private TileLayer mapTile;
@Subscribe
public void onInit(final InitEvent event) {
mapTile.setSource(new XyzSource()
.withUrl("https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}"));
}
Источник
Источник содержит данные для отрисовки слоев карты. Источники предоставляют пространственную информацию, которая определяет содержимое и внешний вид слоев.
Дополнение Maps предоставляет следующие типы источников:
-
Для
ImageLayer:ImageStaticSourceиImageWmsSource. -
Для
VectorLayer:VectorSource,DataVectorSourceиClusterSource. -
Для
HeatmapLayer:HeatmapDataVectorSourceиVectorSource.
Описание источников и примеры их использования приведены в разделе Слои и источники.
В следующем примере для тайлового слоя задается OsmSource:
<maps:layers>
<maps:tile>
<maps:osmSource attributions="© Your Attribution Info"
maxZoom="34"/>
</maps:tile>
</maps:layers>
Источник можно инжектировать в контроллер и использовать программно:
@ViewComponent("map.tile.osmSource")
private OsmSource osmSource;
@Subscribe
public void onInit(final InitEvent event) {
osmSource.withUrl("https://tile.openstreetmap.org/{z}/{x}/{y}.png")
.withMaxZoom(12)
.withWrapX(false);
}
Отображение
View определяет отображение карты: ее центр, уровень масштабирования, поворот и проекцию. Таким образом задается начальное состояние карты при загрузке в пользовательском интерфейсе.
По умолчанию geoMap отображает карту мира с начальным географическим центром в точке (0,0).
<maps:mapView centerX="10.872461786203276"
centerY="48.36928140366503"
zoom="4.0"/>
Можно указать следующие дополнительные параметры:
-
centerXопределяет широту начального географического центра карты. Значение передается в объектorg.locationtech.jts.geom.Coordinate. -
centerYопределяет долготу начального географического центра карты. Значение передается в объектorg.locationtech.jts.geom.Coordinate. -
maxZoomзадает максимальный уровень масштабирования. -
minZoomзадает минимальный уровень масштабирования. -
projectionопределяет систему координат (CRS), используемую для отображения географических данных. Она преобразует трехмерные координаты Земли в двумерную плоскость. Распространенные проекции:EPSG:3857(Web Mercator) иEPSG:4326(WGS 84). По умолчанию используется EPSG:3857. Можно задать пользовательскую проекцию. -
rotationзадает поворот в радианах: положительное значение поворачивает карту по часовой стрелке, а0соответствует направлению на север. Подробнее см. setRotation. -
zoomзадает уровень масштабирования. Значение0соответствует максимальному отдалению; при приближении значение увеличивается.
Пользовательская проекция
Чтобы настроить пользовательскую проекцию, выполните следующие действия:
-
Определите бин проекции. Зарегистрируйте проекцию в Spring-конфигурации в формате PROJ.4:
@Bean public ProjectionRegistration projectionRegistration21781() { return new GeoMapProjectionRegistration("EPSG:21781", "+proj=somerc +lat_0=46.9524055555556 " + "+lon_0=7.43958333333333 " + "+k_0=1 +x_0=600000 +y_0=200000 +ellps=bessel " + "+towgs84=674.374,15.056,405.346,0,0,0,0 +units=m " + "+no_defs +type=crs"); } -
Настройте компонент карты. Укажите атрибут
projectionэлементаmapViewв XML-дескрипторе:<maps:geoMap id="geoMap" width="100%" height="100%"> <maps:mapView projection="EPSG:21781" centerX="10.872461786203276" centerY="48.36928140366503" zoom="4.0"> </maps:mapView> <maps:layers> <maps:tile> <maps:osmSource/> </maps:tile> </maps:layers> </maps:geoMap> -
Инициализируйте проекцию в контроллере. Программно примените проекцию ко всем компонентам карты на странице:
@ViewComponent private GeoMap geoMap; @Subscribe public void onInit(final InitEvent event) { geoMap.setProjection(() -> "EPSG:21781"); }Проекция применяется ко всем компонентам карты на странице. После ее установки все операции с координатами используют единицы измерения этой проекции: метры, градусы и т. д.
Охват
Охват (extent) задаёт географические границы отображения карты или определённого слоя и тем самым определяет видимую область карты.
Охват задаётся минимальными координатами нижнего левого угла и максимальными координатами верхнего правого угла в формате [minX, minY, maxX, maxY].
Выберите слой или элемент mapView на панели структуры Jmix UI либо в XML-дескрипторе экрана, нажмите Add на панели инспектора, выберите Extent и задайте атрибуты minX, minY, maxX и maxY:
<maps:mapView centerY="51.0"
centerX="40.0"
zoom="4.0">
<maps:extent minX="-15.0"
minY="30.0"
maxX="40.0"
maxY="60.0"/>
</maps:mapView>
Параметры ограничения охвата
Если для mapView задан extent, OpenLayers по умолчанию ограничивает всю область просмотра этим охватом. В адаптивных макетах карта может принудительно увеличиваться, если соотношение сторон контейнера отличается от соотношения сторон охвата.
Для настройки поведения используйте следующие атрибуты mapView:
-
showFullExtentпозволяет уменьшить масштаб настолько, чтобы показать весь заданный охват, даже если соотношение сторон контейнера отличается. Значение по умолчанию —false. -
constrainOnlyCenterприменяет ограничение охвата только к центру области просмотра, поэтому её края могут выходить за пределы охвата. Значение по умолчанию —false. -
smoothExtentConstraintприменяет ограничение плавно, допуская небольшое смещение за границу с эффектом возврата вместо жесткой остановки. Значение по умолчанию —true.
Эти атрибуты задаются при создании. Они передаются в представление OpenLayers во время инициализации и не могут изменяться во время выполнения.
<maps:geoMap id="map"
width="100%"
height="340px">
<maps:mapView centerX="7"
centerY="7"
zoom="7"
showFullExtent="true">
<maps:extent minX="5"
minY="0"
maxX="20"
maxY="15"/>
</maps:mapView>
<maps:layers>
<maps:tile>
<maps:osmSource/>
</maps:tile>
</maps:layers>
</maps:geoMap>
Обработчики
Следующие события относятся к geoMap:
|
Чтобы сгенерировать заглушку обработчика в Jmix Studio, используйте вкладку Handlers панели инспектора Jmix UI, или команду Generate Handler, доступную на верхней панели контроллера экрана и через меню Code → Generate (Alt+Insert / Cmd+N). |
| Название | Описание |
|---|---|
Возникает при щелчке по карте. Двойной щелчок вызывает это событие дважды. |
|
Возникает при двойном щелчке по карте. |
|
Возникает после завершения перемещения карты. |
|
Возникает при одиночном щелчке после того, как компонент определит, что взаимодействие не является двойным щелчком. |
|
Возникает при изменении уровня масштабирования карты. |
Компонент поддерживает следующие общие обработчики:
Элементы
geoMap может содержать один элемент mapView и обязательный элемент layers. Элемент layers может содержать слои tile, image, vector и heatmap с источниками и элементами оформления, поддерживаемыми соответствующим типом слоя.