All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jxmapviewer.viewer.esri.ESRITileFactory Maven / Gradle / Ivy

There is a newer version: 2.8
Show newest version
/*
 * 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.jxmapviewer.viewer.esri;

import java.awt.geom.Point2D;
import java.math.BigDecimal;
import java.math.RoundingMode;

import org.jxmapviewer.viewer.DefaultTileFactory;
import org.jxmapviewer.viewer.GeoPosition;
import org.jxmapviewer.viewer.TileFactoryInfo;
import org.jxmapviewer.viewer.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;
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy