dk.dma.epd.ship.layers.intendedroute.IntendedRouteLayer.java Source code

Java tutorial

Introduction

Here is the source code for dk.dma.epd.ship.layers.intendedroute.IntendedRouteLayer.java

Source

/* Copyright (c) 2011 Danish Maritime Authority.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package dk.dma.epd.ship.layers.intendedroute;

import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import java.util.Date;

import org.joda.time.DateTime;

import com.bbn.openmap.omGraphics.OMGraphic;

import dk.dma.enav.model.geometry.Position;
import dk.dma.epd.common.Heading;
import dk.dma.epd.common.prototype.gui.util.InfoPanel;
import dk.dma.epd.common.prototype.layers.intendedroute.IntendedRouteLayerCommon;
import dk.dma.epd.common.prototype.layers.intendedroute.IntendedRouteLegGraphic;
import dk.dma.epd.common.prototype.layers.intendedroute.IntendedRouteWpCircle;
import dk.dma.epd.common.prototype.model.route.ActiveRoute;
import dk.dma.epd.common.prototype.model.route.IntendedRoute;
import dk.dma.epd.common.prototype.model.route.RouteLeg;
import dk.dma.epd.common.prototype.model.route.RouteWaypoint;
import dk.dma.epd.common.prototype.sensor.pnt.PntTime;
import dk.dma.epd.common.util.Calculator;
import dk.dma.epd.common.util.Converter;
import dk.dma.epd.ship.EPDShip;

public class IntendedRouteLayer extends IntendedRouteLayerCommon {

    private static final long serialVersionUID = 3001820678205337239L;

    private IntendedRouteComparisonGraphics comparisonLine;

    /**
     * {@inheritDoc}
     */
    @Override
    protected boolean initInfoPanel(InfoPanel infoPanel, OMGraphic newClosest, MouseEvent evt,
            Point containerPoint) {
        intendedRouteInfoPanel.setVisible(false);
        graphics.remove(comparisonLine);

        if (newClosest instanceof IntendedRouteWpCircle) {

            IntendedRouteWpCircle routeWP = (IntendedRouteWpCircle) newClosest;

            highlightIntendedRoute(((IntendedRouteWpCircle) newClosest).getIntendedRouteGraphic());

            if (routeWP.getIndex() >= routeWP.getIntendedRouteGraphic().getIntendedRoute().getActiveWpIndex()) {
                intendedRouteInfoPanel.showWpInfo((IntendedRouteWpCircle) newClosest);
            } else {
                return false;
            }

        } else {

            if (newClosest instanceof IntendedRouteLegGraphic) {
                // lets user see ETA continually along route leg

                highlightIntendedRoute(((IntendedRouteLegGraphic) newClosest).getIntendedRouteGraphic());

                Point2D worldLocation = chartPanel.getMap().getProjection().inverse(evt.getPoint());

                IntendedRouteLegGraphic selectedLegGraphics = (IntendedRouteLegGraphic) newClosest;
                int legIndex = ((IntendedRouteLegGraphic) newClosest).getIndex();

                IntendedRoute routeData = ((IntendedRouteLegGraphic) newClosest).getIntendedRouteGraphic()
                        .getIntendedRoute();

                ActiveRoute activeRoute = EPDShip.getInstance().getRouteManager().getActiveRoute();

                Position activeRoutePosition = null;

                closest = dummyCircle;

                if (activeRoute != null) {

                    if (legIndex - 1 < routeData.getActiveWpIndex() && !selectedLegGraphics.isActiveWpLine()) {
                        // System.out.println("Not showing comparison line! "
                        // + selectedLegGraphics.isActiveWpLine());
                        return false;
                    }

                    RouteWaypoint startWp;
                    RouteLeg leg;
                    Position startPos;
                    Position midPos;
                    double midRange;
                    Date startEta;

                    DateTime intendedRouteETA = null;

                    if (selectedLegGraphics.isActiveWpLine()) {
                        // System.out.println("Active WP Line");
                        // leg = startWp.getOutLeg();

                        startPos = EPDShip.getInstance().getAisHandler().getVesselTarget(routeData.getMmsi())
                                .getPositionData().getPos();

                        midPos = Position.create(worldLocation.getY(), worldLocation.getX());

                        midRange = Calculator.range(startPos, midPos, Heading.RL);

                        startEta = PntTime.getDate();

                        Date endEta = routeData.getEtas().get(routeData.getActiveWpIndex());

                        long milisecondsTravelTime = endEta.getTime() - startEta.getTime();

                        Position endPosition = routeData.getWaypoints().get(routeData.getActiveWpIndex()).getPos();

                        double lengthToTravel = Calculator.range(startPos, endPosition, Heading.RL);

                        double speed = (lengthToTravel / milisecondsTravelTime) * 1000 * 60 * 60;

                        intendedRouteETA = new DateTime((long) (midRange / speed * 3600000 + startEta.getTime()));

                    } else {
                        startWp = routeData.getWaypoints().get(routeData.getActiveWpIndex());
                        leg = startWp.getOutLeg();

                        startPos = startWp.getPos();
                        midPos = Position.create(worldLocation.getY(), worldLocation.getX());
                        midRange = Calculator.range(startPos, midPos, leg.getHeading());

                        startEta = routeData.getEtas().get(routeData.getActiveWpIndex());

                        intendedRouteETA = new DateTime(
                                (long) (midRange / leg.getSpeed() * 3600000 + startEta.getTime()));

                    }

                    activeRoutePosition = findPositionActiveRoute(intendedRouteETA);

                    if (activeRoutePosition != null) {

                        // Draw it
                        Position intendedRoutePosition = Position.create(worldLocation.getY(),
                                worldLocation.getX());

                        comparisonLine = new IntendedRouteComparisonGraphics(activeRoutePosition,
                                intendedRoutePosition);
                        graphics.add(comparisonLine);
                        doPrepare();

                    }

                }

                if (legIndex - 1 < routeData.getActiveWpIndex() && !selectedLegGraphics.isActiveWpLine()) {

                    return false;
                } else {

                    if (activeRoutePosition == null) {
                        intendedRouteInfoPanel.showLegInfo((IntendedRouteLegGraphic) newClosest, worldLocation);
                    } else {
                        intendedRouteInfoPanel.showLegInfo((IntendedRouteLegGraphic) newClosest, worldLocation,
                                activeRoutePosition);
                    }
                }

            }
        }
        return true;
        // return super.initInfoPanel(infoPanel, newClosest, evt,
        // containerPoint);

    }

    private Position findPositionActiveRoute(DateTime intendedRouteETA) {

        // System.out.println("Where are we at " + intendedRouteETA);

        ActiveRoute activeRoute = EPDShip.getInstance().getRouteManager().getActiveRoute();

        // The ETA of the time is before we start our active route, or after the
        // last waypoint date
        if (intendedRouteETA.isBefore(new DateTime(activeRoute.getEtas().get(0).getTime()))

                || intendedRouteETA.isAfter(
                        new DateTime(activeRoute.getEtas().get(activeRoute.getEtas().size() - 1).getTime()))) {

            return null;
        }

        // Find leg we're on

        // Find start WP
        int startWP = activeRoute.getActiveWaypointIndex();
        if (startWP < 0) {
            startWP = 0;
        }

        for (int i = startWP; i < activeRoute.getWaypoints().size(); i++) {

            RouteWaypoint currentWaypoint = activeRoute.getWaypoints().get(i);

            // We are in the route
            if (new DateTime(activeRoute.getEtas().get(i).getTime()).isBefore(intendedRouteETA)) {

                // Do we have an out leg
                if (currentWaypoint.getOutLeg() != null) {

                    if (new DateTime(activeRoute.getEtas().get(i + 1).getTime()).isAfter(intendedRouteETA)) {

                        // Time Left in route
                        // long secondsSailTime = (activeRoute.getEtas()
                        // .get(i + 1).getTime() - intendedRouteETA
                        // .getMillis()) / 1000;

                        long secondsSailTime = intendedRouteETA.minus(activeRoute.getEtas().get(i).getTime())
                                .getMillis() / 1000;

                        // System.out.println(intendedRouteETA.minus(
                        // activeRoute.getEtas().get(i).getTime())
                        // .getMillis() / 1000 / 60);

                        // secondsSailTime = totalTime - secondsSailTime;

                        // System.out.println("We have travelled for "
                        // + secondsSailTime / 60);

                        Date startEta = activeRoute.getEtas().get(i);
                        Date endEta = activeRoute.getEtas().get(i + 1);

                        // Try and calculate the speed
                        long milisecondsTravelTime = endEta.getTime() - startEta.getTime();

                        Position startPos = activeRoute.getWaypoints().get(i).getPos();
                        //
                        Position endPosition = activeRoute.getWaypoints().get(i + 1).getPos();
                        //

                        double lengthToTravel = Calculator.range(startPos, endPosition, Heading.RL);

                        double speed = (lengthToTravel / milisecondsTravelTime) * 1000 * 60 * 60;

                        double distanceTravelled = Calculator.distanceAfterTimeMph(speed, secondsSailTime);

                        return Calculator.findPosition(currentWaypoint.getPos(),
                                currentWaypoint.getOutLeg().calcBrg(), Converter.nmToMeters(distanceTravelled));

                    }
                }
            }
        }

        // Test the leg going from own ships current position to wp 0;
        // We are in the route
        if (new DateTime(PntTime.getDate()).isBefore(intendedRouteETA)) {

            if (new DateTime(activeRoute.getEtas().get(activeRoute.getActiveWaypointIndex()).getTime())
                    .isAfter(intendedRouteETA)) {

                // Time Left in route
                // long secondsSailTime = (activeRoute.getEtas()
                // .get(i + 1).getTime() - intendedRouteETA
                // .getMillis()) / 1000;

                long secondsSailTime = intendedRouteETA.minus(PntTime.getDate().getTime()).getMillis() / 1000;
                //

                // System.out.println(intendedRouteETA.minus(
                // activeRoute.getEtas().get(i).getTime())
                // .getMillis() / 1000 / 60);

                // secondsSailTime = totalTime - secondsSailTime;

                // System.out.println("We have travelled for "
                // + secondsSailTime / 60);

                Date startEta = PntTime.getDate();
                Date endEta = activeRoute.getEtas().get(activeRoute.getActiveWaypointIndex());

                // Try and calculate the speed
                long milisecondsTravelTime = endEta.getTime() - startEta.getTime();

                Position startPos = EPDShip.getInstance().getPosition();
                //
                Position endPosition = activeRoute.getWaypoints().get(activeRoute.getActiveWaypointIndex())
                        .getPos();
                //

                double lengthToTravel = Calculator.range(startPos, endPosition, Heading.RL);

                double speed = (lengthToTravel / milisecondsTravelTime) * 1000 * 60 * 60;

                double distanceTravelled = Calculator.distanceAfterTimeMph(speed, secondsSailTime);

                return Calculator.findPosition(startPos, Calculator.bearing(startPos, endPosition, Heading.RL),
                        Converter.nmToMeters(distanceTravelled));

            }
        }

        return null;

    }

    @Override
    public boolean mouseMoved(MouseEvent evt) {

        if (!isVisible() || mapMenu == null || mapMenu.isVisible()) {
            return false;
        }

        if (!infoPanels.isEmpty()) {
            OMGraphic newClosest = getSelectedGraphic(infoPanelsGraphics, evt, infoPanels.getGraphicsList());

            if (newClosest == null) {
                // Remove the line
                if (comparisonLine != null) {

                    graphics.remove(comparisonLine);
                    doPrepare();
                }
            }
        }

        return super.mouseMoved(evt);
    }

}