/*
* ESRITileFactory.java
*
* Created on November 7, 2006, 10:51 AM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package org.jdesktop.swingx.mapviewer.esri;
import java.awt.geom.Point2D;
import java.math.BigDecimal;
import java.math.RoundingMode;
import org.jdesktop.swingx.mapviewer.DefaultTileFactory;
import org.jdesktop.swingx.mapviewer.GeoPosition;
import org.jdesktop.swingx.mapviewer.TileFactoryInfo;
import org.jdesktop.swingx.mapviewer.util.GeoUtil;
/**
* @author rbair
*/
public class ESRITileFactory extends DefaultTileFactory
{
private static final String projection = "8"; // mercator projection
private static final String format = "png"; // get pngs back
private String userId;
private String datasource; // should be enum
/** Creates a new instance of ESRITileFactory */
public ESRITileFactory()
{
super(new ESRITileProviderInfo());
((ESRITileProviderInfo) super.getInfo()).factory = this;
datasource = "ArcWeb:TA.Streets.NA";
}
/**
* @param id the ESRI user id
*/
public void setUserID(String id)
{
this.userId = id;
}
private static final class ESRITileProviderInfo extends TileFactoryInfo
{
private ESRITileFactory factory;
private ESRITileProviderInfo()
{
super(0, 17, 18, 256, false, true, "http://www.arcwebservices.com/services/v2006/restmap?actn=getMap", "","", "");
}
@Override
public String getTileUrl(int x, int y, int zoom)
{
// "&usrid=&ds=&c=-117.1817|34.0556&sf=52500&fmt=&ocs=";
// System.out.println("getting tile at zoom: " + zoom);
// System.out.println("map width at zoom = " + getMapWidthInTilesAtZoom(zoom));
// provide the center point of the tile, in lat/long coords
int tileY = y;
int tileX = x;
int pixelX = tileX * factory.getTileSize(zoom) + (factory.getTileSize(zoom) / 2);
int pixelY = tileY * factory.getTileSize(zoom) + (factory.getTileSize(zoom) / 2);
GeoPosition latlong = GeoUtil.getPosition(new Point2D.Double(pixelX, pixelY), zoom, this);
// Chris is going to hate me for this (relying on 72dpi!), but:
// 72 pixels per inch. The earth is 24,859.82 miles in circumference, at the equator.
// Thus, the earth is 24,859.82 * 5280 * 12 * 72 pixels in circumference.
double numFeetPerDegreeLong = 24859.82 * 5280 / 360; // the number of feet per degree longitude at the
// equator
double numPixelsPerDegreeLong = getLongitudeDegreeWidthInPixels(zoom);
double numPixelsPerFoot = 96 * 12;
int sf = (int) (numFeetPerDegreeLong / (numPixelsPerDegreeLong / numPixelsPerFoot));
// round lat and long to 5 decimal places
BigDecimal lat = new BigDecimal(latlong.getLatitude());
BigDecimal lon = new BigDecimal(latlong.getLongitude());
lat = lat.setScale(5, RoundingMode.DOWN);
lon = lon.setScale(5, RoundingMode.DOWN);
System.out.println("Tile : [" + tileX + ", " + tileY + "]");
System.out.println("Pixel : [" + pixelX + ", " + pixelY + "]");
System.out.println("Lat/Long : [" + latlong.getLatitude() + ", " + latlong.getLongitude() + "]");
System.out.println("Lat2/Long2: [" + lat.doubleValue() + ", " + lon.doubleValue() + "]");
String url = baseURL + "&usrid=" + factory.userId + "&ds=" + factory.datasource + "&c=" + lon.doubleValue()
+ "%7C" + lat.doubleValue() + "&sf=" + sf + // 52500" +
"&fmt=" + format + "&ocs=" + projection;
System.out.println("the URL: " + url);
return url;
}
}
}