package com.revolsys.gis.grid;
import java.nio.file.Path;
import java.util.List;
import com.revolsys.collection.map.LinkedHashMapEx;
import com.revolsys.collection.map.MapEx;
import com.revolsys.geometry.cs.CoordinateSystem;
import com.revolsys.geometry.model.BoundingBox;
import com.revolsys.geometry.model.Geometry;
import com.revolsys.geometry.model.GeometryFactory;
import com.revolsys.geometry.model.GeometryFactoryProxy;
import com.revolsys.geometry.model.Point;
import com.revolsys.geometry.model.Polygon;
import com.revolsys.io.map.MapSerializer;
import com.revolsys.record.schema.RecordDefinition;
import com.revolsys.spring.resource.Resource;
public interface RectangularMapGrid extends GeometryFactoryProxy, MapSerializer {
static String getTileFileName(final String filePrefix, final int coordinateSystemId,
final String gridTileOrCellSize, final int tileMinX, final int tileMinY,
final String fileExtension) {
return filePrefix + "_" + coordinateSystemId + "_" + gridTileOrCellSize + "_" + tileMinX + "_"
+ tileMinY + "." + fileExtension;
}
static Path getTilePath(final Path basePath, final String filePrefix,
final int coordinateSystemId, final String gridTileOrCellSize, final int tileMinX,
final int tileMinY, final String fileExtension) {
final Path fileExtensionDirectory = basePath.resolve(fileExtension);
final Path coordinateSystemDirectory = fileExtensionDirectory
.resolve(Integer.toString(coordinateSystemId));
final Path resolutionDirectory = coordinateSystemDirectory.resolve(gridTileOrCellSize);
final Path directoryX = resolutionDirectory.resolve(Integer.toString(tileMinX));
final String fileName = getTileFileName(filePrefix, coordinateSystemId, gridTileOrCellSize,
tileMinX, tileMinY, fileExtension);
return directoryX.resolve(fileName);
}
static Resource getTileResource(final Resource basePath, final String filePrefix,
final int coordinateSystemId, final String gridTileOrCellSize, final int tileMinX,
final int tileMinY, final String fileExtension) {
final Resource fileExtensionDirectory = basePath.createRelative(fileExtension);
final Resource coordinateSystemDirectory = fileExtensionDirectory
.createRelative(Integer.toString(coordinateSystemId));
final Resource resolutionDirectory = coordinateSystemDirectory
.createRelative(gridTileOrCellSize);
final Resource directoryX = resolutionDirectory.createRelative(Integer.toString(tileMinX));
final String fileName = getTileFileName(filePrefix, coordinateSystemId, gridTileOrCellSize,
tileMinX, tileMinY, fileExtension);
return directoryX.createRelative(fileName);
}
default BoundingBox getBoundingBox(final String mapTileName, final int srid) {
final GeometryFactory geometryFactory = GeometryFactory.floating3(srid);
final RectangularMapTile mapTile = getTileByName(mapTileName);
final BoundingBox boundingBox = mapTile.getBoundingBox();
return boundingBox.convert(geometryFactory);
}
String getFormattedMapTileName(String name);
String getMapTileName(final double x, final double y);
default String getMapTileName(final Geometry geometry) {
final CoordinateSystem coordinateSystem = getCoordinateSystem();
final Geometry projectedGeometry = geometry
.convertGeometry(coordinateSystem.getGeometryFactory());
final Point centroid = projectedGeometry.getCentroid();
final Point coordinate = centroid.getPoint();
final String mapsheet = getMapTileName(coordinate.getX(), coordinate.getY());
return mapsheet;
}
String getName();
default Polygon getPolygon(final String mapTileName, final CoordinateSystem coordinateSystem) {
return getPolygon(mapTileName, coordinateSystem.getGeometryFactory());
}
default Polygon getPolygon(final String mapTileName, final GeometryFactory geometryFactory) {
final RectangularMapTile mapTile = getTileByName(mapTileName);
final BoundingBox boundingBox = mapTile.getBoundingBox();
final Polygon polygon = boundingBox.toPolygon(geometryFactory);
return polygon;
}
default Polygon getPolygon(final String mapTileName, final GeometryFactory geometryFactory,
final int numX, final int numY) {
final RectangularMapTile mapTile = getTileByName(mapTileName);
final BoundingBox boundingBox = mapTile.getBoundingBox();
final Polygon polygon = boundingBox.toPolygon(geometryFactory, numX, numY);
return polygon;
}
RecordDefinition getRecordDefinition();
RectangularMapTile getTileByLocation(double x, double y);
RectangularMapTile getTileByName(String name);
double getTileHeight();
List<RectangularMapTile> getTiles(final BoundingBox boundingBox);
double getTileWidth();
@Override
default MapEx toMap() {
return new LinkedHashMapEx();
}
}