package com.revolsys.record.io.format.esri.rest.map;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.revolsys.collection.map.MapEx;
import com.revolsys.geometry.model.GeometryFactory;
import com.revolsys.geometry.model.Point;
import com.revolsys.properties.BaseObjectWithProperties;
import com.revolsys.record.io.format.esri.rest.ArcGisResponse;
import com.revolsys.record.io.format.esri.rest.CatalogElement;
import com.revolsys.spring.resource.UrlResource;
import com.revolsys.webservice.WebService;
import com.revolsys.webservice.WebServiceResource;
public class TileInfo extends BaseObjectWithProperties implements CatalogElement {
private double originX = Double.NaN;
private double originY = Double.NaN;
private MapService mapService;
private GeometryFactory geometryFactory;
private int compressionQuality;
private int dpi;
private String format;
private int rows;
private int cols;
private List<LevelOfDetail> levelOfDetails = new ArrayList<>();
public TileInfo() {
}
public int getCols() {
return this.cols;
}
public int getCompressionQuality() {
return this.compressionQuality;
}
public int getDpi() {
return this.dpi;
}
public String getFormat() {
return this.format;
}
public GeometryFactory getGeometryFactory() {
return this.geometryFactory;
}
@Override
public String getIconName() {
return "map";
}
public LevelOfDetail getLevelOfDetail(final int zoomLevel) {
final List<LevelOfDetail> levelOfDetails = getLevelOfDetails();
for (final LevelOfDetail levelOfDetail : levelOfDetails) {
final Integer level = levelOfDetail.getLevel();
if (level == zoomLevel) {
return levelOfDetail;
}
}
return null;
}
public List<LevelOfDetail> getLevelOfDetails() {
return this.levelOfDetails;
}
public MapService getMapService() {
return this.mapService;
}
public double getModelHeight(final int zoomLevel) {
return getModelValue(zoomLevel, getRows());
}
public double getModelValue(final int zoomLevel, final int pixels) {
final LevelOfDetail levelOfDetail = getLevelOfDetail(zoomLevel);
final double modelValue = pixels * levelOfDetail.getResolution();
return modelValue;
}
public double getModelWidth(final int zoomLevel) {
return getModelValue(zoomLevel, getCols());
}
@Override
public String getName() {
return "Tile Cache";
}
public Point getOriginPoint() {
if (Double.isNaN(this.originX)) {
return null;
} else {
final GeometryFactory spatialReference = getGeometryFactory();
return spatialReference.point(this.originX, this.originY);
}
}
public double getOriginX() {
return this.originX;
}
public double getOriginY() {
return this.originY;
}
@SuppressWarnings("unchecked")
@Override
public <R extends WebServiceResource> R getParent() {
return (R)this.mapService;
}
@Override
public String getPathElement() {
return "tile";
}
public double getPixelSize() {
final int dpi = getDpi();
final double pixelSize = 0.0254 / dpi;
return pixelSize;
}
public int getRows() {
return this.rows;
}
@Override
public UrlResource getServiceUrl() {
return this.mapService.getServiceUrl("tile");
}
@Override
public WebService<?> getWebService() {
return this.mapService.getWebService();
}
public void setCols(final int cols) {
this.cols = cols;
}
public void setCompressionQuality(final int compressionQuality) {
this.compressionQuality = compressionQuality;
}
public void setDpi(final int dpi) {
this.dpi = dpi;
}
public void setFormat(final String format) {
this.format = format;
}
public void setMapService(final MapService mapService) {
this.mapService = mapService;
}
@Override
public void setProperties(final Map<String, ? extends Object> values) {
super.setProperties(values);
final MapEx origin = (MapEx)values.get("origin");
if (origin == null) {
this.originX = Double.NaN;
this.originY = Double.NaN;
} else {
this.originX = origin.getDouble("x");
this.originY = origin.getDouble("y");
}
this.geometryFactory = ArcGisResponse.newGeometryFactory((MapEx)values, "spatialReference");
this.levelOfDetails = ArcGisResponse.newList(LevelOfDetail.class, (MapEx)values, "lods");
}
public void setRows(final int rows) {
this.rows = rows;
}
}