aboutsummaryrefslogtreecommitdiff
path: root/src/org/traccar/web/client/view/MapPositionRenderer.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/traccar/web/client/view/MapPositionRenderer.java')
-rw-r--r--src/org/traccar/web/client/view/MapPositionRenderer.java114
1 files changed, 114 insertions, 0 deletions
diff --git a/src/org/traccar/web/client/view/MapPositionRenderer.java b/src/org/traccar/web/client/view/MapPositionRenderer.java
new file mode 100644
index 00000000..5a756c78
--- /dev/null
+++ b/src/org/traccar/web/client/view/MapPositionRenderer.java
@@ -0,0 +1,114 @@
+package org.traccar.web.client.view;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.gwtopenmaps.openlayers.client.Icon;
+import org.gwtopenmaps.openlayers.client.Marker;
+import org.gwtopenmaps.openlayers.client.feature.VectorFeature;
+import org.gwtopenmaps.openlayers.client.geometry.LineString;
+import org.gwtopenmaps.openlayers.client.geometry.Point;
+import org.gwtopenmaps.openlayers.client.layer.Markers;
+import org.gwtopenmaps.openlayers.client.layer.Vector;
+import org.traccar.web.shared.model.Device;
+import org.traccar.web.shared.model.Position;
+
+
+public class MapPositionRenderer {
+
+ private final MapView mapView;
+ private final Vector vectorLayer;
+ private final Markers markerLayer;
+ private final MarkerIconFactory.IconType iconType;
+
+ public MapPositionRenderer(MapView mapView, MarkerIconFactory.IconType iconType) {
+ this.mapView = mapView;
+ vectorLayer = mapView.getVectorLayer();
+ markerLayer = mapView.getMarkerLayer();
+ this.iconType = iconType;
+ }
+
+ /*
+ * TODO: a lot of mess here
+ * 1. changeMarkerIcon doesn't save new marker
+ * 2. if device selected save device instead of position
+ * 3. find way to change marker icon
+ * 4. shorter cleaner methods
+ * ... maybe something else
+ */
+
+ private void changeMarkerIcon(Marker marker, Icon icon) {
+ Marker newMarker = new Marker(marker.getLonLat(), icon);
+ markerLayer.removeMarker(marker);
+ markerLayer.addMarker(newMarker);
+ }
+
+ private Map<Long, Marker> markerMap = new HashMap<Long, Marker>(); // Position.id -> Marker
+ private Map<Long, Long> deviceMap = new HashMap<Long, Long>(); // Device.id -> Position.id
+
+ private Long selectedPositionId;
+
+ public void showPositions(List<Position> positions) {
+ for (Marker marker : markerMap.values()) {
+ markerLayer.removeMarker(marker);
+ }
+ markerMap.clear();
+ deviceMap.clear();
+
+ for (Position position : positions) {
+ Marker marker = new Marker(
+ mapView.createLonLat(position.getLongitude(), position.getLatitude()),
+ MarkerIconFactory.getIcon(iconType, false));
+ markerMap.put(position.getId(), marker);
+ deviceMap.put(position.getDevice().getId(), position.getId());
+ markerLayer.addMarker(marker);
+ }
+
+ if (selectedPositionId != null) {
+ selectPosition(null, selectedPositionId, false);
+ }
+ }
+
+ public void showTrack(List<Position> positions) {
+ vectorLayer.destroyFeatures();
+
+ if (!positions.isEmpty()) {
+ Point[] linePoints = new Point[positions.size()];
+
+ int i = 0;
+ for (Position position : positions) {
+ linePoints[i++] = mapView.createPoint(position.getLongitude(), position.getLatitude());
+ }
+
+ LineString lineString = new LineString(linePoints);
+ vectorLayer.addFeature(new VectorFeature(lineString));
+ //mapView.getMap().zoomToExtent(lineString.getBounds());
+ }
+ }
+
+ public void selectPosition(Position position, boolean center) {
+ selectPosition(selectedPositionId, position.getId(), center);
+ }
+
+ public void selectDevice(Device device, boolean center) {
+ Long positionId = (device != null) ? deviceMap.get(device.getId()) : null;
+ selectPosition(selectedPositionId, positionId, center);
+ }
+
+ private void selectPosition(Long oldPositionId, Long newPositionId, boolean center) {
+ if (oldPositionId != null && markerMap.containsKey(oldPositionId)) {
+ changeMarkerIcon(markerMap.get(oldPositionId), MarkerIconFactory.getIcon(iconType, false));
+ selectedPositionId = null;
+ }
+ if (newPositionId != null && markerMap.containsKey(newPositionId)) {
+ Marker marker = markerMap.get(newPositionId);
+ changeMarkerIcon(marker, MarkerIconFactory.getIcon(iconType, true));
+ if (center) {
+ mapView.getMap().panTo(marker.getLonLat());
+ }
+ selectedPositionId = newPositionId;
+ }
+ }
+
+}