package com.androidol.util.tiles.packager.schema;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;
import com.androidol.projection.Projection;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.geom.Point;
public class PackageSchema {
protected String name;
protected int minZoomLevel;
protected int maxZoomLevel;
protected int defaultZoomLevel;
protected Envelope extent;
protected Coordinate center;
protected int buffer = 0;
public PackageSchema(int minZoomLevel, int maxZoomLevel, int defaultZoomLevel, Envelope extent, Coordinate center) {
this.minZoomLevel = minZoomLevel;
this.maxZoomLevel = maxZoomLevel;
this.defaultZoomLevel = defaultZoomLevel;
this.extent = new Envelope(extent);
this.center = new Coordinate(center);
}
public PackageSchema() {
readFromFile();
}
/**
*
* @param pathToPropsFile
*/
public PackageSchema(String pathToPropsFile) {
readFromFile(pathToPropsFile);
}
/**
*
*/
public void readFromFile() {
readFromFile("package.properties");
}
public void readFromFile(String inputPath) {
//
Properties props = new Properties();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(PackageSchema.class.getResourceAsStream("/"+inputPath)));
props.load(reader);
String minZoomLevelStr = props.getProperty("minZoomLevel");
String maxZoomLevelStr = props.getProperty("maxZoomLevel");
String defaultZoomLevelStr = props.getProperty("defaultZoomLevel");
String centerStr = props.getProperty("center");
String extentStr = props.getProperty("extent");
String bufferStr = props.getProperty("buffer");
String nameStr = props.getProperty("name");
/*
System.out.println("minZoomLevel: " + minZoomLevelStr);
System.out.println("maxZoomLevel: " + maxZoomLevelStr);
System.out.println("defaultZoomLevel: " + defaultZoomLevelStr);
System.out.println("center: " + centerStr);
System.out.println("extent: " + extentStr);
*/
this.minZoomLevel = Integer.parseInt(minZoomLevelStr);
this.maxZoomLevel = Integer.parseInt(maxZoomLevelStr);
this.defaultZoomLevel = Integer.parseInt(defaultZoomLevelStr);
// TODO: deal with projection of center based on an extra properties
String[] centerCoords = centerStr.split(",");
Point centerPoint = Projection.wgs84ToSphericalMercator(Double.parseDouble(centerCoords[0]), Double.parseDouble(centerCoords[1]));
this.center = new Coordinate(centerPoint.getX(), centerPoint.getY());
// TODO: deal with projection of center based on an extra properties
String[] extentCoords = extentStr.split(",");
Point bottomLeft = Projection.wgs84ToSphericalMercator(Double.parseDouble(extentCoords[0]), Double.parseDouble(extentCoords[1]));
Point topRight = Projection.wgs84ToSphericalMercator(Double.parseDouble(extentCoords[2]), Double.parseDouble(extentCoords[3]));
this.extent = new Envelope(bottomLeft.getX(), topRight.getX(), bottomLeft.getY(), topRight.getY());
if(bufferStr != null) {
this.buffer = Integer.parseInt(bufferStr);
}
if(!(this.buffer>=0 && this.buffer<=5)) {
this.buffer = 0;
}
if(nameStr != null) {
this.name = nameStr;
} else {
this.name = "package";
}
/*
System.out.println("minZoomLevel: " + this.minZoomLevel);
System.out.println("maxZoomLevel: " + this.maxZoomLevel);
System.out.println("defaultZoomLevel: " + this.defaultZoomLevel);
System.out.println("center: " + this.center.toString());
System.out.println("extent: " + this.extent.toString());
System.out.println("buffer: " + this.buffer);
*/
} catch(IOException e) {
System.out.println("...package.properties is missing or not valid...");
e.printStackTrace();
} catch(Exception e) {
System.out.println("...package.properties contains invalid properties...");
e.printStackTrace();
}
}
/**
*
*/
public void writeToFile(String outputPath) {
Properties props = new Properties();
try {
String minZoomLevelStr = String.valueOf(this.minZoomLevel);
String maxZoomLevelStr = String.valueOf(this.maxZoomLevel);
String defaultZoomLevelStr = String.valueOf(this.defaultZoomLevel);
String centerStr = String.valueOf(this.center.x) + "," + String.valueOf(this.center.y);
String extentStr = String.valueOf(this.extent.getMinX())
+ "," + String.valueOf(this.extent.getMinY())
+ "," + String.valueOf(this.extent.getMaxX())
+ "," + String.valueOf(this.extent.getMaxY());
String bufferStr = String.valueOf(this.buffer);
String nameStr = this.name;
props.setProperty("minZoomLevel", minZoomLevelStr);
props.setProperty("maxZoomLevel", maxZoomLevelStr);
props.setProperty("defaultZoomLevel", defaultZoomLevelStr);
// TODO: write out an extra property to indicate projection
props.setProperty("center", centerStr);
props.setProperty("extent", extentStr);
props.setProperty("buffer", bufferStr);
props.setProperty("name", nameStr);
props.store(new FileOutputStream(outputPath), null);
} catch(IOException e) {
System.out.println("...can not write to package.properties.gen...");
e.printStackTrace();
}
}
/**
*
*/
public void writeToFile() {
writeToFile("package.properties.gen");
}
/**
*
*
*/
public void printOutPackageInfo() {
System.out.println("name: " + this.name);
System.out.println("minZoomLevel: " + this.minZoomLevel);
System.out.println("maxZoomLevel: " + this.maxZoomLevel);
System.out.println("defaultZoomLevel: " + this.defaultZoomLevel);
System.out.println("center: " + this.center.toString());
System.out.println("extent: " + this.extent.toString());
System.out.println("buffer: " + this.buffer);
}
public static void main(String[] args) {
PackageSchema schema = new PackageSchema();
schema.printOutPackageInfo();
//schema.readFromFile();
//schema.writeToFile();
}
// ===========================================================
// getters & setters
// ===========================================================
public int getMinZoomLevel() {
return minZoomLevel;
}
public void setMinZoomLevel(int minZoomLevel) {
this.minZoomLevel = minZoomLevel;
}
public int getMaxZoomLevel() {
return maxZoomLevel;
}
public void setMaxZoomLevel(int maxZoomLevel) {
this.maxZoomLevel = maxZoomLevel;
}
public int getDefaultZoomLevel() {
return defaultZoomLevel;
}
public void setDefaultZoomLevel(int defaultZoomLevel) {
this.defaultZoomLevel = defaultZoomLevel;
}
public Envelope getExtent() {
return extent;
}
public void setExtent(Envelope extent) {
this.extent = extent;
}
public Coordinate getCenter() {
return center;
}
public void setCenter(Coordinate center) {
this.center = center;
}
public int getBuffer() {
return buffer;
}
public void setBuffer(int buffer) {
this.buffer = buffer;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}