Search in sources :

Example 11 with IllegalGeoPositionException

use of org.jdesktop.swingx.mapviewer.IllegalGeoPositionException in project hale by halestudio.

the class CustomWaypointPainter method findWaypoint.

/**
 * Find a way-point at a given position
 *
 * @param point the position
 * @return the way-point
 */
public W findWaypoint(Point point) {
    Rectangle viewPort = getMapKit().getMainMap().getViewportBounds();
    // the overlap is the reason why
    final int overlap = getMaxOverlap();
    // the point is used instead of
    // a GeoPosition
    final int x = viewPort.x + point.x;
    final int y = viewPort.y + point.y;
    final int zoom = getMapKit().getMainMap().getZoom();
    final PixelConverter converter = getMapKit().getMainMap().getTileFactory().getTileProvider().getConverter();
    final Dimension mapSize = TileProviderUtils.getMapSize(getMapKit().getMainMap().getTileFactory().getTileProvider(), zoom);
    final int width = mapSize.width * getMapKit().getMainMap().getTileFactory().getTileProvider().getTileWidth(zoom);
    final int height = mapSize.height * getMapKit().getMainMap().getTileFactory().getTileProvider().getTileHeight(zoom);
    final GeoPosition topLeft = converter.pixelToGeo(new Point(Math.max(x - overlap, 0), Math.max(y - overlap, 0)), zoom);
    final GeoPosition bottomRight = converter.pixelToGeo(new Point(Math.min(x + overlap, width), Math.min(y + overlap, height)), zoom);
    BoundingBox searchBox;
    try {
        searchBox = createSearchBB(topLeft, bottomRight);
        Set<W> wps = waypoints.query(searchBox, new Verifier<W, BoundingBox>() {

            @Override
            public boolean verify(W wp, BoundingBox box) {
                try {
                    Point2D wpPixel = converter.geoToPixel(wp.getPosition(), zoom);
                    int relX = x - (int) wpPixel.getX();
                    int relY = y - (int) wpPixel.getY();
                    Area area = wp.getMarker().getArea(zoom);
                    if (area != null && area.contains(relX, relY)) {
                        // match
                        return true;
                    }
                } catch (IllegalGeoPositionException e) {
                    // $NON-NLS-1$
                    log.debug("Error converting waypoint position", e);
                }
                return false;
            }
        });
        if (wps == null || wps.isEmpty()) {
            return null;
        } else {
            if (wps.size() == 1) {
                return wps.iterator().next();
            } else {
                List<W> sorted = new ArrayList<W>(wps);
                Collections.sort(sorted, new Comparator<W>() {

                    @Override
                    public int compare(W o1, W o2) {
                        double a1 = o1.getMarker().getArea(zoom).getArea();
                        double a2 = o2.getMarker().getArea(zoom).getArea();
                        // compare size
                        if (a1 < a2) {
                            return -1;
                        } else if (a2 < a1) {
                            return 1;
                        } else {
                            return 0;
                        }
                    }
                });
                return sorted.get(0);
            }
        }
    } catch (IllegalGeoPositionException e) {
        return null;
    }
}
Also used : Rectangle(java.awt.Rectangle) ArrayList(java.util.ArrayList) IllegalGeoPositionException(org.jdesktop.swingx.mapviewer.IllegalGeoPositionException) Dimension(java.awt.Dimension) Point(java.awt.Point) Point(java.awt.Point) Area(de.fhg.igd.mapviewer.marker.area.Area) Point2D(java.awt.geom.Point2D) BoundingBox(de.fhg.igd.geom.BoundingBox) PixelConverter(org.jdesktop.swingx.mapviewer.PixelConverter) GeoPosition(org.jdesktop.swingx.mapviewer.GeoPosition)

Example 12 with IllegalGeoPositionException

use of org.jdesktop.swingx.mapviewer.IllegalGeoPositionException in project hale by halestudio.

the class CustomWaypointPainter method findWaypoints.

/**
 * Find way-points in a rectangular area defined by the given
 * {@link GeoPosition}s
 *
 * @param topLeft the top left position
 * @param bottomRight the bottom right position
 * @param worldRect the bounding box in world pixel coordinates
 * @param converter the pixel converter
 * @param zoom the zoom level
 *
 * @return the way-points in the area
 */
public Set<W> findWaypoints(GeoPosition topLeft, GeoPosition bottomRight, final Rectangle worldRect, final PixelConverter converter, final int zoom) {
    BoundingBox searchBox;
    try {
        searchBox = createSearchBB(topLeft, bottomRight);
        final BoundingBox verifyBox = searchBox;
        Set<W> wps = waypoints.query(searchBox, new Verifier<W, BoundingBox>() {

            @Override
            public boolean verify(W wp, BoundingBox second) {
                try {
                    Point2D wpPixel = converter.geoToPixel(wp.getPosition(), zoom);
                    int dx = (int) wpPixel.getX();
                    int dy = (int) wpPixel.getY();
                    worldRect.translate(-dx, -dy);
                    try {
                        Area area = wp.getMarker().getArea(zoom);
                        if (area != null) {
                            return area.containedIn(worldRect);
                        } else {
                            // not be selected
                            return false;
                        }
                    } finally {
                        worldRect.translate(dx, dy);
                    }
                } catch (IllegalGeoPositionException e) {
                    log.warn("Could not convert waypoint position to pixel", e);
                    // fall back to simple method
                    return verifyBox.covers(wp.getBoundingBox());
                }
            }
        });
        if (wps == null) {
            return new HashSet<W>();
        } else {
            return wps;
        }
    } catch (IllegalGeoPositionException e) {
        return new HashSet<W>();
    }
}
Also used : Area(de.fhg.igd.mapviewer.marker.area.Area) Point2D(java.awt.geom.Point2D) BoundingBox(de.fhg.igd.geom.BoundingBox) IllegalGeoPositionException(org.jdesktop.swingx.mapviewer.IllegalGeoPositionException) HashSet(java.util.HashSet)

Example 13 with IllegalGeoPositionException

use of org.jdesktop.swingx.mapviewer.IllegalGeoPositionException in project hale by halestudio.

the class SelectableWaypoint method getBoundingBox.

/**
 * @see Localizable#getBoundingBox()
 */
@Override
public BoundingBox getBoundingBox() {
    if (box == null) {
        GeoPosition pos;
        try {
            pos = GeotoolsConverter.getInstance().convert(getPosition(), COMMON_EPSG);
            box = new BoundingBox(pos.getX() - POSITION_EXPAND, pos.getY() - POSITION_EXPAND, 0.0, pos.getX() + POSITION_EXPAND, pos.getY() + POSITION_EXPAND, 1.0);
        } catch (IllegalGeoPositionException e) {
            // $NON-NLS-1$
            log.warn("Error creating bounding box for waypoint");
        }
    }
    return box;
}
Also used : BoundingBox(de.fhg.igd.geom.BoundingBox) GeoPosition(org.jdesktop.swingx.mapviewer.GeoPosition) IllegalGeoPositionException(org.jdesktop.swingx.mapviewer.IllegalGeoPositionException)

Aggregations

IllegalGeoPositionException (org.jdesktop.swingx.mapviewer.IllegalGeoPositionException)13 GeoPosition (org.jdesktop.swingx.mapviewer.GeoPosition)8 Point (java.awt.Point)7 BoundingBox (de.fhg.igd.geom.BoundingBox)6 Point2D (java.awt.geom.Point2D)6 Rectangle (java.awt.Rectangle)4 Area (de.fhg.igd.mapviewer.marker.area.Area)3 HashSet (java.util.HashSet)3 PixelConverter (org.jdesktop.swingx.mapviewer.PixelConverter)3 ArrayList (java.util.ArrayList)2 SelectableWaypoint (de.fhg.igd.mapviewer.waypoints.SelectableWaypoint)1 Dimension (java.awt.Dimension)1 Graphics2D (java.awt.Graphics2D)1 Polygon (java.awt.Polygon)1 Rectangle2D (java.awt.geom.Rectangle2D)1 BufferedImage (java.awt.image.BufferedImage)1 Length (javax.measure.quantity.Length)1 GeotoolsConverter (org.jdesktop.swingx.mapviewer.GeotoolsConverter)1 CoordinateSystem (org.opengis.referencing.cs.CoordinateSystem)1 CoordinateSystemAxis (org.opengis.referencing.cs.CoordinateSystemAxis)1