package cz.agents.dbtokmlexporter.darptestbed; import java.awt.Color; import java.io.File; import java.io.FileNotFoundException; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; import org.opengis.referencing.FactoryException; import org.opengis.referencing.NoSuchAuthorityCodeException; import org.opengis.referencing.operation.TransformException; import cz.agents.agentpolis.tools.geovisio.database.connection.DatabaseConnection; import cz.agents.agentpolis.tools.geovisio.database.connection.DatabaseConnectionSettings; import cz.agents.agentpolis.tools.geovisio.database.postgres.postgis.PostgisConnection; import cz.agents.agentpolis.tools.geovisio.database.postgres.postgis.PostgisGeometry; import cz.agents.agentpolis.tools.geovisio.projection.ProjectionTransformer; import cz.agents.dbtokmlexporter.factory.DescriptionFactory; import cz.agents.dbtokmlexporter.factory.OneStringDescriptionFactory; import cz.agents.dbtokmlexporter.factory.TableColumnsDescriptionFactory; import cz.agents.dbtokmlexporter.factory.geometry.GeometryFactory; import cz.agents.dbtokmlexporter.factory.geometry.LineGeometryFactory; import cz.agents.dbtokmlexporter.factory.geometry.PointGeometryFactory; import cz.agents.dbtokmlexporter.factory.style.IconStyleFactory; import cz.agents.dbtokmlexporter.factory.style.LineStyleFactory; import cz.agents.dbtokmlexporter.factory.style.StyleFactory; import cz.agents.dbtokmlexporter.kmlitem.NonInterpolatedTimeKmlItem; import cz.agents.resultsvisio.kml.KmlItem; import de.micromata.opengis.kml.v_2_2_0.Kml; /** * * @author Marek Cuchy * */ public class DarpTestbedFromDbToNonInterpolatedKmlMain { private static final Logger logger = Logger.getLogger(DarpTestbedFromDbToNonInterpolatedKmlMain.class); public static void main(String[] args) throws NoSuchAuthorityCodeException, SQLException, FactoryException, TransformException, FileNotFoundException, ClassNotFoundException { // String schemaName = "testbed_dublin"; String schemaName = "testbed_san_francisco_3_r1000_d100_dutrue_putrue"; // String schemaName = "testbed_sf"; new File(schemaName).mkdir(); DOMConfigurator.configure("log4j.xml"); DatabaseConnectionSettings set = new DatabaseConnectionSettings("mf.felk.cvut.cz", 5432, "visio", "geovisio", "visio"); DatabaseConnection conn = new PostgisConnection(set); conn.connect(); OneStringDescriptionFactory descfac = new OneStringDescriptionFactory("agentid"); saveToKml(createPointVis(schemaName, "taxi_drivers", "", conn, "data/car.png", descfac), schemaName + "\\taxi_non_interpolated.kml"); List<String> requestColumnNames = new ArrayList<>(); requestColumnNames.add("agentid"); requestColumnNames.add("request_status"); requestColumnNames.add("request_departure_min"); requestColumnNames.add("request_departure_max"); requestColumnNames.add("request_arrival_min"); requestColumnNames.add("request_arrival_max"); DescriptionFactory requestDescription = new TableColumnsDescriptionFactory(requestColumnNames); saveToKml( createPointVis(schemaName, "passengers", "where from_time BETWEEN request_departure_min AND request_arrival_max", conn, "data/passenger.png", requestDescription), schemaName + "\\active_passengers_non_interpolated.kml"); // saveToKml( // createPointVis( // schemaName, // "passengers", // "where request_status LIKE '%DELAY%'", // conn, Color.RED, "man", requestDescription), schemaName // + "\\delayed_passengers_non_interpolated.kml"); saveToKml( createPointVis(schemaName, "passengers", "where from_time NOT BETWEEN request_departure_min AND request_arrival_max", conn, "data/passenger.png", requestDescription), schemaName + "\\inactive_passengers_non_interpolated.kml"); // System.out.println(Color.CYAN.getRGB()); List<String> pairColumnNames = new ArrayList<>(); pairColumnNames.add("passenger"); pairColumnNames.add("taxi_driver"); DescriptionFactory pairDescription = new TableColumnsDescriptionFactory(pairColumnNames); saveToKml(createLineVis(schemaName, "taxi_to_passenger_pair", conn, Color.CYAN, pairDescription), schemaName + "\\passengers_taxi_pair_non_interpolated.kml"); // saveToKml(createDarpScreenOverlayVis(schemaName, conn), schemaName + "/screenoverlay.kml"); conn.close(); } public static void saveToKml(KmlItem output, String path) throws FileNotFoundException { Kml kml = new Kml(); kml.createAndSetDocument().addToFeature(output.initFeatureForKml(null)); kml.marshal(new File(path)); } public static NonInterpolatedTimeKmlItem createPointVis(String schemaName, String tableName, String whereSql, DatabaseConnection conn, final String iconUrl, DescriptionFactory descriptionFactory) throws SQLException, NoSuchAuthorityCodeException, FactoryException, TransformException { String columns = "*"; String sql = "SELECT " + columns + " FROM " + schemaName + "." + tableName + " " + whereSql + " ORDER BY from_time"; ResultSet result = conn.executeQueryWithFetchSize(sql, 10000); ProjectionTransformer transformer = new ProjectionTransformer(900913, 4326, true); GeometryFactory geometryFactory = new PointGeometryFactory(); StyleFactory styleFactory = new IconStyleFactory(iconUrl, 0.75); NonInterpolatedTimeKmlItem kmlItem = new NonInterpolatedTimeKmlItem(transformer, styleFactory, geometryFactory, 24 * 3600 * 1000, false, 2 * 60 * 1000); // int counter = 0; while (result.next()) { // if (counter++ % 100000 == 0) { // System.out.println("Read records: " + counter); // } String id = result.getString("agentid"); PostgisGeometry geom = (PostgisGeometry) result.getObject("geom"); Timestamp timestamp = result.getTimestamp("from_time"); // kmlItem.addTimeGeometry(id, geom.getGeometry(), timestamp.getTime(), // descriptionFactory.createDescription(result)); } return kmlItem; } public static NonInterpolatedTimeKmlItem createLineVis(String schemaName, String tableName, DatabaseConnection conn, final Color color, DescriptionFactory descriptionFactory) throws SQLException, NoSuchAuthorityCodeException, FactoryException, TransformException { String columns = "*"; String sql = "SELECT " + columns + " FROM " + schemaName + "." + tableName + " ORDER BY from_time"; ResultSet result = conn.executeQueryWithFetchSize(sql, 10000); ProjectionTransformer transformer = new ProjectionTransformer(900913, 4326, true); GeometryFactory geometryFactory = new LineGeometryFactory(); StyleFactory styleFactory = new LineStyleFactory(color, 2); NonInterpolatedTimeKmlItem kmlItem = new NonInterpolatedTimeKmlItem(transformer, styleFactory, geometryFactory, 24 * 3600 * 1000); int counter = 0; while (result.next()) { if (counter++ % 100000 == 0) { System.out.println("Read records: " + counter); } String passenger = result.getString("passenger"); String taxiDriver = result.getString("taxi_driver"); PostgisGeometry geom = (PostgisGeometry) result.getObject("geom"); Timestamp timestamp = result.getTimestamp("from_time"); // kmlItem.addTimeGeometry(passenger + taxiDriver, geom.getGeometry(), timestamp.getTime(), // descriptionFactory.createDescription(result)); } return kmlItem; } // public static ScreenOverlayTimeKmlItem createDarpScreenOverlayVis(String schemaName, PostgisConnection conn) // throws SQLException, NoSuchAuthorityCodeException, FactoryException, TransformException { // // String sql = "SELECT time.from_time AS time, succ.count AS success, failed.count AS failed, active.count AS active " // + "FROM " // + "(SELECT DISTINCT from_time FROM " // + schemaName // + ".passengers ORDER BY from_time) AS time " // + "FULL JOIN " // + "(SELECT from_time,count(*) FROM " // + schemaName // + ".passengers WHERE request_status = 'OUT_OF_VEHICLE' GROUP BY from_time ORDER BY from_time) AS succ " // + "ON time.from_time = succ.from_time " // + "FULL JOIN " // + "(SELECT from_time,count(*) FROM " // + schemaName // + ".passengers WHERE request_status = 'OUT_OF_VEHICLE_WITH_DELAYED_ARRIVAL' GROUP BY from_time ORDER BY from_time) AS failed " // + "ON time.from_time = failed.from_time " // + "FULL JOIN " // + "(SELECT from_time, count(*) FROM " // + schemaName // + ".passengers WHERE from_time BETWEEN request_departure_min AND request_arrival_max GROUP BY from_time ORDER BY from_time) AS active " // + "ON " + "time.from_time = active.from_time"; // // logger.debug(sql); // // ResultSet result = conn.executeQueryWithFetchSize(sql, 10000); // // // StyleFactory styleFactory = new IconStyleFactory(iconName, color, // // 0.75); // // ScreenOverlayTimeKmlItem kmlItem = new ScreenOverlayTimeKmlItem(2 * 60 * 1000); // // kmlItem.addTextOverlay(0, "Active passengers: " + 0 + "\nSuccesfull/failed requests: " + 0 + "/" + 0); // // while (result.next()) { // Timestamp timestamp = result.getTimestamp("time"); // int succes = result.getInt("success"); // int failed = result.getInt("failed"); // int active = result.getInt("active"); // // int count = result.getInt("count"); // kmlItem.addTextOverlay(timestamp.getTime(), "Active passengers: " + active // + "\nSuccesfull/failed requests: " + succes + "/" + failed); // } // return kmlItem; // } }