mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-27 06:17:27 +00:00
start analysis factory does not load map data anymore
This commit is contained in:
1 parent
8ff59df803
commit
57e3a9639e
4 files changed
+20
-528
No files matched your search
-329
@@ -1,329 +0,0 @@
|
|||||||
package com.sap.sailing.dashboards.gwt.client.startanalysis;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import com.google.gwt.dom.client.Style.Position;
|
|
||||||
import com.google.gwt.dom.client.Style.Unit;
|
|
||||||
import com.google.gwt.maps.client.LoadApi;
|
|
||||||
import com.google.gwt.maps.client.LoadApi.LoadLibrary;
|
|
||||||
import com.google.gwt.maps.client.MapOptions;
|
|
||||||
import com.google.gwt.maps.client.MapWidget;
|
|
||||||
import com.google.gwt.maps.client.base.LatLng;
|
|
||||||
import com.google.gwt.maps.client.base.LatLngBounds;
|
|
||||||
import com.google.gwt.maps.client.controls.ControlPosition;
|
|
||||||
import com.google.gwt.maps.client.controls.MapTypeStyle;
|
|
||||||
import com.google.gwt.maps.client.controls.ScaleControlOptions;
|
|
||||||
import com.google.gwt.maps.client.maptypes.MapTypeStyleFeatureType;
|
|
||||||
import com.google.gwt.maps.client.mvc.MVCArray;
|
|
||||||
import com.google.gwt.maps.client.overlays.Polyline;
|
|
||||||
import com.google.gwt.maps.client.overlays.PolylineOptions;
|
|
||||||
import com.google.gwt.user.client.ui.AbsolutePanel;
|
|
||||||
import com.sap.sailing.dashboards.gwt.shared.dto.startanalysis.StartAnalysisCompetitorDTO;
|
|
||||||
import com.sap.sailing.dashboards.gwt.shared.dto.startanalysis.StartAnalysisDTO;
|
|
||||||
import com.sap.sailing.domain.common.dto.CompetitorDTO;
|
|
||||||
import com.sap.sailing.domain.common.dto.PositionDTO;
|
|
||||||
import com.sap.sailing.gwt.ui.client.shared.racemap.BoatOverlay;
|
|
||||||
import com.sap.sailing.gwt.ui.client.shared.racemap.CourseMarkOverlay;
|
|
||||||
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapOverlaysZIndexes;
|
|
||||||
import com.sap.sailing.gwt.ui.client.shared.racemap.TailFactory;
|
|
||||||
import com.sap.sailing.gwt.ui.shared.GPSFixDTO;
|
|
||||||
import com.sap.sailing.gwt.ui.shared.MarkDTO;
|
|
||||||
import com.sap.sailing.gwt.ui.shared.racemap.GoogleMapStyleHelper;
|
|
||||||
import com.sap.sse.common.impl.RGBColor;
|
|
||||||
|
|
||||||
public class StartAnalysisSimpleMap extends AbsolutePanel implements TailFactory {
|
|
||||||
|
|
||||||
private MapWidget map;
|
|
||||||
private StartAnalysisDTO startAnalysisDTO;
|
|
||||||
|
|
||||||
public StartAnalysisSimpleMap(int containerID, StartAnalysisDTO startAnalysisDTO) {
|
|
||||||
|
|
||||||
this.startAnalysisDTO = startAnalysisDTO;
|
|
||||||
|
|
||||||
this.getElement().getStyle().setPosition(Position.ABSOLUTE);
|
|
||||||
this.getElement().getStyle().setWidth(100, Unit.PCT);
|
|
||||||
this.getElement().getStyle().setHeight(100, Unit.PCT);
|
|
||||||
loadMapsAPIV3();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadMapsAPIV3() {
|
|
||||||
boolean sensor = true;
|
|
||||||
// load all the libs for use in the maps
|
|
||||||
ArrayList<LoadLibrary> loadLibraries = new ArrayList<LoadApi.LoadLibrary>();
|
|
||||||
loadLibraries.add(LoadLibrary.DRAWING);
|
|
||||||
loadLibraries.add(LoadLibrary.GEOMETRY);
|
|
||||||
|
|
||||||
Runnable onLoad = new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
MapOptions mapOptions = MapOptions.newInstance();
|
|
||||||
mapOptions.setScrollWheel(true);
|
|
||||||
mapOptions.setMapTypeControl(false);
|
|
||||||
mapOptions.setPanControl(false);
|
|
||||||
mapOptions.setZoomControl(false);
|
|
||||||
mapOptions.setScaleControl(true);
|
|
||||||
mapOptions.setDraggable(false);
|
|
||||||
mapOptions.setPanControl(false);
|
|
||||||
MapTypeStyle[] mapTypeStyles = new MapTypeStyle[4];
|
|
||||||
|
|
||||||
// hide all transit lines including ferry lines
|
|
||||||
mapTypeStyles[0] = GoogleMapStyleHelper.createHiddenStyle(MapTypeStyleFeatureType.TRANSIT);
|
|
||||||
// hide points of interest
|
|
||||||
mapTypeStyles[1] = GoogleMapStyleHelper.createHiddenStyle(MapTypeStyleFeatureType.POI);
|
|
||||||
// simplify road display
|
|
||||||
mapTypeStyles[2] = GoogleMapStyleHelper.createSimplifiedStyle(MapTypeStyleFeatureType.ROAD);
|
|
||||||
// set water color
|
|
||||||
mapTypeStyles[3] = GoogleMapStyleHelper.createColorStyle(MapTypeStyleFeatureType.WATER, new RGBColor(0,
|
|
||||||
136, 255), -35, -34);
|
|
||||||
|
|
||||||
mapOptions.setMapTypeStyles(mapTypeStyles);
|
|
||||||
ScaleControlOptions scaleControlOptions = ScaleControlOptions.newInstance();
|
|
||||||
scaleControlOptions.setPosition(ControlPosition.BOTTOM_RIGHT);
|
|
||||||
mapOptions.setScaleControlOptions(scaleControlOptions);
|
|
||||||
mapOptions.setStreetViewControl(false);
|
|
||||||
map = new MapWidget(mapOptions);
|
|
||||||
StartAnalysisSimpleMap.this.add(map, 0, 0);
|
|
||||||
map.setSize("100%", "100%");
|
|
||||||
map.getElement().getStyle().setBackgroundColor("#4293DB");
|
|
||||||
map.triggerResize();
|
|
||||||
drawStartLine(startAnalysisDTO.startLineMarks);
|
|
||||||
drawLinesFromStartLineToFirstMark(startAnalysisDTO.startLineMarks, startAnalysisDTO.firstMark);
|
|
||||||
drawStartlineMarks(startAnalysisDTO.startLineMarks);
|
|
||||||
drawFirstMark(startAnalysisDTO.firstMark);
|
|
||||||
drawTails(createGPSFixesForCompetitors(startAnalysisDTO));
|
|
||||||
drawBoats(createGPSPositionForCompetitors(startAnalysisDTO));
|
|
||||||
zoomMapToNewBounds(calculateNewBounds(startAnalysisDTO.startLineMarkPositions));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
LoadApi.go(onLoad, loadLibraries, sensor);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Map<CompetitorDTO, List<GPSFixDTO>> createGPSFixesForCompetitors(StartAnalysisDTO startAnalysisDTO) {
|
|
||||||
|
|
||||||
Map<CompetitorDTO, List<GPSFixDTO>> gpsFixesForCompetitors = new HashMap<CompetitorDTO, List<GPSFixDTO>>();
|
|
||||||
for (StartAnalysisCompetitorDTO startAnalysisCompetitorDTO : startAnalysisDTO.startAnalysisCompetitorDTOs) {
|
|
||||||
if (startAnalysisCompetitorDTO.gpsFixDTOs != null && !startAnalysisCompetitorDTO.gpsFixDTOs.isEmpty()) {
|
|
||||||
gpsFixesForCompetitors.put(startAnalysisCompetitorDTO.competitorDTO,
|
|
||||||
startAnalysisCompetitorDTO.gpsFixDTOs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return gpsFixesForCompetitors;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Map<CompetitorDTO, GPSFixDTO> createGPSPositionForCompetitors(StartAnalysisDTO startAnalysisDTO) {
|
|
||||||
Map<CompetitorDTO, GPSFixDTO> gpsPositionForCompetitors = new HashMap<CompetitorDTO, GPSFixDTO>();
|
|
||||||
for (StartAnalysisCompetitorDTO startAnalysisCompetitorDTO : startAnalysisDTO.startAnalysisCompetitorDTOs) {
|
|
||||||
if (startAnalysisCompetitorDTO.gpsFixDTOs != null && !startAnalysisCompetitorDTO.gpsFixDTOs.isEmpty()) {
|
|
||||||
gpsPositionForCompetitors.put(startAnalysisCompetitorDTO.competitorDTO,
|
|
||||||
startAnalysisCompetitorDTO.gpsFixDTOs.get(startAnalysisCompetitorDTO.gpsFixDTOs.size() - 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return gpsPositionForCompetitors;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void drawStartLine(List<MarkDTO> startlineMarks) {
|
|
||||||
if (map != null && startlineMarks != null) {
|
|
||||||
|
|
||||||
if (startlineMarks.size() == 2) {
|
|
||||||
LatLng startLinePoint1 = LatLng.newInstance(startlineMarks.get(0).position.latDeg,
|
|
||||||
startlineMarks.get(0).position.lngDeg);
|
|
||||||
LatLng startLinePoint2 = LatLng.newInstance(startlineMarks.get(1).position.latDeg,
|
|
||||||
startlineMarks.get(1).position.lngDeg);
|
|
||||||
|
|
||||||
PolylineOptions options = PolylineOptions.newInstance();
|
|
||||||
options.setGeodesic(true);
|
|
||||||
options.setStrokeColor("#FFFFFF");
|
|
||||||
options.setStrokeWeight(2);
|
|
||||||
options.setStrokeOpacity(1.0);
|
|
||||||
|
|
||||||
MVCArray<LatLng> pointsAsArray = MVCArray.newInstance();
|
|
||||||
pointsAsArray.insertAt(0, startLinePoint1);
|
|
||||||
pointsAsArray.insertAt(1, startLinePoint2);
|
|
||||||
|
|
||||||
Polyline startLine = Polyline.newInstance(options);
|
|
||||||
startLine.setPath(pointsAsArray);
|
|
||||||
|
|
||||||
startLine.setMap(map);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void drawLinesFromStartLineToFirstMark(List<MarkDTO> startlineMarks, MarkDTO firstMark) {
|
|
||||||
if (map != null && startlineMarks != null && firstMark != null) {
|
|
||||||
if (startlineMarks.size() == 2) {
|
|
||||||
LatLng startLinePoint1 = LatLng.newInstance(startlineMarks.get(0).position.latDeg,
|
|
||||||
startlineMarks.get(0).position.lngDeg);
|
|
||||||
LatLng startLinePoint2 = LatLng.newInstance(startlineMarks.get(1).position.latDeg,
|
|
||||||
startlineMarks.get(1).position.lngDeg);
|
|
||||||
LatLng firstMarkPoint = LatLng.newInstance(firstMark.position.latDeg, firstMark.position.lngDeg);
|
|
||||||
|
|
||||||
PolylineOptions options = PolylineOptions.newInstance();
|
|
||||||
options.setGeodesic(true);
|
|
||||||
options.setStrokeColor("#A3A3A3");
|
|
||||||
options.setStrokeWeight(2);
|
|
||||||
options.setStrokeOpacity(1.0);
|
|
||||||
|
|
||||||
MVCArray<LatLng> pointsAsArray1 = MVCArray.newInstance();
|
|
||||||
pointsAsArray1.insertAt(0, startLinePoint1);
|
|
||||||
pointsAsArray1.insertAt(1, firstMarkPoint);
|
|
||||||
|
|
||||||
MVCArray<LatLng> pointsAsArray2 = MVCArray.newInstance();
|
|
||||||
pointsAsArray2.insertAt(0, startLinePoint2);
|
|
||||||
pointsAsArray2.insertAt(1, firstMarkPoint);
|
|
||||||
|
|
||||||
Polyline startMarkFirstMark1 = Polyline.newInstance(options);
|
|
||||||
Polyline startMarkFirstMark2 = Polyline.newInstance(options);
|
|
||||||
|
|
||||||
startMarkFirstMark1.setPath(pointsAsArray1);
|
|
||||||
startMarkFirstMark2.setPath(pointsAsArray2);
|
|
||||||
|
|
||||||
startMarkFirstMark1.setMap(map);
|
|
||||||
startMarkFirstMark2.setMap(map);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void drawStartlineMarks(List<MarkDTO> startlineMarks) {
|
|
||||||
if (map != null) {
|
|
||||||
for (MarkDTO markDTO : startlineMarks) {
|
|
||||||
CourseMarkOverlay courseMarkOverlay = createCourseMarkOverlay(
|
|
||||||
RaceMapOverlaysZIndexes.COURSEMARK_ZINDEX, markDTO);
|
|
||||||
courseMarkOverlay.addToMap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void drawFirstMark(MarkDTO firstMark) {
|
|
||||||
CourseMarkOverlay courseMarkOverlay = createCourseMarkOverlay(RaceMapOverlaysZIndexes.COURSEMARK_ZINDEX,
|
|
||||||
firstMark);
|
|
||||||
courseMarkOverlay.addToMap();
|
|
||||||
}
|
|
||||||
|
|
||||||
private CourseMarkOverlay createCourseMarkOverlay(int zIndex, final MarkDTO markDTO) {
|
|
||||||
markDTO.position.latDeg = markDTO.position.latDeg;
|
|
||||||
final CourseMarkOverlay courseMarkOverlay = new CourseMarkOverlay(map, zIndex, markDTO);
|
|
||||||
return courseMarkOverlay;
|
|
||||||
}
|
|
||||||
|
|
||||||
private LatLngBounds calculateNewBounds(List<PositionDTO> startLinePositions) {
|
|
||||||
LatLngBounds newBounds = null;
|
|
||||||
List<PositionDTO> newStartLinePositionDTOs = new ArrayList<PositionDTO>(startLinePositions);
|
|
||||||
Iterable<PositionDTO> positionsToZoom = newStartLinePositionDTOs;
|
|
||||||
|
|
||||||
if (positionsToZoom != null) {
|
|
||||||
for (PositionDTO position : positionsToZoom) {
|
|
||||||
PositionDTO positionMoovedToNorth = position;
|
|
||||||
positionMoovedToNorth.latDeg = positionMoovedToNorth.latDeg - 0.0009;
|
|
||||||
|
|
||||||
LatLng markLatLng = LatLng.newInstance(positionMoovedToNorth.latDeg, positionMoovedToNorth.lngDeg);
|
|
||||||
LatLngBounds bounds = LatLngBounds.newInstance(markLatLng, markLatLng);
|
|
||||||
if (newBounds == null) {
|
|
||||||
newBounds = bounds;
|
|
||||||
} else {
|
|
||||||
newBounds.extend(markLatLng);
|
|
||||||
}
|
|
||||||
markLatLng = null;
|
|
||||||
position = null;
|
|
||||||
positionMoovedToNorth.latDeg = positionMoovedToNorth.latDeg + 0.0009;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// }
|
|
||||||
positionsToZoom = null;
|
|
||||||
return newBounds;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void zoomMapToNewBounds(LatLngBounds newBounds) {
|
|
||||||
if (newBounds != null) {
|
|
||||||
map.setCenter(newBounds.getCenter());
|
|
||||||
map.setZoom(17);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void drawBoats(Map<CompetitorDTO, GPSFixDTO> competitorAndLastFix) {
|
|
||||||
|
|
||||||
Set<CompetitorDTO> competitors = competitorAndLastFix.keySet();
|
|
||||||
|
|
||||||
for (CompetitorDTO competitorDTO : competitors) {
|
|
||||||
BoatOverlay boatOverlay = createBoatOverlay(RaceMapOverlaysZIndexes.BOATS_ZINDEX, competitorDTO, false);
|
|
||||||
boatOverlay.setSelected(false);
|
|
||||||
boatOverlay.setBoatFix(competitorAndLastFix.get(competitorDTO), 10);
|
|
||||||
boatOverlay.addToMap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private BoatOverlay createBoatOverlay(int zIndex, final CompetitorDTO competitorDTO, boolean highlighted) {
|
|
||||||
final BoatOverlay boatCanvas = new BoatOverlay(map, zIndex, competitorDTO, competitorDTO.getColor());
|
|
||||||
boatCanvas.setSelected(false);
|
|
||||||
return boatCanvas;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void drawTails(Map<CompetitorDTO, List<GPSFixDTO>> competitorFixes) {
|
|
||||||
|
|
||||||
Set<CompetitorDTO> competitors = competitorFixes.keySet();
|
|
||||||
for (CompetitorDTO competitor : competitors) {
|
|
||||||
Polyline competitorPolyline = createPolylineFromGPSFixDTOs(competitor, competitorFixes.get(competitor));
|
|
||||||
competitorPolyline.setMap(map);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private Polyline createPolylineFromGPSFixDTOs(CompetitorDTO competitorDTO, List<GPSFixDTO> fixes) {
|
|
||||||
List<LatLng> points = new ArrayList<LatLng>();
|
|
||||||
int indexOfFirst = -1;
|
|
||||||
int indexOfLast = -1;
|
|
||||||
int i = 0;
|
|
||||||
for (Iterator<GPSFixDTO> fixIter = fixes.iterator(); fixIter.hasNext() && indexOfLast == -1;) {
|
|
||||||
GPSFixDTO fix = fixIter.next();
|
|
||||||
if (!fix.timepoint.before(fixes.get(fixes.size() - 1).timepoint)) {
|
|
||||||
indexOfLast = i - 1;
|
|
||||||
} else {
|
|
||||||
LatLng point = null;
|
|
||||||
if (indexOfFirst == -1) {
|
|
||||||
if (!fix.timepoint.before(fixes.get(0).timepoint)) {
|
|
||||||
indexOfFirst = i;
|
|
||||||
point = LatLng.newInstance(fix.position.latDeg, fix.position.lngDeg);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
point = LatLng.newInstance(fix.position.latDeg, fix.position.lngDeg);
|
|
||||||
}
|
|
||||||
if (point != null) {
|
|
||||||
points.add(point);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if (indexOfLast == -1) {
|
|
||||||
indexOfLast = i - 1;
|
|
||||||
}
|
|
||||||
Polyline result = createTail(competitorDTO, points);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Polyline createTail(CompetitorDTO competitor, List<LatLng> points) {
|
|
||||||
PolylineOptions options = createTailStyle(competitor, false);
|
|
||||||
Polyline result = Polyline.newInstance(options);
|
|
||||||
|
|
||||||
MVCArray<LatLng> pointsAsArray = MVCArray.newInstance(points.toArray(new LatLng[0]));
|
|
||||||
result.setPath(pointsAsArray);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PolylineOptions createTailStyle(CompetitorDTO competitor, boolean isHighlighted) {
|
|
||||||
PolylineOptions options = PolylineOptions.newInstance();
|
|
||||||
options.setClickable(true);
|
|
||||||
options.setGeodesic(true);
|
|
||||||
options.setStrokeOpacity(1.0);
|
|
||||||
options.setStrokeColor(competitor.getColor().getAsHtml());
|
|
||||||
options.setStrokeWeight(1);
|
|
||||||
options.setZindex(RaceMapOverlaysZIndexes.BOATTAILS_ZINDEX);
|
|
||||||
return options;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+2
-185
@@ -2,10 +2,8 @@ package com.sap.sailing.dashboards.gwt.server.startanalysis;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
@@ -16,27 +14,15 @@ import com.sap.sailing.dashboards.gwt.shared.dto.startanalysis.StartAnalysisDTO;
|
|||||||
import com.sap.sailing.dashboards.gwt.shared.dto.startanalysis.StartAnalysisRankingTableEntryDTO;
|
import com.sap.sailing.dashboards.gwt.shared.dto.startanalysis.StartAnalysisRankingTableEntryDTO;
|
||||||
import com.sap.sailing.dashboards.gwt.shared.dto.startanalysis.WindAndAdvantagesInfoForStartLineDTO;
|
import com.sap.sailing.dashboards.gwt.shared.dto.startanalysis.WindAndAdvantagesInfoForStartLineDTO;
|
||||||
import com.sap.sailing.domain.base.Competitor;
|
import com.sap.sailing.domain.base.Competitor;
|
||||||
import com.sap.sailing.domain.base.Mark;
|
|
||||||
import com.sap.sailing.domain.base.Waypoint;
|
import com.sap.sailing.domain.base.Waypoint;
|
||||||
import com.sap.sailing.domain.common.LegType;
|
import com.sap.sailing.domain.common.LegType;
|
||||||
import com.sap.sailing.domain.common.NoWindException;
|
import com.sap.sailing.domain.common.NoWindException;
|
||||||
import com.sap.sailing.domain.common.Position;
|
import com.sap.sailing.domain.common.Position;
|
||||||
import com.sap.sailing.domain.common.SpeedWithBearing;
|
|
||||||
import com.sap.sailing.domain.common.Tack;
|
|
||||||
import com.sap.sailing.domain.common.dto.CompetitorDTO;
|
|
||||||
import com.sap.sailing.domain.common.dto.PositionDTO;
|
|
||||||
import com.sap.sailing.domain.tracking.GPSFix;
|
|
||||||
import com.sap.sailing.domain.tracking.GPSFixMoving;
|
|
||||||
import com.sap.sailing.domain.tracking.GPSFixTrack;
|
|
||||||
import com.sap.sailing.domain.tracking.LineDetails;
|
import com.sap.sailing.domain.tracking.LineDetails;
|
||||||
import com.sap.sailing.domain.tracking.MarkPassing;
|
import com.sap.sailing.domain.tracking.MarkPassing;
|
||||||
import com.sap.sailing.domain.tracking.TrackedLeg;
|
import com.sap.sailing.domain.tracking.TrackedLeg;
|
||||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||||
import com.sap.sailing.domain.tracking.Wind;
|
import com.sap.sailing.domain.tracking.Wind;
|
||||||
import com.sap.sailing.gwt.ui.shared.GPSFixDTO;
|
|
||||||
import com.sap.sailing.gwt.ui.shared.MarkDTO;
|
|
||||||
import com.sap.sailing.gwt.ui.shared.SpeedWithBearingDTO;
|
|
||||||
import com.sap.sailing.gwt.ui.shared.WindDTO;
|
|
||||||
import com.sap.sailing.server.RacingEventService;
|
import com.sap.sailing.server.RacingEventService;
|
||||||
import com.sap.sse.common.TimePoint;
|
import com.sap.sse.common.TimePoint;
|
||||||
import com.sap.sse.common.impl.MillisecondsTimePoint;
|
import com.sap.sse.common.impl.MillisecondsTimePoint;
|
||||||
@@ -46,7 +32,6 @@ public class StartAnalysisDTOFactory extends AbstractStartAnalysisCreationValida
|
|||||||
private final com.sap.sailing.domain.base.DomainFactory baseDomainFactory;
|
private final com.sap.sailing.domain.base.DomainFactory baseDomainFactory;
|
||||||
|
|
||||||
private static int MINIMUM_NUMBER_COMPETITORS_FOR_STARTANALYSIS = 3;
|
private static int MINIMUM_NUMBER_COMPETITORS_FOR_STARTANALYSIS = 3;
|
||||||
private final int TAILLENGHT_IN_MILLISECONDS = 200000;
|
|
||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(StartAnalysisDTOFactory.class.getName());
|
private static final Logger logger = Logger.getLogger(StartAnalysisDTOFactory.class.getName());
|
||||||
|
|
||||||
@@ -75,6 +60,8 @@ public class StartAnalysisDTOFactory extends AbstractStartAnalysisCreationValida
|
|||||||
}
|
}
|
||||||
startAnalysisDTO.competitor = baseDomainFactory.getCompetitorStore().convertToCompetitorDTO(competitor);
|
startAnalysisDTO.competitor = baseDomainFactory.getCompetitorStore().convertToCompetitorDTO(competitor);
|
||||||
startAnalysisDTO.startAnalysisCompetitorDTOs = competitors;
|
startAnalysisDTO.startAnalysisCompetitorDTOs = competitors;
|
||||||
|
startAnalysisDTO.timeOfStartInMilliSeconds = trackedRace.getStartOfRace().asMillis();
|
||||||
|
startAnalysisDTO.regattaAndRaceIdentifier = trackedRace.getRaceIdentifier();
|
||||||
logger.log(Level.INFO, "Created StartAnalysis For Competitor "+competitor.getName()+" and "+trackedRace.getRace().getName());
|
logger.log(Level.INFO, "Created StartAnalysis For Competitor "+competitor.getName()+" and "+trackedRace.getRace().getName());
|
||||||
return startAnalysisDTO;
|
return startAnalysisDTO;
|
||||||
}
|
}
|
||||||
@@ -101,26 +88,10 @@ public class StartAnalysisDTOFactory extends AbstractStartAnalysisCreationValida
|
|||||||
|
|
||||||
private StartAnalysisDTO addStaticDataToStartAnalysisDTOFrom(StartAnalysisDTO startAnalysisDTO,TrackedRace trackedRace) {
|
private StartAnalysisDTO addStaticDataToStartAnalysisDTOFrom(StartAnalysisDTO startAnalysisDTO,TrackedRace trackedRace) {
|
||||||
startAnalysisDTO.raceName = trackedRace.getRace().getName();
|
startAnalysisDTO.raceName = trackedRace.getRace().getName();
|
||||||
startAnalysisDTO.startLineMarkPositions = getStartLineBoyPositions(trackedRace);
|
|
||||||
startAnalysisDTO.firstMark = getMarksOfWayPoint(trackedRace, getFirstMarkWayPoint(trackedRace)).get(0);
|
|
||||||
startAnalysisDTO.startAnalysisWindLineInfoDTO = createStartAnalysisWindAndLineData(trackedRace);
|
startAnalysisDTO.startAnalysisWindLineInfoDTO = createStartAnalysisWindAndLineData(trackedRace);
|
||||||
startAnalysisDTO.startLineMarks = getMarksOfWayPoint(trackedRace,
|
|
||||||
trackedRace.getStartLine(trackedRace.getStartTimeReceived()).getWaypoint());
|
|
||||||
return startAnalysisDTO;
|
return startAnalysisDTO;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<String, Date> createPerCompetitorIdAsString(TrackedRace currentRace, Date fiveSecondsBeforeStart) {
|
|
||||||
Map<String, Date> fromPerCompetitorIdAsString = new HashMap<String, Date>();
|
|
||||||
try {
|
|
||||||
for (Competitor competitor : currentRace.getCompetitorsFromBestToWorst(new MillisecondsTimePoint(new Date()
|
|
||||||
.getTime()))) {
|
|
||||||
fromPerCompetitorIdAsString.put(competitor.getId().toString(), fiveSecondsBeforeStart);
|
|
||||||
}
|
|
||||||
} catch (NoWindException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return fromPerCompetitorIdAsString;
|
|
||||||
}
|
|
||||||
|
|
||||||
private StartAnalysisRankingTableEntryDTO createRankTableEntry(TrackedRace trackedRace, int rank,
|
private StartAnalysisRankingTableEntryDTO createRankTableEntry(TrackedRace trackedRace, int rank,
|
||||||
Competitor competitor) {
|
Competitor competitor) {
|
||||||
@@ -140,66 +111,6 @@ public class StartAnalysisDTOFactory extends AbstractStartAnalysisCreationValida
|
|||||||
return tableentry;
|
return tableentry;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<PositionDTO> getStartLineBoyPositions(TrackedRace trackedRace) {
|
|
||||||
return getMarkPositionDTOs(trackedRace.getStartTimeReceived(), trackedRace, trackedRace.getRace().getCourse()
|
|
||||||
.getFirstWaypoint());
|
|
||||||
}
|
|
||||||
|
|
||||||
private Waypoint getFirstMarkWayPoint(TrackedRace trackedRace) {
|
|
||||||
Waypoint firstMarkWayPoint = null;
|
|
||||||
Iterator<Waypoint> waypoints = trackedRace.getRace().getCourse().getWaypoints().iterator();
|
|
||||||
int wayPointCounter = 0;
|
|
||||||
while (waypoints.hasNext()) {
|
|
||||||
Waypoint wayPoint = waypoints.next();
|
|
||||||
if (wayPointCounter == 1) {
|
|
||||||
return wayPoint;
|
|
||||||
}
|
|
||||||
wayPointCounter++;
|
|
||||||
}
|
|
||||||
return firstMarkWayPoint;
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<PositionDTO> getMarkPositionDTOs(TimePoint timePoint, TrackedRace trackedRace, Waypoint waypoint) {
|
|
||||||
|
|
||||||
List<PositionDTO> markPositionDTOs = new ArrayList<PositionDTO>();
|
|
||||||
for (Mark startMark : waypoint.getMarks()) {
|
|
||||||
final Position estimatedMarkPosition = trackedRace.getOrCreateTrack(startMark).getEstimatedPosition(
|
|
||||||
timePoint, /* extrapolate */false);
|
|
||||||
if (estimatedMarkPosition != null) {
|
|
||||||
markPositionDTOs.add(new PositionDTO(estimatedMarkPosition.getLatDeg(), estimatedMarkPosition
|
|
||||||
.getLngDeg()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return markPositionDTOs;
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<MarkDTO> getMarksOfWayPoint(TrackedRace trackedRace, Waypoint wayPoint) {
|
|
||||||
List<MarkDTO> startLineMarks = new ArrayList<MarkDTO>();
|
|
||||||
for (Mark startMark : wayPoint.getMarks()) {
|
|
||||||
final Position estimatedMarkPosition = trackedRace.getOrCreateTrack(startMark).getEstimatedPosition(
|
|
||||||
trackedRace.getStartTimeReceived(), /* extrapolate */false);
|
|
||||||
if (estimatedMarkPosition != null) {
|
|
||||||
startLineMarks.add(convertToMarkDTO(startMark, estimatedMarkPosition));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return startLineMarks;
|
|
||||||
}
|
|
||||||
|
|
||||||
private MarkDTO convertToMarkDTO(Mark mark, Position position) {
|
|
||||||
MarkDTO markDTO;
|
|
||||||
if (position != null) {
|
|
||||||
markDTO = new MarkDTO(mark.getId().toString(), mark.getName(), position.getLatDeg(), position.getLngDeg());
|
|
||||||
} else {
|
|
||||||
markDTO = new MarkDTO(mark.getId().toString(), mark.getName());
|
|
||||||
}
|
|
||||||
markDTO.color = mark.getColor();
|
|
||||||
markDTO.shape = mark.getShape();
|
|
||||||
markDTO.pattern = mark.getPattern();
|
|
||||||
markDTO.type = mark.getType();
|
|
||||||
|
|
||||||
return markDTO;
|
|
||||||
}
|
|
||||||
|
|
||||||
private WindAndAdvantagesInfoForStartLineDTO createStartAnalysisWindAndLineData(TrackedRace trackedRace) {
|
private WindAndAdvantagesInfoForStartLineDTO createStartAnalysisWindAndLineData(TrackedRace trackedRace) {
|
||||||
WindAndAdvantagesInfoForStartLineDTO startAnalysisWindLineInfoDTO = new WindAndAdvantagesInfoForStartLineDTO();
|
WindAndAdvantagesInfoForStartLineDTO startAnalysisWindLineInfoDTO = new WindAndAdvantagesInfoForStartLineDTO();
|
||||||
LineDetails startline = trackedRace.getStartLine(trackedRace.getStartTimeReceived());
|
LineDetails startline = trackedRace.getStartLine(trackedRace.getStartTimeReceived());
|
||||||
@@ -235,87 +146,6 @@ public class StartAnalysisDTOFactory extends AbstractStartAnalysisCreationValida
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<String, List<GPSFixDTO>> getGPSFixDTOListForCompetitorName(TrackedRace trackedRace,
|
|
||||||
Map<String, Date> fromPerCompetitorIdAsString, Map<String, Date> toPerCompetitorIdAsString,
|
|
||||||
boolean extrapolate) throws NoWindException {
|
|
||||||
Map<String, List<GPSFixDTO>> result = new HashMap<String, List<GPSFixDTO>>();
|
|
||||||
if (trackedRace != null) {
|
|
||||||
for (Competitor competitor : trackedRace.getRace().getCompetitors()) {
|
|
||||||
if (fromPerCompetitorIdAsString.containsKey(competitor.getId().toString())) {
|
|
||||||
CompetitorDTO competitorDTO = baseDomainFactory.convertToCompetitorDTO(competitor);
|
|
||||||
List<GPSFixDTO> fixesForCompetitor = new ArrayList<GPSFixDTO>();
|
|
||||||
result.put(competitorDTO.getName(), fixesForCompetitor);
|
|
||||||
GPSFixTrack<Competitor, GPSFixMoving> track = trackedRace.getTrack(competitor);
|
|
||||||
TimePoint fromTimePoint = new MillisecondsTimePoint(fromPerCompetitorIdAsString.get(competitorDTO
|
|
||||||
.getIdAsString()));
|
|
||||||
TimePoint toTimePoint = new MillisecondsTimePoint(toPerCompetitorIdAsString.get(competitorDTO
|
|
||||||
.getIdAsString()));
|
|
||||||
// copy the fixes into a list while holding the monitor;
|
|
||||||
// then release the monitor to avoid deadlocks
|
|
||||||
// during wind estimations required for tack determination
|
|
||||||
List<GPSFixMoving> fixes = new ArrayList<GPSFixMoving>();
|
|
||||||
track.lockForRead();
|
|
||||||
try {
|
|
||||||
Iterator<GPSFixMoving> fixIter = track.getFixesIterator(fromTimePoint, /* inclusive */
|
|
||||||
true);
|
|
||||||
while (fixIter.hasNext()) {
|
|
||||||
GPSFixMoving fix = fixIter.next();
|
|
||||||
if (fix.getTimePoint().after(fromTimePoint) && fix.getTimePoint().before(toTimePoint)) {
|
|
||||||
fixes.add(fix);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
track.unlockAfterRead();
|
|
||||||
}
|
|
||||||
|
|
||||||
Iterator<GPSFixMoving> fixIter = fixes.iterator();
|
|
||||||
while (fixIter.hasNext()) {
|
|
||||||
GPSFixMoving fix = fixIter.next();
|
|
||||||
Wind wind = trackedRace.getWind(fix.getPosition(), toTimePoint);
|
|
||||||
final SpeedWithBearing estimatedSpeed = track.getEstimatedSpeed(fix.getTimePoint());
|
|
||||||
Tack tack = wind == null ? null : trackedRace.getTack(estimatedSpeed, wind, fix.getTimePoint());
|
|
||||||
LegType legType = null;
|
|
||||||
WindDTO windDTO = wind == null ? null : createWindDTOFromAlreadyAveraged(wind, toTimePoint);
|
|
||||||
GPSFixDTO fixDTO = createGPSFixDTO(fix, estimatedSpeed, windDTO, tack, legType, /* extrapolate */
|
|
||||||
false);
|
|
||||||
fixesForCompetitor.add(fixDTO);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected WindDTO createWindDTOFromAlreadyAveraged(Wind wind, TimePoint requestTimepoint) {
|
|
||||||
WindDTO windDTO = new WindDTO();
|
|
||||||
windDTO.requestTimepoint = requestTimepoint.asMillis();
|
|
||||||
windDTO.trueWindBearingDeg = wind.getBearing().getDegrees();
|
|
||||||
windDTO.trueWindFromDeg = wind.getBearing().reverse().getDegrees();
|
|
||||||
windDTO.trueWindSpeedInKnots = wind.getKnots();
|
|
||||||
windDTO.trueWindSpeedInMetersPerSecond = wind.getMetersPerSecond();
|
|
||||||
windDTO.dampenedTrueWindBearingDeg = wind.getBearing().getDegrees();
|
|
||||||
windDTO.dampenedTrueWindFromDeg = wind.getBearing().reverse().getDegrees();
|
|
||||||
windDTO.dampenedTrueWindSpeedInKnots = wind.getKnots();
|
|
||||||
windDTO.dampenedTrueWindSpeedInMetersPerSecond = wind.getMetersPerSecond();
|
|
||||||
if (wind.getPosition() != null) {
|
|
||||||
windDTO.position = new PositionDTO(wind.getPosition().getLatDeg(), wind.getPosition().getLngDeg());
|
|
||||||
}
|
|
||||||
if (wind.getTimePoint() != null) {
|
|
||||||
windDTO.measureTimepoint = wind.getTimePoint().asMillis();
|
|
||||||
}
|
|
||||||
return windDTO;
|
|
||||||
}
|
|
||||||
|
|
||||||
private SpeedWithBearingDTO createSpeedWithBearingDTO(SpeedWithBearing speedWithBearing) {
|
|
||||||
return new SpeedWithBearingDTO(speedWithBearing.getKnots(), speedWithBearing.getBearing().getDegrees());
|
|
||||||
}
|
|
||||||
|
|
||||||
private GPSFixDTO createGPSFixDTO(GPSFix fix, SpeedWithBearing speedWithBearing, WindDTO windDTO, Tack tack,
|
|
||||||
LegType legType, boolean extrapolated) {
|
|
||||||
return new GPSFixDTO(fix.getTimePoint().asDate(), fix.getPosition() == null ? null : new PositionDTO(fix
|
|
||||||
.getPosition().getLatDeg(), fix.getPosition().getLngDeg()), speedWithBearing == null ? null
|
|
||||||
: createSpeedWithBearingDTO(speedWithBearing), windDTO, tack, legType, extrapolated);
|
|
||||||
}
|
|
||||||
|
|
||||||
private LegType getFirstLegTypeOfTrackedRaceAtTimePoint(TrackedRace trackedRace, TimePoint timePoint)
|
private LegType getFirstLegTypeOfTrackedRaceAtTimePoint(TrackedRace trackedRace, TimePoint timePoint)
|
||||||
throws NoWindException {
|
throws NoWindException {
|
||||||
@@ -333,19 +163,6 @@ public class StartAnalysisDTOFactory extends AbstractStartAnalysisCreationValida
|
|||||||
StartAnalysisCompetitorDTO startAnalysisCompetitorDTOsForRace = new StartAnalysisCompetitorDTO();
|
StartAnalysisCompetitorDTO startAnalysisCompetitorDTOsForRace = new StartAnalysisCompetitorDTO();
|
||||||
startAnalysisCompetitorDTOsForRace.competitorDTO = baseDomainFactory.getCompetitorStore().convertToCompetitorDTO(competitor);
|
startAnalysisCompetitorDTOsForRace.competitorDTO = baseDomainFactory.getCompetitorStore().convertToCompetitorDTO(competitor);
|
||||||
startAnalysisCompetitorDTOsForRace.rankingTableEntryDTO = createRankTableEntry(trackedRace, rank, competitor);
|
startAnalysisCompetitorDTOsForRace.rankingTableEntryDTO = createRankTableEntry(trackedRace, rank, competitor);
|
||||||
List<GPSFixDTO> boatPositions = getOrCreateGPSFixDTOsForCompetitorForTrackedRace(trackedRace).get(
|
|
||||||
competitor.getName());
|
|
||||||
startAnalysisCompetitorDTOsForRace.gpsFixDTOs = boatPositions;
|
|
||||||
return startAnalysisCompetitorDTOsForRace;
|
return startAnalysisCompetitorDTOsForRace;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<String, List<GPSFixDTO>> getOrCreateGPSFixDTOsForCompetitorForTrackedRace(TrackedRace trackedRace) {
|
|
||||||
try {
|
|
||||||
return getGPSFixDTOListForCompetitorName(trackedRace, createPerCompetitorIdAsString(trackedRace, new Date(trackedRace.getStartTimeReceived()
|
|
||||||
.asMillis() - TAILLENGHT_IN_MILLISECONDS)), createPerCompetitorIdAsString(trackedRace, new Date(trackedRace.getStartTimeReceived()
|
|
||||||
.asMillis())), true);
|
|
||||||
} catch (NoWindException e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
-3
@@ -1,10 +1,8 @@
|
|||||||
package com.sap.sailing.dashboards.gwt.shared.dto.startanalysis;
|
package com.sap.sailing.dashboards.gwt.shared.dto.startanalysis;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import com.sap.sailing.domain.common.dto.CompetitorDTO;
|
import com.sap.sailing.domain.common.dto.CompetitorDTO;
|
||||||
import com.sap.sailing.gwt.ui.shared.GPSFixDTO;
|
|
||||||
|
|
||||||
public class StartAnalysisCompetitorDTO implements Serializable{
|
public class StartAnalysisCompetitorDTO implements Serializable{
|
||||||
|
|
||||||
@@ -12,5 +10,4 @@ public class StartAnalysisCompetitorDTO implements Serializable{
|
|||||||
|
|
||||||
public CompetitorDTO competitorDTO;
|
public CompetitorDTO competitorDTO;
|
||||||
public StartAnalysisRankingTableEntryDTO rankingTableEntryDTO;
|
public StartAnalysisRankingTableEntryDTO rankingTableEntryDTO;
|
||||||
public List<GPSFixDTO> gpsFixDTOs;
|
|
||||||
}
|
}
|
||||||
+18
-11
@@ -1,29 +1,36 @@
|
|||||||
package com.sap.sailing.dashboards.gwt.shared.dto.startanalysis;
|
package com.sap.sailing.dashboards.gwt.shared.dto.startanalysis;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.sap.sailing.domain.common.RegattaAndRaceIdentifier;
|
||||||
import com.sap.sailing.domain.common.dto.CompetitorDTO;
|
import com.sap.sailing.domain.common.dto.CompetitorDTO;
|
||||||
import com.sap.sailing.domain.common.dto.PositionDTO;
|
|
||||||
import com.sap.sailing.gwt.ui.shared.MarkDTO;
|
|
||||||
|
|
||||||
public class StartAnalysisDTO implements Serializable, Comparable<StartAnalysisDTO>{
|
public class StartAnalysisDTO implements Serializable, Comparable<StartAnalysisDTO> {
|
||||||
|
|
||||||
private static final long serialVersionUID = -1325150193180234561L;
|
private static final long serialVersionUID = -1325150193180234561L;
|
||||||
|
|
||||||
public String raceName;
|
public String raceName;
|
||||||
public CompetitorDTO competitor;
|
public CompetitorDTO competitor;
|
||||||
public List<PositionDTO> startLineMarkPositions;
|
|
||||||
public List<MarkDTO> startLineMarks;
|
|
||||||
public MarkDTO firstMark;
|
|
||||||
public WindAndAdvantagesInfoForStartLineDTO startAnalysisWindLineInfoDTO;
|
public WindAndAdvantagesInfoForStartLineDTO startAnalysisWindLineInfoDTO;
|
||||||
public List<StartAnalysisCompetitorDTO> startAnalysisCompetitorDTOs;
|
public List<StartAnalysisCompetitorDTO> startAnalysisCompetitorDTOs;
|
||||||
|
public long timeOfStartInMilliSeconds;
|
||||||
|
public RegattaAndRaceIdentifier regattaAndRaceIdentifier;
|
||||||
public StartAnalysisDTO(){}
|
|
||||||
|
public StartAnalysisDTO() {
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compareTo(StartAnalysisDTO o) {
|
public int compareTo(StartAnalysisDTO o) {
|
||||||
return raceName.compareTo(o.raceName);
|
return raceName.compareTo(o.raceName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<CompetitorDTO> getCompetitorDTOsFromStartAnaylsisCompetitorDTOs() {
|
||||||
|
List<CompetitorDTO> competitorDTOs = new ArrayList<CompetitorDTO>();
|
||||||
|
for (StartAnalysisCompetitorDTO startAnalysisCompetitorDTO : startAnalysisCompetitorDTOs) {
|
||||||
|
competitorDTOs.add(startAnalysisCompetitorDTO.competitorDTO);
|
||||||
|
}
|
||||||
|
return competitorDTOs;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user