Merge branch 'master' into bug4006

This commit is contained in:
Axel Uhl committed 2019-12-11 17:48:57 +01:00
commit 8ca2e86f63
26 files changed
+64377 -194

No files matched your search

@@ -21,28 +21,24 @@ public abstract class DeclinationImportTest<I extends DeclinationImporter> exten
@Test
public void importSimpleDeclination() throws IOException, ParseException, ParserConfigurationException, SAXException {
Declination record = importer.importRecord(new DegreePosition(53, 3),
new MillisecondsTimePoint(simpleDateFormat.parse("2016-05-27").getTime()));
assertEquals(0.26307, record.getBearing().getDegrees(), 0.05);
new MillisecondsTimePoint(simpleDateFormat.parse("2020-04-17").getTime()));
assertEquals(1.03748, record.getBearing().getDegrees(), 0.05);
assertEquals(0.14795, record.getAnnualChange().getDegrees(), 0.05);
}
@Test
public void importSouthernHemisphereDeclination() throws IOException, ParseException, ParserConfigurationException, SAXException {
long start = System.currentTimeMillis();
Declination record = importer.importRecord(new DegreePosition(-10, 3),
new MillisecondsTimePoint(simpleDateFormat.parse("2017-05-27").getTime()));
System.out.println("took "+(System.currentTimeMillis()-start)+"ms");
assertEquals(-8.44581, record.getBearing().getDegrees(), 0.2);
assertEquals(0.17712, record.getAnnualChange().getDegrees(), 0.2);
new MillisecondsTimePoint(simpleDateFormat.parse("2019-12-14").getTime()));
assertEquals(-7.8071, record.getBearing().getDegrees(), 0.05);
assertEquals(0.17712, record.getAnnualChange().getDegrees(), 0.05);
}
@Test
public void readOnlineOrFromFile() throws IOException, ClassNotFoundException, ParseException {
Declination declination = importer.getDeclination(new DegreePosition(53, 3),
new MillisecondsTimePoint(simpleDateFormat.parse("2018-05-27").getTime()),
new MillisecondsTimePoint(simpleDateFormat.parse("2019-12-12").getTime()),
/* timeoutForOnlineFetchInMilliseconds */ 10000);
assertNotNull(declination);
System.out.println(declination);
}
}
@@ -21,23 +21,23 @@ import com.sap.sse.common.impl.MillisecondsTimePoint;
public abstract class SimpleDeclinationTest<I extends DeclinationImporter> extends AbstractDeclinationTest<I> {
@Test
public void testSimpleCorrection() throws IOException, ParseException, ParserConfigurationException, SAXException {
final MillisecondsTimePoint timePoint = new MillisecondsTimePoint(simpleDateFormat.parse("2019-05-27").getTime());
final MillisecondsTimePoint timePoint = new MillisecondsTimePoint(simpleDateFormat.parse("2019-12-10").getTime());
Declination record = importer.importRecord(new DegreePosition(53, 3), timePoint);
assertEquals(0.70594, record.getBearing().getDegrees(), 0.2);
assertEquals(0.14745, record.getAnnualChange().getDegrees(), 0.2);
assertEquals(0.96886, record.getBearing().getDegrees(), 0.1);
assertEquals(0.19616, record.getAnnualChange().getDegrees(), 0.01);
TimePoint oneYearLater = timePoint.plus(Duration.ONE_YEAR);
Bearing bearing = record.getBearingCorrectedTo(oneYearLater);
assertEquals(0.70594+0.14745, bearing.getDegrees(), 0.2);
assertEquals(0.96886+record.getAnnualChange().getDegrees(), bearing.getDegrees(), 0.1);
}
@Test
public void testBackwardCorrection() throws IOException, ParseException, ParserConfigurationException, SAXException {
final MillisecondsTimePoint timePoint = new MillisecondsTimePoint(simpleDateFormat.parse("2019-05-27").getTime());
final MillisecondsTimePoint timePoint = new MillisecondsTimePoint(simpleDateFormat.parse("2019-12-11").getTime());
Declination record = importer.importRecord(new DegreePosition(53, 3), timePoint);
assertEquals(0.70594, record.getBearing().getDegrees(), 0.2);
assertEquals(0.14745, record.getAnnualChange().getDegrees(), 0.2);
assertEquals(0.96886, record.getBearing().getDegrees(), 0.1);
assertEquals(0.19616, record.getAnnualChange().getDegrees(), 0.01);
TimePoint oneYearEarlier = timePoint.minus(Duration.ONE_YEAR);
Bearing bearing = record.getBearingCorrectedTo(oneYearEarlier);
assertEquals(0.70594-0.14745, bearing.getDegrees(), 0.2);
assertEquals(0.96886-record.getAnnualChange().getDegrees(), bearing.getDegrees(), 0.1);
}
}
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/DeclinationStore.java"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="1"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.sap.sailing.declination.impl.DeclinationStore"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="2019 2019 1"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.declination"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.sailing.declination/src/com/sap/sailing/declination/impl/DeclinationStore.java"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="1"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.sap.sailing.declination.impl.DeclinationStore"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="2020 2020 1"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.sailing.declination"/>
</launchConfiguration>
File diff suppressed because it is too large. Load diff
@@ -19,41 +19,41 @@ import com.sap.sailing.domain.common.tracking.DoubleVectorFix;
* The first columns need to be consistent with {@link BravoSensorDataMetadata}.
*/
public enum ExpeditionExtendedSensorDataMetadata {
HEEL("Heel", BravoExtendedSensorDataMetadata.HEEL), //
TRIM("Trim", BravoExtendedSensorDataMetadata.PITCH), //
LEEWAY("Leeway", BravoExtendedSensorDataMetadata.LEEWAY), //
SET("Set", BravoExtendedSensorDataMetadata.SET), //
DRIFT("Drift", BravoExtendedSensorDataMetadata.DRIFT), //
DEPTH("Depth", BravoExtendedSensorDataMetadata.DEPTH), //
RUDDER("Rudder", BravoExtendedSensorDataMetadata.RUDDER), //
FORESTAY_LOAD("Forestay", BravoExtendedSensorDataMetadata.FORESTAY_LOAD), //
FORESTAY_PRESSURE("ForestayPres", BravoExtendedSensorDataMetadata.FORESTAY_PRESSURE), //
TACK_ANGLE("TackAngle", BravoExtendedSensorDataMetadata.TACK_ANGLE), //
RAKE_DEG("RakeDeg", BravoExtendedSensorDataMetadata.RAKE_DEG), //
DEFLECTOR_PERCENTAGE("DflectrPP", BravoExtendedSensorDataMetadata.DEFLECTOR_PERCENTAGE), //
TARGET_HEEL("TG Heell", BravoExtendedSensorDataMetadata.TARGET_HEEL), //
DEFLECTOR_MILLIMETERS("DflectrMM", BravoExtendedSensorDataMetadata.DEFLECTOR_MILLIMETERS), //
TARGET_BOATSPEED_P("BspTr", BravoExtendedSensorDataMetadata.TARGET_BOATSPEED_P), //
EXPEDITION_AWA("Awa", BravoExtendedSensorDataMetadata.EXPEDITION_AWA), //
EXPEDITION_AWS("Aws", BravoExtendedSensorDataMetadata.EXPEDITION_AWS), //
EXPEDITION_TWA("Twa", BravoExtendedSensorDataMetadata.EXPEDITION_TWA), //
EXPEDITION_TWS("Tws", BravoExtendedSensorDataMetadata.EXPEDITION_TWS), //
EXPEDITION_TWD("Twd", BravoExtendedSensorDataMetadata.EXPEDITION_TWD), //
EXPEDITION_BSP("Bsp", BravoExtendedSensorDataMetadata.EXPEDITION_BSP), //
EXPEDITION_SOG("Sog", BravoExtendedSensorDataMetadata.EXPEDITION_SOG), //
EXPEDITION_COG("Cog", BravoExtendedSensorDataMetadata.EXPEDITION_COG), //
EXPEDITION_RAKE("Rake", BravoExtendedSensorDataMetadata.EXPEDITION_RAKE), //
EXPEDITION_HDG("Hdg", BravoExtendedSensorDataMetadata.EXPEDITION_HDG), //
EXPEDITION_TMTOGUN("TmToGun", BravoExtendedSensorDataMetadata.EXPEDITION_TMTOGUN), //
EXPEDITION_TMTOBURN("TmToBurn", BravoExtendedSensorDataMetadata.EXPEDITION_TMTOBURN), //
EXPEDITION_BELOWLN("BelowLn", BravoExtendedSensorDataMetadata.EXPEDITION_BELOWLN), //
EXPEDITION_RATE_OF_TURN("ROT", BravoExtendedSensorDataMetadata.EXPEDITION_RATE_OF_TURN), //
EXPEDITION_BARO("Baro", BravoExtendedSensorDataMetadata.EXPEDITION_BARO), //
EXPEDITION_LOAD_P("Load P", BravoExtendedSensorDataMetadata.EXPEDITION_LOAD_P), //
EXPEDITION_LOAD_S("Load S", BravoExtendedSensorDataMetadata.EXPEDITION_LOAD_S), //
EXPEDITION_JIB_CAR_PORT("JibCarPort", BravoExtendedSensorDataMetadata.EXPEDITION_JIB_CAR_PORT), //
EXPEDITION_JIB_CAR_STBD("JibCarStbd", BravoExtendedSensorDataMetadata.EXPEDITION_JIB_CAR_STBD), //
EXPEDITION_MAST_BUTT("MastButt", BravoExtendedSensorDataMetadata.EXPEDITION_MAST_BUTT), //
HEEL("heel", BravoExtendedSensorDataMetadata.HEEL), //
TRIM("trim", BravoExtendedSensorDataMetadata.PITCH), //
LEEWAY("leeway", BravoExtendedSensorDataMetadata.LEEWAY), //
SET("set", BravoExtendedSensorDataMetadata.SET), //
DRIFT("drift", BravoExtendedSensorDataMetadata.DRIFT), //
DEPTH("depth", BravoExtendedSensorDataMetadata.DEPTH), //
RUDDER("rudder", BravoExtendedSensorDataMetadata.RUDDER), //
FORESTAY_LOAD("forestay", BravoExtendedSensorDataMetadata.FORESTAY_LOAD), //
FORESTAY_PRESSURE("forestaypres", BravoExtendedSensorDataMetadata.FORESTAY_PRESSURE), //
TACK_ANGLE("tackangle", BravoExtendedSensorDataMetadata.TACK_ANGLE), //
RAKE_DEG("rakedeg", BravoExtendedSensorDataMetadata.RAKE_DEG), //
DEFLECTOR_PERCENTAGE("dflectrpp", BravoExtendedSensorDataMetadata.DEFLECTOR_PERCENTAGE), //
TARGET_HEEL("tg Heell", BravoExtendedSensorDataMetadata.TARGET_HEEL), //
DEFLECTOR_MILLIMETERS("dflectrmm", BravoExtendedSensorDataMetadata.DEFLECTOR_MILLIMETERS), //
TARGET_BOATSPEED_P("bsptr", BravoExtendedSensorDataMetadata.TARGET_BOATSPEED_P), //
EXPEDITION_AWA("awa", BravoExtendedSensorDataMetadata.EXPEDITION_AWA), //
EXPEDITION_AWS("aws", BravoExtendedSensorDataMetadata.EXPEDITION_AWS), //
EXPEDITION_TWA("twa", BravoExtendedSensorDataMetadata.EXPEDITION_TWA), //
EXPEDITION_TWS("tws", BravoExtendedSensorDataMetadata.EXPEDITION_TWS), //
EXPEDITION_TWD("twd", BravoExtendedSensorDataMetadata.EXPEDITION_TWD), //
EXPEDITION_BSP("bsp", BravoExtendedSensorDataMetadata.EXPEDITION_BSP), //
EXPEDITION_SOG("sog", BravoExtendedSensorDataMetadata.EXPEDITION_SOG), //
EXPEDITION_COG("cog", BravoExtendedSensorDataMetadata.EXPEDITION_COG), //
EXPEDITION_RAKE("rake", BravoExtendedSensorDataMetadata.EXPEDITION_RAKE), //
EXPEDITION_HDG("hdg", BravoExtendedSensorDataMetadata.EXPEDITION_HDG), //
EXPEDITION_TMTOGUN("tmtogun", BravoExtendedSensorDataMetadata.EXPEDITION_TMTOGUN), //
EXPEDITION_TMTOBURN("tmtoburn", BravoExtendedSensorDataMetadata.EXPEDITION_TMTOBURN), //
EXPEDITION_BELOWLN("belowln", BravoExtendedSensorDataMetadata.EXPEDITION_BELOWLN), //
EXPEDITION_RATE_OF_TURN("rot", BravoExtendedSensorDataMetadata.EXPEDITION_RATE_OF_TURN), //
EXPEDITION_BARO("baro", BravoExtendedSensorDataMetadata.EXPEDITION_BARO), //
EXPEDITION_LOAD_P("load p", BravoExtendedSensorDataMetadata.EXPEDITION_LOAD_P), //
EXPEDITION_LOAD_S("load s", BravoExtendedSensorDataMetadata.EXPEDITION_LOAD_S), //
EXPEDITION_JIB_CAR_PORT("jibcarport", BravoExtendedSensorDataMetadata.EXPEDITION_JIB_CAR_PORT), //
EXPEDITION_JIB_CAR_STBD("jibcarstbd", BravoExtendedSensorDataMetadata.EXPEDITION_JIB_CAR_STBD), //
EXPEDITION_MAST_BUTT("mastbutt", BravoExtendedSensorDataMetadata.EXPEDITION_MAST_BUTT), //
;
private String columnName;
@@ -75,7 +75,7 @@ public enum ExpeditionExtendedSensorDataMetadata {
}
private ExpeditionExtendedSensorDataMetadata(String columnName, BravoExtendedSensorDataMetadata mappedToBravoField, boolean expectedInLogfile) {
this.columnName = columnName;
this.columnName = columnName.toLowerCase();
this.mappedToBravoField = mappedToBravoField;
this.expectedInLogfile = expectedInLogfile;
}
@@ -25,8 +25,8 @@ import com.sap.sse.common.impl.DegreeBearingImpl;
public class ExpeditionGPSFixImporter implements GPSFixImporter {
private static final String LAT_COLUMN_HEADING = ExpeditionExtendedDataImporterImpl.COL_NAME_LAT;
private static final String LON_COLUMN_HEADING = ExpeditionExtendedDataImporterImpl.COL_NAME_LON;
private static final String COG_COLUMN_HEADING = "Cog";
private static final String SOG_COLUMN_HEADING = "Sog";
private static final String COG_COLUMN_HEADING = "cog";
private static final String SOG_COLUMN_HEADING = "sog";
@Override
public boolean importFixes(InputStream inputStream, Callback callback, boolean inferSpeedAndBearing,
@@ -37,7 +37,6 @@ public class Solutions extends Composite {
@UiField Anchor raceAnchor;
@UiField Anchor inSightAnchor;
@UiField Anchor buoyPingerAnchor;
@UiField Anchor postRaceAnchor;
@UiField Anchor simulatorAnchor;
@UiField DivElement sapInSailingDiv;
@@ -45,7 +44,6 @@ public class Solutions extends Composite {
@UiField DivElement raceDiv;
@UiField DivElement inSightDiv;
@UiField DivElement buoyPingerDiv;
@UiField DivElement postRaceDiv;
@UiField DivElement simulatorDiv;
@UiField Anchor sailingAnalyticsDetailsAnchor;
@@ -59,7 +57,6 @@ public class Solutions extends Composite {
private final PlaceNavigation<SolutionsPlace> raceCommitteeAppNavigation;
private final PlaceNavigation<SolutionsPlace> inSightAppNavigation;
private final PlaceNavigation<SolutionsPlace> buoyPingerAppNavigation;
private final PlaceNavigation<SolutionsPlace> postRaceAnalyticsNavigation;
private final PlaceNavigation<SolutionsPlace> sailingSimulatorNavigation;
private final SolutionsNavigationTabs navigationTab;
@@ -94,7 +91,6 @@ public class Solutions extends Composite {
raceCommitteeAppNavigation = placesNavigator.getSolutionsNavigation(SolutionsNavigationTabs.RaceManagerApp);
inSightAppNavigation = placesNavigator.getSolutionsNavigation(SolutionsNavigationTabs.InSightApp);
buoyPingerAppNavigation = placesNavigator.getSolutionsNavigation(SolutionsNavigationTabs.BuoyPingerApp);
postRaceAnalyticsNavigation = placesNavigator.getSolutionsNavigation(SolutionsNavigationTabs.PostRaceAnalytics);
sailingSimulatorNavigation = placesNavigator.getSolutionsNavigation(SolutionsNavigationTabs.SailingSimulator);
sapInSailingAnchor.setHref(sapInSailingNavigation.getTargetUrl());
@@ -102,7 +98,6 @@ public class Solutions extends Composite {
raceAnchor.setHref(raceCommitteeAppNavigation.getTargetUrl());
inSightAnchor.setHref(inSightAppNavigation.getTargetUrl());
buoyPingerAnchor.setHref(buoyPingerAppNavigation.getTargetUrl());
postRaceAnchor.setHref(postRaceAnalyticsNavigation.getTargetUrl());
simulatorAnchor.setHref(sailingSimulatorNavigation.getTargetUrl());
}
@@ -144,12 +139,6 @@ public class Solutions extends Composite {
handleClickEventWithLocalNavigation(e, buoyPingerAppNavigation);
}
@UiHandler("postRaceAnchor")
public void scrollToPostRace(ClickEvent e) {
scrollToView(SolutionsNavigationTabs.PostRaceAnalytics);
handleClickEventWithLocalNavigation(e, postRaceAnalyticsNavigation);
}
@UiHandler("simulatorAnchor")
public void scrollToSimulator(ClickEvent e) {
scrollToView(SolutionsNavigationTabs.SailingSimulator);
@@ -186,9 +175,6 @@ public class Solutions extends Composite {
case RaceManagerApp:
raceDiv.scrollIntoView();
break;
case PostRaceAnalytics:
postRaceDiv.scrollIntoView();
break;
case SailingSimulator:
simulatorDiv.scrollIntoView();
break;
@@ -27,9 +27,6 @@
<g:Anchor ui:field="buoyPingerAnchor" styleName="{local_res.css.solutions_nav_link}">
<ui:text from='{i18n.solutionsBuoyPingerHeadline}' />
</g:Anchor>
<g:Anchor ui:field="postRaceAnchor" styleName="{local_res.css.solutions_nav_link}">
<ui:text from='{i18n.solutionsPostHeadline}' />
</g:Anchor>
<g:Anchor ui:field="simulatorAnchor" styleName="{local_res.css.solutions_nav_link}">
<ui:text from='{i18n.solutionsSimulatorHeadline}' />
</g:Anchor>
@@ -170,23 +167,6 @@
</div>
</div>
</div>
<div ui:field="postRaceDiv"
class="{local_res.css.solutions_content} {local_res.css.solutions_contentpost}">
<div class="{res.mediaCss.grid} {local_res.css.gridalternator}">
<div
class="{res.mediaCss.small5} {res.mediaCss.smalloffset7} {res.mediaCss.columns}">
<h2>
<ui:text from='{i18n.postRaceAnalytics}' />
</h2>
<p>
<ui:text from='{i18n.contentPostRaceAnalytics1}' />
</p>
<p>
<ui:text from='{i18n.contentPostRaceAnalytics2}' />
</p>
</div>
</div>
</div>
<div ui:field="simulatorDiv"
class="{local_res.css.solutions_content} {local_res.css.solutions_contentsimulator}">
<div class="{res.mediaCss.grid} {local_res.css.gridalternator}">
@@ -82,8 +82,6 @@ public class TabletAndDesktopWhatsNewView extends Composite implements WhatsNewV
case InSightApp:
setActiveContent(inSightAppNotes, inSightAppNotesAnchor);
break;
case PostRaceAnalytics:
break;
case RaceManagerApp:
setActiveContent(raceCommitteeAppNotes, raceCommitteeAppNotesAnchor);
break;
@@ -4,7 +4,7 @@ import com.google.gwt.place.shared.PlaceTokenizer;
import com.sap.sailing.gwt.common.client.AbstractBasePlace;
public class WhatsNewPlace extends AbstractBasePlace {
public enum WhatsNewNavigationTabs { SailingAnalytics, RaceManagerApp, InSightApp, BuoyPingerApp, PostRaceAnalytics, TrainingDiary, SailingSimulator };
public enum WhatsNewNavigationTabs { SailingAnalytics, RaceManagerApp, InSightApp, BuoyPingerApp, TrainingDiary, SailingSimulator };
private final WhatsNewNavigationTabs navigationTab;
private final static String PARAM_NAVIGATION_TAB = "navigationTab";
@@ -120,21 +120,6 @@
</s:content>
</s:SolutionsItem>
</a:item>
<a:item>
<s:SolutionsItem title="{i18n.postRaceAnalytics}"
image="{res_local.postTrimmed}" showInitial="false">
<s:content>
<g:HTMLPanel>
<p>
<ui:text from='{i18n.contentPostRaceAnalytics1}' />
</p>
<p>
<ui:text from='{i18n.contentPostRaceAnalytics2}' />
</p>
</g:HTMLPanel>
</s:content>
</s:SolutionsItem>
</a:item>
<a:item>
<s:SolutionsItem title="{i18n.strategySimulator}"
image="{res_local.simulatorTrimmed}" showInitial="false">
@@ -15,7 +15,7 @@ import com.sap.sailing.gwt.ui.client.StringMessages;
public class SolutionsPlace extends AbstractBasePlace implements HasLocationTitle, HasMobileVersion {
public enum SolutionsNavigationTabs {
SapInSailing, SailingAnalytics, RaceManagerApp, InSightApp, BuoyPingerApp, PostRaceAnalytics, SailingSimulator
SapInSailing, SailingAnalytics, RaceManagerApp, InSightApp, BuoyPingerApp, SailingSimulator
};
private final SolutionsNavigationTabs navigationTab;
private final static String PARAM_NAVIGATION_TAB = "navigationTab";
@@ -1732,7 +1732,6 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
String solutionsRaceHeadline();
String solutionsInSightHeadline();
String solutionsBuoyPingerHeadline();
String solutionsPostHeadline();
String solutionsSimulatorHeadline();
String sapInSailing();
String contentSapInSailing1();
@@ -1761,9 +1760,6 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
String sapSailingBuoyPinger();
String contentSapSailingBuoyPinger();
String sapSailingBuoyPingerReadMore();
String postRaceAnalytics();
String contentPostRaceAnalytics1();
String contentPostRaceAnalytics2();
String strategySimulator();
String contentStrategySimulator();
String strategySimulatorReadMore();
@@ -1734,7 +1734,6 @@ solutionsSAPHeadline=SAP Sailing Analytics
solutionsRaceHeadline=SAP Sailing Race Manager
solutionsInSightHeadline=SAP Sail InSight
solutionsBuoyPingerHeadline=SAP Sailing Buoy Pinger
solutionsPostHeadline=Post-Race Analytics
solutionsSimulatorHeadline=Strategy Simulator
sapInSailing=SAP in Sailing
contentSapInSailing1=Sailing provides the perfect platform for SAP to showcase solutions and help the sport run like never before. SAP’s involvement in the sport has transformed the sailing experience by providing tools, which:
@@ -1763,9 +1762,6 @@ sapSailInSightReadMore=Learn More
sapSailingBuoyPinger=SAP Sailing Buoy Pinger
contentSapSailingBuoyPinger=With the SAP Sailing Buoy Pinger mobile app for Android phones, sailboat race managers can simplify the positioning of race marks and communication with the mark layers anywhere and anytime. This app connects to the SAP Sailing Analytics solution and allows regatta managers to track the geographical position of their race marks, enabling the use of the SAP Sail InSight mobile app by sailors participating in the regatta.
sapSailingBuoyPingerReadMore=Learn More
postRaceAnalytics=Post-Race Analytics
contentPostRaceAnalytics1=Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better.
contentPostRaceAnalytics2=SAP Business Analytics solutions provide sailors, coaches, fans and media with tools to browse and analyse historical data across many regattas and races. SAP HANA allows them to learn about performance patterns, tendencies and sailor profiles in a simple, fast and efficient way in order to optimize their own performance and develop successful strategies for future regattas.
strategySimulator=Strategy Simulator
contentStrategySimulator=Choosing the right strategy can provide great competitive advantage during a race. The Strategy Simulator simplifies determining the best sailing strategy for various wind conditions and water currents. Since wind and current can be changed in the simulation right away, the robustness of a strategy can be easily evaluated even for uncertain weather conditions.
strategySimulatorReadMore=Learn More
@@ -1720,7 +1720,6 @@ solutionsSAPHeadline=SAP Sailing Analytics
solutionsRaceHeadline=SAP Sailing Race Manager
solutionsInSightHeadline=SAP Sail InSight
solutionsBuoyPingerHeadline=SAP Sailing Buoy Pinger
solutionsPostHeadline=Analysen nach den Rennen
solutionsSimulatorHeadline=Strategie-Simulator
sapInSailing=SAP im Segelsport
contentSapInSailing1=Der Segelsport bietet SAP eine perfekte Plattform, um seine Lösungen zu demonstrieren und dem Sport zu neuen Bestleistungen zu verhelfen. SAPs Unterstützung hat das Segelerlebnis vollkommen verwandelt. Tools von SAP:
@@ -1749,9 +1748,6 @@ sapSailInSightReadMore=Learn More
sapSailingBuoyPinger=SAP Sailing Buoy Pinger
contentSapSailingBuoyPinger=Mit der SAP Sailing Buoy Pinger App für Android Telefone, können Wettfahrtleiter die Auslage der Kursmarken sowie die Kommunikation mit den Tonnenlegern vereinfachen – überall und jederzeit. Diese App verbindet sich mit der SAP Sailing Analytics Lösung und ermöglicht Wettfahrtleitern die geografische Position ihrer Kursmarken zu erfassen. Dies ermöglicht es teilnehmenden Seglern die SAP Sail InSight App bei einer Regatta zu verwenden.
sapSailingBuoyPingerReadMore=Learn More
postRaceAnalytics=Analysen nach den Rennen
contentPostRaceAnalytics1=Daten von den Segelveranstaltungen bieten Seglern die Möglichkeit, ihre Leistungen zu analysieren und zu bewerten, um ihre Strategien zu verfeinern und letztendlich besser zu segeln.
contentPostRaceAnalytics2=Lösungen von SAP Business Analytics geben Seglern, Trainern, Fans und Medien die Mittel in die Hand, um historische Daten von vielen Regatten und Rennen abzurufen und zu analysieren. Mit SAP HANA sind Informationen über Leistungsmuster, Trends und Segler-Profile einfach, schnell und effizient abrufbar, so dass Segler ihre eigene Leistung optimieren und Erfolgsstrategien für zukünftige Regatten entwickeln können.
strategySimulator=Strategie-Simulator
contentStrategySimulator=Während eines Rennens hängt viel von der Wahl der richtigen Strategie ab. Der Strategie-Simulator vereinfacht die Ermittlung der besten Segelstrategie für diverse Wind- und Strömungsbedingungen. Da Wind und Strömung sofort in der Simulation geändert werden können, lässt sich die Robustheit einer Strategie selbst für unsichere Wetterbedingungen problemlos bewerten.
strategySimulatorReadMore=Mehr erfahren
@@ -1728,7 +1728,6 @@ solutionsSAPHeadline=SAP Sailing Analytics
solutionsRaceHeadline=SAP Sailing Race Manager
solutionsInSightHeadline=SAP Sail InSight
solutionsBuoyPingerHeadline=SAP Sailing Buoy Pinger
solutionsPostHeadline=Análisis posterior a la carrera
solutionsSimulatorHeadline=Simulador de estrategias
sapInSailing=SAP in Sailing
contentSapInSailing1=La navegación es la plataforma perfecta para SAP para exhibir soluciones y ayudar a lanzar el deporte como nunca antes. La implicación de SAP en el deporte ha transformado la experiencia de la navegación proporcionando herramientas como:
@@ -1757,9 +1756,6 @@ sapSailInSightReadMore=Más información
sapSailingBuoyPinger=SAP Sailing Buoy Pinger
contentSapSailingBuoyPinger=Con la aplicación móvil SAP Sailing Buoy Pinger para teléfonos Android, los directores deportivos de carreras de veleros podrán simplificar el posicionamiento de las marcas de carrera y la comunicación mediante las capas de marca en cualquier lugar y en cualquier momento. Esta aplicación conecta con la solución SAP Sailing Analytics y permite a los directores de regata rastrear la posición geográfica de sus propias marcas de carrera, haciendo posible el uso de la aplicación móvil SAP Sail InSight por los navegantes que participan en la regata.
sapSailingBuoyPingerReadMore=Más información
postRaceAnalytics=Análisis posterior a la carrera
contentPostRaceAnalytics1=El acceso a los datos recopilados en los eventos de navegación ofrece a los navegantes la oportunidad de evaluar y analizar sus rendimientos para, de esta manera, poder desarrollar sus estrategias y mejorar la navegación.
contentPostRaceAnalytics2=Las soluciones de SAP Business Analytics proporciona soluciones a navegantes, entrenadores, fans y medios con herramientas para mirar y analizar datos históricos a través de muchas regatas y carreras. SAP HANA permite el aprendizaje de patrones de rendimiento, tendencias y perfiles de navegantes de un modo simple, rápido y eficaz para optimizar su propio rendimiento y desarrollar estrategias de éxito para futuras regatas.
strategySimulator=Simulador de estrategias
contentStrategySimulator=Al seleccionar la estrategia de la derecha puede proporcionar una gran ventaja competitiva durante la carrera. El simulador de estrategias determina la mejor estrategia de navegación para determinadas condiciones de viento y corrientes de marinas. Como el viento y la corriente pueden modificarse en la simulación de forma inmediata, la robustez de una estrategia podrá evaluarse rápidamente incluso para condiciones meteorológicas variables.
strategySimulatorReadMore=Más información
@@ -2327,3 +2323,4 @@ orcPerformanceCurveLegTypeDescriptionWindwardLeeward=Regata de barlovento/sotave
orcPerformanceCurveLegTypeDescriptionWindwardLeewardRealLive=Regata de barlovento/sotavento (arriba y abajo) es una regata convencional alrededor de marcas de barlovento y sotavento donde la regata de carrera consiste en tramos de 50% de viento a barlovento y 50% de viento a sotavento.\nDurante la carrera, los tramos de barlovento y sotavento se modelan automáticamente como tramos de "regatas construidas" respectivamente para mejores predicciones, mientras que tras la carrera los valores medios se aplicarán a todos los tramos.
errorWhileLoadingUserSettings=Error al cargar las opciones de usuario: {0}
certificates=Certificados
dataBy=Datos por
@@ -1728,7 +1728,6 @@ solutionsSAPHeadline=SAP Sailing Analytics
solutionsRaceHeadline=SAP Sailing Race Manager
solutionsInSightHeadline=SAP Sail InSight
solutionsBuoyPingerHeadline=SAP Sailing Buoy Pinger
solutionsPostHeadline=Analyses post-course
solutionsSimulatorHeadline=Simulateur de stratégies
sapInSailing=SAP in Sailing
contentSapInSailing1=Pour SAP, la voile est une plate-forme idéale pour présenter des solutions et permettre à la discipline d''atteindre une autre dimension. L''engagement de SAP dans cette discipline a transformé l''expérience de la voile grâce à des outils qui :
@@ -1757,9 +1756,6 @@ sapSailInSightReadMore=En savoir plus
sapSailingBuoyPinger=SAP Sailing Buoy Pinger
contentSapSailingBuoyPinger=Grâce à l''application mobile SAP Sailing Buoy Pinger pour smartphones Android, les organisateurs de courses à la voile peuvent simplifier le positionnement des marques de course ainsi que la communication avec les positionneurs des marques, à tout moment, où qu''ils soient. Cette application se connecte à la solution SAP Sailing Analytics et permet aux organisateurs de régates de suivre la position géographique de leurs marques de course. Cette connexion permet en outre aux sportifs participant à la régate d''utiliser l''application mobile SAP Sail InSight.
sapSailingBuoyPingerReadMore=En savoir plus
postRaceAnalytics=Analyses post-course
contentPostRaceAnalytics1=L''accès aux données collectées lors de manifestations de voile permet aux sportifs de la voile d''analyser et d''évaluer leurs performances, de développer des stratégies et d''optimiser leur navigation.
contentPostRaceAnalytics2=Les solutions SAP Business Analytics fournissent aux sportifs de la voile comme aux entraîneurs, amateurs et média des outils pour parcourir et analyser des données historiques de nombreuses régates et courses. Grâce à la puissance de SAP HANA, des modèles de performance se détachent, des tendances et profils de sportifs de la voile se dessinent de manière simple, rapide et efficace afin d''optimiser leurs propres performances et de développer des stratégies porteuses de succès pour les régates à venir.
strategySimulator=Simulateur de stratégies
contentStrategySimulator=Opter pour la bonne stratégie peut procurer un avantage significatif pendant une course. Le simulateur de stratégies simplifie la détermination de la meilleure stratégie de navigation pour différentes conditions de vent et courants d''eau. Comme les données de vent et de courant peuvent être modifiées directement au cours de la simulation, la solidité d''une stratégie peut être facilement évaluée même en cas de conditions météorologiques incertaines.
strategySimulatorReadMore=En savoir plus
@@ -2327,3 +2323,4 @@ orcPerformanceCurveLegTypeDescriptionWindwardLeeward="Windward/Leeward" (au vent
orcPerformanceCurveLegTypeDescriptionWindwardLeewardRealLive="Windward/Leeward" (au vent et sous le vent) est un parcours conventionnel autour des marques Au vent et Sous le vent où le parcours de la course se compose de portions de parcours à 50 % dans le lit du vent et à 50 % avec vent arrière.\nPendant la course, les portions de parcours dans le lit du vent et avec vent arrière seront automatiquement modélisées respectivement comme portions de parcours de "course construite" afin d''obtenir de meilleures prévisions, alors qu''après la course, les valeurs moyennes s''appliqueront à toutes les portions de parcours.
errorWhileLoadingUserSettings=Erreur lors du chargement des options utilisateur : {0}
certificates=Certificats
dataBy=Données par
@@ -1728,7 +1728,6 @@ solutionsSAPHeadline=SAP Sailing Analytics
solutionsRaceHeadline=SAP Sailing Race Manager
solutionsInSightHeadline=SAP Sail InSight
solutionsBuoyPingerHeadline=SAP Sailing Buoy Pinger
solutionsPostHeadline=Analisi post gara
solutionsSimulatorHeadline=Simulatore di strategia
sapInSailing=SAP nella vela
contentSapInSailing1=Sailing rappresenta per SAP la piattaforma perfetta in cui presentare le proprie soluzioni e offrire un supporto senza precedenti alla gestione di questo sport. L’impegno di SAP in ambito sportivo ha trasformato l’esperienza velistica con strumenti capaci di:
@@ -1757,9 +1756,6 @@ sapSailInSightReadMore=Maggiori informazioni
sapSailingBuoyPinger=SAP Sailing Buoy Pinger
contentSapSailingBuoyPinger=Grazie all’app mobile SAP Sailing Buoy Pinger per dispositivi Android, i responsabili di gara possono semplificare il posizionamento dei segnali di gara e le comunicazioni con i posaboe, ovunque e in qualsiasi momento. L’app si connette con SAP Sailing Analytics e consente ai responsabili della regata di tracciare la posizione geografica dei segnali di gara, consentendo l’uso dell’app mobile SAP Sail InSight da parte dei velisti che partecipano alla regata.
sapSailingBuoyPingerReadMore=Maggiori informazioni
postRaceAnalytics=Analisi post gara
contentPostRaceAnalytics1=L’accesso ai dati raccolti durante gli eventi velistici fornisce ai velisti l’opportunità di valutare e analizzare le proprie prestazioni per aiutare a sviluppare le strategie e a navigare meglio.
contentPostRaceAnalytics2=Le soluzioni SAP Business Analytics forniscono ai velisti, agli allenatori, agli appassionati e ai media strumenti per sfogliare e analizzare dati storici di regate e gare. SAP HANA consente loro di apprendere relativamente ai modelli di prestazione, alle tendenze e ai profili dei velisti in modo semplice, veloce ed efficace al fine di ottimizzare le proprie prestazioni e sviluppare strategie di successo per le regate future.
strategySimulator=Simulatore di strategia
contentStrategySimulator=Scegliere la strategia giusta può fornire un grande vantaggio competitivo durante una gara. Il Simulatore di strategia semplifica la determinazione della migliore strategia di navigazione per diverse condizioni di vento e correnti marine. Dal momento che il vento e le correnti possono essere immediatamente modificate nella simulazione, la forza di una strategia può essere facilmente valutata anche con condizioni meteorologiche incerte.
strategySimulatorReadMore=Maggiori informazioni
@@ -2327,3 +2323,4 @@ orcPerformanceCurveLegTypeDescriptionWindwardLeeward=Distanza sopravento/sottove
orcPerformanceCurveLegTypeDescriptionWindwardLeewardRealLive=Distanza sopravento/sottovento è una rotta convenzionale intorno a segnali di distanza sopravento/sottovento che consiste di tratte 50% sopravento e 50% sottovento.\nDurante la gara, le tratte sopravento e sottovento vengono modellate come rispettive tratte con "rotta costruita" per migliori previsioni, mentre dopo la gara i valori medi saranno applicati a tutte le tratte.
errorWhileLoadingUserSettings=Errore durante il caricamento delle impostazioni utente: {0}
certificates=Certificati
dataBy=Dati per
@@ -1728,7 +1728,6 @@ solutionsSAPHeadline=SAP Sailing Analytics
solutionsRaceHeadline=SAP Sailing Race Manager
solutionsInSightHeadline=SAP Sail InSight
solutionsBuoyPingerHeadline=SAP Sailing Buoy Pinger
solutionsPostHeadline=レース後分析
solutionsSimulatorHeadline=戦略シミュレータ
sapInSailing=SAP in Sailing
contentSapInSailing1=セーリングは、SAP にとってソリューションを紹介するためのプラットフォームとしてうってつけのものであり、これまでになかったやり方でスポーツの運営を支援しています。SAP によるスポーツへの関与は、以下のことを行うツールを提供することによってセーリングから得られる体験を別次元のものに変えました。
@@ -1757,9 +1756,6 @@ sapSailInSightReadMore=詳細情報
sapSailingBuoyPinger=SAP Sailing Buoy Pinger
contentSapSailingBuoyPinger=Android フォン向け SAP Sailing Buoy Pinger モバイルアプリにより、ヨットレース運営者はいつでもどこでもレース用のマークの位置決めや、マーク設置担当者とのやり取りを簡略化することができます。このアプリは SAP Sailing Analytics ソリューションに接続され、レガッタ運営者がレース用のマークの地理的位置を追跡することを可能にし、レガッタに参加しているセーラーが SAP Sail InSight (SAP Sailing Boat Tracker) モバイルアプリを使用できるようにします。
sapSailingBuoyPingerReadMore=詳細情報
postRaceAnalytics=レース後分析
contentPostRaceAnalytics1=セーリングイベントで収集されたデータへのアクセスにより、戦略の策定や帆走の向上に役立つ、セーラーがそのパフォーマンスを評価および分析する機会が提供されます。
contentPostRaceAnalytics2=SAP Business Analytics ソリューションは、多くのレガッタおよびレースにわたって履歴データを照会および分析するツールをセーラー、コーチ、ファン、そして報道関係者に提供します。SAP HANA は、こうした人たちが自身のパフォーマンスを最適化し、予定されているレガッタで成功を収める戦略を策定するために簡単、迅速、かつ効率的な方法でパフォーマンスのパターン、傾向、およびセーラーのプロファイルを知ることを可能にします。
strategySimulator=戦略シミュレータ
contentStrategySimulator=適切な戦略を選択すれば、レース中に大きな競争上の優位性を得ることが可能です。Strategy Simulator により、さまざまな風況および水流に対して最良のセーリング戦略を決定することが容易になります。風と水流をシミュレーションで直ちに変更することができるため、不確かな気象条件に対しても戦略の確かさを簡単に評価することができます。
strategySimulatorReadMore=詳細情報
@@ -2327,3 +2323,4 @@ orcPerformanceCurveLegTypeDescriptionWindwardLeeward=Windward/Leeward (風上と
orcPerformanceCurveLegTypeDescriptionWindwardLeewardRealLive=Windward/Leeward (風上と風下) は、レースコースが 50% の風上レグと 50% の風下レグから構成される、風上および風下マークを周回する一般的なコースです。\nレース中は、風上レグと風下レグは予測をより良いものとするため、それぞれの "Constructed コース" レグとして自動的にモデル化され、一方、レース後は平均した値がすべてのレグに適用されます。
errorWhileLoadingUserSettings=ユーザ設定のロード中にエラーが発生: {0}
certificates=証明書
dataBy=データ提供
@@ -1728,7 +1728,6 @@ solutionsSAPHeadline=SAP Sailing Analytics
solutionsRaceHeadline=SAP Sailing Race Manager
solutionsInSightHeadline=SAP Sail InSight
solutionsBuoyPingerHeadline=SAP Sailing Buoy Pinger
solutionsPostHeadline=Análise pós-corrida
solutionsSimulatorHeadline=Simulador de estratégia
sapInSailing=SAP in Sailing
contentSapInSailing1=As soluções de Sailing fornecem a plataforma perfeita para a SAP apresentar as soluções e ajudar o esporte a ter uma administração como nunca teve antes. O envolvimento da SAP no esporte transformou a experiência da vela fornecendo ferramentas que:
@@ -1757,9 +1756,6 @@ sapSailInSightReadMore=Saber mais
sapSailingBuoyPinger=SAP Sailing Buoy Pinger
contentSapSailingBuoyPinger=Com o app móvel SAP Sailing Buoy Pinger para Android, os administradores de corridas a vela podem simplificar o posicionamento de marcas da corrida e a comunicação com os responsáveis pelas marcas em qualquer lugar e em qualquer altura. Este app estabelece a conexão à solução SAP Sailing Analytics e permite que os administradores de regatas rastreiem a posição geográfica das suas marcas da corrida, permitindo a utilização do app móvel SAP Sail InSight por velejadores participantes da regata.
sapSailingBuoyPingerReadMore=Saber mais
postRaceAnalytics=Análise pós-corrida
contentPostRaceAnalytics1=O acesso a dados coletados em eventos de vela dá aos velejadores a oportunidade de avaliar e analisar suas performances de modo a ajudar a desenvolver estratégias e a velejar melhor.
contentPostRaceAnalytics2=As soluções SAP Business Analytics fornecem aos velejadores, treinadores, fãs e mídia ferramentas para procurar e analisar dados históricos de várias regatas e corridas. SAP HANA permite que eles aprendam sobre padrões de performance, tendências e perfis de velejadores de uma forma simples, rápida e eficiente de modo a otimizar sua própria performance e a desenvolver estratégias bem-sucedidas para regatas futuras.
strategySimulator=Simulador de estratégia
contentStrategySimulator=A escolha da estratégia certa pode fornecer uma grande vantagem competitiva durante uma corrida. O simulador de estratégia simplifica determinando a melhor estratégia de vela para várias condições do vento e correntes marítimas. Uma vez que o vento e a corrente podem ser modificados de imediato na simulação, a confiança de uma estratégia pode ser avaliada facilmente mesmo com condições meteorológicas incertas.
strategySimulatorReadMore=Saber mais
@@ -2327,3 +2323,4 @@ orcPerformanceCurveLegTypeDescriptionWindwardLeeward=Barlavento/sotavento (contr
orcPerformanceCurveLegTypeDescriptionWindwardLeewardRealLive=Barlavento/sotavento (contravento e popa) é um percurso convencional em volta de marcas de barlavento e sotavento, em que o percurso da corrida é composto por 50% de pernas de contravento e 50% de pernas de popa.\nDurante a corrida, as pernas de contravento e de popa serão modeladas automaticamente como pernas de "percurso construído" respectivas para melhores previsões, enquanto que depois da corrida, os valores médios serão aplicados a todas as pernas.
errorWhileLoadingUserSettings=Erro ao carregar configurações do usuário: {0}
certificates=Certificados
dataBy=Dados por
@@ -1728,7 +1728,6 @@ solutionsSAPHeadline=SAP Sailing Analytics
solutionsRaceHeadline=SAP Sailing Race Manager
solutionsInSightHeadline=SAP Sail InSight
solutionsBuoyPingerHeadline=SAP Sailing Buoy Pinger
solutionsPostHeadline=Аналитика после гонки
solutionsSimulatorHeadline=Симулятор стратегии
sapInSailing=SAP в парусном спорте
contentSapInSailing1=Парусный спорт предоставляет отличную платформу для демонстрации решений SAP и беспрецедентной помощи развитию спорта. Вовлеченность SAP преобразила парусный спорт, предоставив инструменты, которые:
@@ -1757,9 +1756,6 @@ sapSailInSightReadMore=Узнать больше
sapSailingBuoyPinger=SAP Sailing Buoy Pinger
contentSapSailingBuoyPinger=Мобильное приложение SAP Sailing Buoy Pinger для смартфонов Android позволяет руководителям парусных гонок упростить позиционирование отметок и общение с установщиками отметок откуда и когда угодно. Это приложение подключается к решению SAP Sailing Analytics и позволяет руководителям гонок отслеживать географическое местоположение гоночных отметок, обеспечивая использование мобильного приложения SAP Sail InSight для яхтсменов, участвующих в регате.
sapSailingBuoyPingerReadMore=Узнать больше
postRaceAnalytics=Аналитика после гонки
contentPostRaceAnalytics1=Доступ к данным, собранным на парусных событиях, дает мореходам возможность оценить и проанализировать свои показатели, помогая разрабатывать стратегии и повышать мастерство.
contentPostRaceAnalytics2=Решения SAP Business Analytics предоставляют мореходам, тренерам, болельщикам и СМИ инструменты для просмотра и анализа исторических данных по множеству регат и гонок. SAP HANA позволяет изучать паттерны эффективности, тенденции и профили мореходов простым, быстрым и эффективным образом для оптимизации своих показателей и разработки успешных стратегий на будущие регаты.
strategySimulator=Симулятор стратегии
contentStrategySimulator=Выбор правильной стратегии может обеспечить большое конкурентное преимущество во время гонки. Симулятор стратегии упрощает определение лучшей стратегии хождения под парусом для разных атмосферных условий и водных течений. Возможность мгновенного изменения ветра и течения в симуляции позволяет легко оценить надежность стратегии даже для неопределенных погодных условий.
strategySimulatorReadMore=Узнать больше
@@ -2327,3 +2323,4 @@ orcPerformanceCurveLegTypeDescriptionWindwardLeeward=На ветре/под ве
orcPerformanceCurveLegTypeDescriptionWindwardLeewardRealLive=На ветре/под ветром (по ветру и против ветра): обычный курс вокруг наветренных и подветренных знаков, где курс гонки состоит из 50% наветренных и 50% подветренных отрезков.\nВ ходе гонки наветренные и подветренные отрезки будут автоматически моделироваться как соответствующие отрезки "конструируемого курса" для лучшего прогнозирования, а после гонки для всех этапов будут применяться усредненные значения.
errorWhileLoadingUserSettings=Ошибка при загрузке пользовательских настроек: {0}
certificates=Сертификаты
dataBy=Данные по
@@ -1728,7 +1728,6 @@ solutionsSAPHeadline=SAP Sailing Analytics
solutionsRaceHeadline=SAP Sailing Race Manager
solutionsInSightHeadline=SAP Sail InSight
solutionsBuoyPingerHeadline=SAP Sailing Buoy Pinger
solutionsPostHeadline=赛后分析
solutionsSimulatorHeadline=策略模拟器
sapInSailing=SAP in Sailing
contentSapInSailing1=SAP 凭借此航行应用提供完美的平台,向用户展示解决方案,并以前所未有的顺畅速度呈现体育赛事。 SAP 通过提供各种工具转换其在参与此项运动中获得的航行经验,这些工具:
@@ -1757,9 +1756,6 @@ sapSailInSightReadMore=了解更多
sapSailingBuoyPinger=SAP Sailing Buoy Pinger
contentSapSailingBuoyPinger=使用适用于 Android 手机的 SAP Sailing Buoy Pinger 移动应用,帆船赛赛事经理可以随时随地简化比赛航标的定位和与布标裁判的沟通。此应用与 SAP Sailing Analytics 解决方案相连,比赛经理可以跟踪其比赛航标的地理位置,并允许参赛水手使用 SAP Sail InSight 移动应用。
sapSailingBuoyPingerReadMore=了解更多
postRaceAnalytics=赛后分析
contentPostRaceAnalytics1=水手通过访问航行活动期间收集的数据评估和分析其表现,帮助他们制定策略和优化航行方案。
contentPostRaceAnalytics2=SAP Business Analytics 解决方案为水手、教练、粉丝和媒体提供跨比赛和轮次浏览和分析历史数据的工具。SAP HANA 通过简单、快速和高效的方式使其了解表现模式、趋势和水手资料,从而提高自己的表现并为今后的比赛制定成功的策略。
strategySimulator=策略模拟器
contentStrategySimulator=选择正确的策略可在比赛期间极大地提高竞争优势。策略模拟器为不同的风力条件和水流简化确定最佳的航行策略。由于可以在模拟中即时更改风和水流,即便在不确定的天气条件下,也可以轻松地评估策略的稳健性。
strategySimulatorReadMore=了解更多
@@ -2327,3 +2323,4 @@ orcPerformanceCurveLegTypeDescriptionWindwardLeeward=上风/下风(向上和
orcPerformanceCurveLegTypeDescriptionWindwardLeewardRealLive=上风/下风(向上和向下)是围绕上风和下风标记的常规航向,其中,航向由 50% 上风和 50% 的下风航段构成。\n在竞赛期间,上风和下风航段会被自动视为各自的“已构建航向”以便获取更好的预测,而在竞赛之后,平均值将应用于所有航段。
errorWhileLoadingUserSettings=加载用户设置时发生错误:{0}
certificates=证书
dataBy=数据排序方式
@@ -33,11 +33,11 @@ public class ExpeditionStartDataTest {
assertNotNull(result);
final Set<TimePoint> startTimes = new HashSet<>();
Util.addAll(result.getStartTimes(), startTimes);
assertTrue(startTimes.contains(new MillisecondsTimePoint(TIMEPOINT_FORMATTER.parse("2018-04-28T14:44:59.481+0200"))));
assertTrue(startTimes.contains(new MillisecondsTimePoint(TIMEPOINT_FORMATTER.parse("2018-04-28T14:34:59.260+0200"))));
assertTrue(startTimes.contains(new MillisecondsTimePoint(TIMEPOINT_FORMATTER.parse("2018-04-28T14:14:58.819+0200"))));
assertTrue(startTimes.contains(new MillisecondsTimePoint(TIMEPOINT_FORMATTER.parse("2018-04-28T15:29:59.740+0200"))));
assertTrue(startTimes.contains(new MillisecondsTimePoint(TIMEPOINT_FORMATTER.parse("2018-04-28T14:24:58.953+0200"))));
assertTrue(startTimes.contains(new MillisecondsTimePoint(TIMEPOINT_FORMATTER.parse("2018-04-28T14:45:00.086+0200"))));
assertTrue(startTimes.contains(new MillisecondsTimePoint(TIMEPOINT_FORMATTER.parse("2018-04-28T14:35:40.041+0200"))));
assertTrue(startTimes.contains(new MillisecondsTimePoint(TIMEPOINT_FORMATTER.parse("2018-04-28T14:14:59.424+0200"))));
assertTrue(startTimes.contains(new MillisecondsTimePoint(TIMEPOINT_FORMATTER.parse("2018-04-28T15:30:00.518+0200"))));
assertTrue(startTimes.contains(new MillisecondsTimePoint(TIMEPOINT_FORMATTER.parse("2018-04-28T14:24:59.731+0200"))));
assertEquals(34, Util.size(result.getStartLinePortFixes()));
assertEquals(34, Util.size(result.getStartLineStarboardFixes()));
}
@@ -54,13 +54,13 @@ import com.sap.sse.common.impl.MillisecondsTimePoint;
*/
public class ExpeditionCourseInferrer {
private static final Logger logger = Logger.getLogger(ExpeditionCourseInferrer.class.getName());
private static final String START_LINE_PORT_END_LAT = "Port lat";
private static final String START_LINE_PORT_END_LON = "Port lon";
private static final String START_LINE_STARBOARD_END_LAT = "Stbd lat";
private static final String START_LINE_STARBOARD_END_LON = "Stbd lon";
private static final String START_LINE_PORT_END_MARK_NAME = "Start P";
private static final String START_LINE_STARBOARD_END_MARK_NAME = "Start S";
private static final String START_LINE_CONTROL_POINT_NAME = "Start";
private static final String START_LINE_PORT_END_LAT = "port lat";
private static final String START_LINE_PORT_END_LON = "port lon";
private static final String START_LINE_STARBOARD_END_LAT = "stbd lat";
private static final String START_LINE_STARBOARD_END_LON = "stbd lon";
private static final String START_LINE_PORT_END_MARK_NAME = "start p";
private static final String START_LINE_STARBOARD_END_MARK_NAME = "start s";
private static final String START_LINE_CONTROL_POINT_NAME = "start";
private final RaceLogTrackingAdapter raceLogTrackingAdapter;
@@ -124,7 +124,7 @@ public class ExpeditionCourseInferrer {
}
private Double getColumnValue(String[] lineContentTokens, Map<String, Integer> columnsInFileFromHeader, String columnName) {
return getColumnValue(lineContentTokens, columnsInFileFromHeader.get(columnName));
return getColumnValue(lineContentTokens, columnsInFileFromHeader.get(columnName.toLowerCase()));
}
private Double getColumnValue(String[] lineContentTokens, final Integer columnIndex) {
@@ -73,10 +73,10 @@ public class WindLogParser {
}
}
private static final String COL_NAME_TRUE_WIND_SPEED = "Tws";
private static final String COL_NAME_TRUE_WIND_SPEED2 = "TW_speed";
private static final String COL_NAME_TRUE_WIND_DIRECTION = "Twd";
private static final String COL_NAME_TRUE_WIND_DIRECTION2 = "TW_Dirn";
private static final String COL_NAME_TRUE_WIND_SPEED = "tws";
private static final String COL_NAME_TRUE_WIND_SPEED2 = "tw_speed";
private static final String COL_NAME_TRUE_WIND_DIRECTION = "twd";
private static final String COL_NAME_TRUE_WIND_DIRECTION2 = "tw_dirn";
private static final String COL_NAME_LAT = ExpeditionExtendedDataImporterImpl.COL_NAME_LAT;
private static final String COL_NAME_LON = ExpeditionExtendedDataImporterImpl.COL_NAME_LON;
@@ -49,17 +49,17 @@ import com.sap.sse.common.impl.MillisecondsTimePoint;
public class ExpeditionExtendedDataImporterImpl extends AbstractDoubleVectorFixImporter
implements DoubleVectorFixImporter {
private static final Logger logger = Logger.getLogger(ExpeditionExtendedDataImporterImpl.class.getName());
private static final String ORIGINAL_POSITION_HEADER = "Pos[ddd.dd]";
public static final String BOAT_COL = "Boat";
public static final String COL_NAME_LAT = "Lat";
public static final String COL_NAME_LON = "Lon";
private static final String UTC_COLUMN = "Utc";
private static final String ORIGINAL_POSITION_HEADER = "pos[ddd.dd]";
public static final String BOAT_COL = "boat";
public static final String COL_NAME_LAT = "lat";
public static final String COL_NAME_LON = "lon";
private static final String UTC_COLUMN = "utc";
private static final String DATE_COLUMN_1 = "dd/mm/yy";
private static final String DATE_COLUMN_1_PATTERN = "dd/MM/yy";
private static final String DATE_COLUMN_2 = "mm/dd/yy";
private static final String DATE_COLUMN_2_PATTERN = "MM/dd/yy";
private static final String TIME_COLUMN = "hhmmss";
private static final String GPS_TIME_COLUMN = "GPS Time"; // FIXME this has to be "GPS time" with a lowercase t but then we need to handle all these odd values...
private static final String GPS_TIME_COLUMN = "gps time"; // FIXME this has to be "GPS time" with a lowercase t but then we need to handle all these odd values...
private static final Pattern BOAT_CHECK_PATTERN = Pattern.compile("[1-9]?[0-9]");
private final Map<String, Integer> columnNamesInFileAndTheirValueIndexInResultingDoubleVectorFix;
/**
@@ -140,12 +140,13 @@ public class ExpeditionExtendedDataImporterImpl extends AbstractDoubleVectorFixI
}
/**
* When the header contains one or more occurrences of
* {@link #ORIGINAL_POSITION_HEADER}, it is substituted by the two header
* columns {@link #COL_NAME_LAT} and {@link #COL_NAME_LON} because that's
* how positions are stored in Expedition files: as two comma-separated
* values, one for latitude, another for longitude, although there is only
* When the header contains one or more occurrences of {@link #ORIGINAL_POSITION_HEADER}, it is substituted by the
* two header columns {@link #COL_NAME_LAT} and {@link #COL_NAME_LON} because that's how positions are stored in
* Expedition files: as two comma-separated values, one for latitude, another for longitude, although there is only
* one header field.
* <p>
*
* All header column names will be stored in the resulting map's key set as lowercase.
*/
public static Map<String, Integer> parseHeader(String headerLine) {
final String[] headerTokens = split(headerLine);
@@ -153,11 +154,11 @@ public class ExpeditionExtendedDataImporterImpl extends AbstractDoubleVectorFixI
int columnInResultingHeader = 0;
for (int columnInHeader = 0; columnInHeader < headerTokens.length; columnInHeader++) {
String header = headerTokens[columnInHeader];
if (header.equals(ORIGINAL_POSITION_HEADER)) {
colIndicesInFile.put(COL_NAME_LAT, columnInResultingHeader++);
colIndicesInFile.put(COL_NAME_LON, columnInResultingHeader++);
if (header.toLowerCase().equals(ORIGINAL_POSITION_HEADER)) {
colIndicesInFile.put(COL_NAME_LAT.toLowerCase(), columnInResultingHeader++);
colIndicesInFile.put(COL_NAME_LON.toLowerCase(), columnInResultingHeader++);
} else {
colIndicesInFile.put(header, columnInResultingHeader++);
colIndicesInFile.put(header.toLowerCase(), columnInResultingHeader++);
}
}
return colIndicesInFile;
@@ -255,10 +256,19 @@ public class ExpeditionExtendedDataImporterImpl extends AbstractDoubleVectorFixI
final TimePoint timePoint;
final String date;
final String dateFormatPattern;
if (columnsInFileFromHeader.containsKey(GPS_TIME_COLUMN) && !lineContentTokens[columnsInFileFromHeader.get(GPS_TIME_COLUMN)].trim().isEmpty()) {
timePoint = getTimePoint(lineContentTokens[columnsInFileFromHeader.get(GPS_TIME_COLUMN)]);
} else if (columnsInFileFromHeader.containsKey(UTC_COLUMN) && !lineContentTokens[columnsInFileFromHeader.get(UTC_COLUMN)].trim().isEmpty()) {
timePoint = getTimePoint(lineContentTokens[columnsInFileFromHeader.get(UTC_COLUMN)]);
final Integer gpsTimeColumnIndex = columnsInFileFromHeader.get(GPS_TIME_COLUMN);
final String time_ExcelEpoch = gpsTimeColumnIndex == null ? null : lineContentTokens[gpsTimeColumnIndex];
final Integer utcColumnIndex = columnsInFileFromHeader.get(UTC_COLUMN);
final String utc = utcColumnIndex == null ? null : lineContentTokens[utcColumnIndex];
if (time_ExcelEpoch != null && !time_ExcelEpoch.trim().isEmpty()) {
if (Double.valueOf(time_ExcelEpoch) < 1 && utc != null &&
!utc.trim().isEmpty()) { // then it seems to be only the fractional time of the day; try to add UTC day:
timePoint = getTimePoint(""+(Double.valueOf(utc.trim()).intValue()+Double.valueOf(time_ExcelEpoch)));
} else {
timePoint = getTimePoint(time_ExcelEpoch);
}
} else if (utc != null && !utc.trim().isEmpty()) {
timePoint = getTimePoint(lineContentTokens[utcColumnIndex]);
} else if (columnsInFileFromHeader.containsKey(DATE_COLUMN_1) && !lineContentTokens[columnsInFileFromHeader.get(DATE_COLUMN_1)].trim().isEmpty()
|| columnsInFileFromHeader.containsKey(DATE_COLUMN_2) && !lineContentTokens[columnsInFileFromHeader.get(DATE_COLUMN_2)].trim().isEmpty()) {
if (columnsInFileFromHeader.containsKey(DATE_COLUMN_1)) {