mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-13 00:57:31 -05:00
145 lines
4.0 KiB
Java
145 lines
4.0 KiB
Java
/*
|
|
* TileFactory.java
|
|
*
|
|
* Created on March 17, 2006, 8:01 PM
|
|
*
|
|
* To change this template, choose Tools | Template Manager
|
|
* and open the template in the editor.
|
|
*/
|
|
|
|
package org.jdesktop.swingx.mapviewer;
|
|
|
|
import java.awt.Dimension;
|
|
import java.awt.geom.Point2D;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
import org.jdesktop.swingx.mapviewer.util.GeoUtil;
|
|
|
|
/**
|
|
* A class that can produce tiles and convert coordinates to pixels
|
|
* @author joshy
|
|
*/
|
|
public abstract class TileFactory
|
|
{
|
|
private TileFactoryInfo info;
|
|
private List<TileListener> tileListeners = new ArrayList<TileListener>();
|
|
|
|
/**
|
|
* Creates a new instance of TileFactory
|
|
* @param info a TileFactoryInfo to configure this TileFactory
|
|
*/
|
|
protected TileFactory(TileFactoryInfo info)
|
|
{
|
|
this.info = info;
|
|
}
|
|
|
|
/**
|
|
* Gets the size of an edge of a tile in pixels at the current zoom level. Tiles must be square.
|
|
* @param zoom the current zoom level
|
|
* @return the size of an edge of a tile in pixels
|
|
*/
|
|
public int getTileSize(int zoom)
|
|
{
|
|
return getInfo().getTileSize(zoom);
|
|
}
|
|
|
|
/**
|
|
* Returns a Dimension containing the width and height of the map, in tiles at the current zoom level. So a
|
|
* Dimension that returns 10x20 would be 10 tiles wide and 20 tiles tall. These values can be multipled by
|
|
* getTileSize() to determine the pixel width/height for the map at the given zoom level
|
|
* @return the size of the world bitmap in tiles
|
|
* @param zoom the current zoom level
|
|
*/
|
|
public Dimension getMapSize(int zoom)
|
|
{
|
|
return GeoUtil.getMapSize(zoom, getInfo());
|
|
}
|
|
|
|
/**
|
|
* Return the Tile at a given TilePoint and zoom level
|
|
* @return the tile that is located at the given tilePoint for this zoom level. For example, if getMapSize() returns
|
|
* 10x20 for this zoom, and the tilePoint is (3,5), then the appropriate tile will be located and returned. This
|
|
* method must not return null. However, it can return dummy tiles that contain no data if it wants. This is
|
|
* appropriate, for example, for tiles which are outside of the bounds of the map and if the factory doesn't
|
|
* implement wrapping.
|
|
* @param x the x value
|
|
* @param y the y value
|
|
* @param zoom the current zoom level
|
|
*/
|
|
public abstract Tile getTile(int x, int y, int zoom);
|
|
|
|
/**
|
|
* Convert a pixel in the world bitmap at the specified zoom level into a GeoPosition
|
|
* @param pixelCoordinate a Point2D representing a pixel in the world bitmap
|
|
* @param zoom the zoom level of the world bitmap
|
|
* @return the converted GeoPosition
|
|
*/
|
|
public GeoPosition pixelToGeo(Point2D pixelCoordinate, int zoom)
|
|
{
|
|
return GeoUtil.getPosition(pixelCoordinate, zoom, getInfo());
|
|
}
|
|
|
|
/**
|
|
* Convert a GeoPosition to a pixel position in the world bitmap a the specified zoom level.
|
|
* @param c a GeoPosition
|
|
* @param zoomLevel the zoom level to extract the pixel coordinate for
|
|
* @return the pixel point
|
|
*/
|
|
public Point2D geoToPixel(GeoPosition c, int zoomLevel)
|
|
{
|
|
return GeoUtil.getBitmapCoordinate(c, zoomLevel, getInfo());
|
|
}
|
|
|
|
/**
|
|
* Get the TileFactoryInfo describing this TileFactory
|
|
* @return a TileFactoryInfo
|
|
*/
|
|
public TileFactoryInfo getInfo()
|
|
{
|
|
return info;
|
|
}
|
|
|
|
/**
|
|
* Adds a tile listener
|
|
* @param listener the listener
|
|
*/
|
|
public void addTileListener(TileListener listener)
|
|
{
|
|
tileListeners.add(listener);
|
|
}
|
|
|
|
/**
|
|
* Removes a tile listener
|
|
* @param listener the listener
|
|
*/
|
|
public void removeTileListener(TileListener listener)
|
|
{
|
|
tileListeners.remove(listener);
|
|
}
|
|
|
|
/**
|
|
* Disposes this TileFactory
|
|
*/
|
|
public abstract void dispose();
|
|
|
|
/**
|
|
* Notifies all tile listeners
|
|
* @param tile the tile
|
|
*/
|
|
protected void fireTileLoadedEvent(Tile tile)
|
|
{
|
|
for (TileListener listener : tileListeners)
|
|
{
|
|
listener.tileLoaded(tile);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Override this method to load the tile using, for example, an <code>ExecutorService</code>.
|
|
* @param tile The tile to load.
|
|
*/
|
|
protected abstract void startLoading(Tile tile);
|
|
|
|
}
|