OSMap shows the markers of a map model and fires events when a marker is selected or dragged. Based on Leaflet by Volodymyr Agafonkin and OpenStreetMap.
Markers are added to the model of the map.
The overlaySelect event fires when a marker is clicked: click a marker.
Markers can be draggable: the markerDrag event fires when a marker is dropped. Drag a marker.
<style>
/* the map tiles follow the color scheme of the page (data-dark on html, set by the theme configurator) */
html[data-dark="true"] .leaflet-tile-pane {
filter: invert(1) hue-rotate(180deg) brightness(0.95) contrast(0.9);
}
</style>
<div class="card">
<h5>Marker usage</h5>
<p>Markers are added to the <code>model</code> of the map.</p>
<h:form id="formMarkerUsage">
<pe:osmap style="width:100%; height:500px;"
center="36.890257,30.707417"
zoom="13" model="#{markersView.simpleModel}"/>
</h:form>
</div>
<div class="card">
<h5>Marker Selection</h5>
<p>The <i>overlaySelect</i> event fires when a marker is clicked: click a marker.</p>
<h:form id="formMarkerSelection">
<p:growl id="growl" showDetail="true" showSummary="true" globalOnly="false"/>
<pe:osmap style="width:100%; height:500px;"
center="36.890257,30.707417"
zoom="13" model="#{markerSelectionView.simpleModel}">
<p:ajax event="overlaySelect" listener="#{markerSelectionView.onMarkerSelect}" update="growl"/>
</pe:osmap>
</h:form>
</div>
<div class="card">
<h5>Draggable Marker</h5>
<p>Markers can be draggable: the <i>markerDrag</i> event fires when a marker is dropped. Drag a marker.</p>
<h:form id="formDraggableMarkers">
<p:growl id="growl" showDetail="true" showSummary="true" globalOnly="false"/>
<pe:osmap style="width:100%; height:500px;"
center="36.890257,30.707417"
zoom="13" model="#{draggableMarkersView.draggableModel}">
<p:ajax event="markerDrag" listener="#{draggableMarkersView.onMarkerDrag}" update="growl"/>
</pe:osmap>
</h:form>
</div>
package org.primefaces.extensions.showcase.controller.osmap;
import java.io.Serial;
import java.io.Serializable;
import jakarta.annotation.PostConstruct;
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Named;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.MapModel;
import org.primefaces.model.map.Marker;
@Named
@RequestScoped
public class MarkersView implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private MapModel<Long> simpleModel;
@PostConstruct
public void init() {
simpleModel = new DefaultMapModel<>();
simpleModel.addOverlay(new Marker<>(new LatLng(36.879466, 30.667648), "Konyaalti", 1L));
simpleModel.addOverlay(new Marker<>(new LatLng(36.883707, 30.689216), "Ataturk Parki", 2L));
Marker marker3 = new Marker<>(new LatLng(36.879703, 30.706707), "Karaalioglu Parki", 3L,
"https://developers.google.com/maps/documentation/javascript/examples/full/images/beachflag.png");
simpleModel.addOverlay(marker3);
Marker marker4 = new Marker<>(new LatLng(36.885233, 30.702323), "Kaleici", 4L);
simpleModel.addOverlay(marker4);
}
public MapModel<Long> getSimpleModel() {
return simpleModel;
}
}
package org.primefaces.extensions.showcase.controller.osmap;
import java.io.Serializable;
import jakarta.annotation.PostConstruct;
import jakarta.faces.application.FacesMessage;
import jakarta.faces.context.FacesContext;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Named;
import org.primefaces.event.map.OverlaySelectEvent;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.MapModel;
import org.primefaces.model.map.Marker;
@Named
@ViewScoped
public class MarkerSelectionView implements Serializable {
private MapModel<Long> simpleModel;
private Marker<Long> marker;
@PostConstruct
public void init() {
simpleModel = new DefaultMapModel<>();
// Shared coordinates
LatLng coord1 = new LatLng(36.879466, 30.667648);
LatLng coord2 = new LatLng(36.883707, 30.689216);
LatLng coord3 = new LatLng(36.879703, 30.706707);
LatLng coord4 = new LatLng(36.885233, 30.702323);
// Basic marker
simpleModel.addOverlay(new Marker<>(coord1, "Konyaalti", 1L));
simpleModel.addOverlay(new Marker<>(coord2, "Ataturk Parki", 2L));
simpleModel.addOverlay(new Marker<>(coord3, "Karaalioglu Parki", 3L));
simpleModel.addOverlay(new Marker<>(coord4, "Kaleici", 4L));
}
public MapModel<Long> getSimpleModel() {
return simpleModel;
}
public void onMarkerSelect(OverlaySelectEvent<Long> event) {
marker = (Marker) event.getOverlay();
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage(FacesMessage.SEVERITY_INFO,
"Marker " + marker.getData() + " Selected", marker.getTitle()));
}
public Marker<Long> getMarker() {
return marker;
}
}
package org.primefaces.extensions.showcase.controller.osmap;
import java.io.Serializable;
import jakarta.annotation.PostConstruct;
import jakarta.faces.application.FacesMessage;
import jakarta.faces.context.FacesContext;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Named;
import org.primefaces.event.map.MarkerDragEvent;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.MapModel;
import org.primefaces.model.map.Marker;
@Named
@ViewScoped
public class DraggableMarkersView implements Serializable {
private MapModel<Long> draggableModel;
@PostConstruct
public void init() {
draggableModel = new DefaultMapModel<>();
// Shared coordinates
LatLng coord1 = new LatLng(36.879466, 30.667648);
LatLng coord2 = new LatLng(36.883707, 30.689216);
LatLng coord3 = new LatLng(36.879703, 30.706707);
LatLng coord4 = new LatLng(36.885233, 30.702323);
// Draggable
draggableModel.addOverlay(new Marker<>(coord1, "Konyaalti", 1L));
draggableModel.addOverlay(new Marker<>(coord2, "Ataturk Parki", 2L));
draggableModel.addOverlay(new Marker<>(coord3, "Karaalioglu Parki", 3L));
draggableModel.addOverlay(new Marker<>(coord4, "Kaleici", 4L));
for (Marker<Long> premarker : draggableModel.getMarkers()) {
premarker.setDraggable(true);
}
}
public MapModel<Long> getDraggableModel() {
return draggableModel;
}
public void onMarkerDrag(MarkerDragEvent<Long> event) {
Marker<Long> marker = event.getMarker();
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage(FacesMessage.SEVERITY_INFO,
"Marker " + marker.getData() + " Dragged",
"Lat:" + marker.getLatlng().getLat() + ", Lng:" + marker.getLatlng().getLng()));
}
}