// ********************************************************************** // // <copyright> // // BBN Technologies // 10 Moulton Street // Cambridge, MA 02138 // (617) 873-8000 // // Copyright (C) BBNT Solutions LLC. All rights reserved. // // </copyright> // ********************************************************************** // $Source: /cvs/distapps/openmap/src/openmap/com/bbn/openmap/layer/vpf/EdgeTable.java,v $ // $Revision: 1.7 $ $Date: 2005/12/09 21:08:57 $ $Author: dietrick $ // ********************************************************************** package com.bbn.openmap.layer.vpf; import java.util.ArrayList; import java.util.List; import com.bbn.openmap.io.FormatException; import com.bbn.openmap.omGraphics.OMGraphic; import com.bbn.openmap.proj.coords.LatLonPoint; import com.bbn.openmap.util.Debug; /** * Read VPF format edge tables to generate polyline graphics for OpenMap. */ public class EdgeTable extends PrimitiveTable { /** The set of columns that we need */ private static final String[] edgcolumns = { Constants.ID, Constants.EDG_START_NODE, Constants.EDG_END_NODE, Constants.EDG_RIGHT_FACE, Constants.EDG_LEFT_FACE, Constants.EDG_RIGHT_EDGE, Constants.EDG_LEFT_EDGE, Constants.EDG_COORDINATES }; /** * Construct an EdgeTable object for a tile of a coverage. * * @param cov the coverage table that this tile is part of * @param tile the tile to parse * @throws FormatException a problem was encountered initializing this tile */ public EdgeTable(CoverageTable cov, TileDirectory tile) throws FormatException { super(cov, tile, "edg"); if (Debug.debugging("vpf")) { Debug.output("EdgeTable(): " + filename); } if (cov.cachedLineSchema == null) { cov.cachedLineSchema = lookupSchema(edgcolumns, false); } } /** * Get the value of the ID column * * @param l the list to retrieve the value from */ public final int getID(List<Number> l) { return l.get(covtable.cachedLineSchema[0]).intValue(); } /** * Get the value of the start_node column * * @param l the list to retrieve the value from */ public final int getStartNode(List<Object> l) { return ((Number) l.get(covtable.cachedLineSchema[1])).intValue(); } /** * Get the value of the end_node column * * @param l the list to retrieve the value from */ public final int getEndNode(List<Object> l) { return ((Number) l.get(covtable.cachedLineSchema[2])).intValue(); } /** * Get the TilingAdapter for the right_face column */ public final TilingAdapter getRightFaceTilingAdapter() { return getTilingAdapter(Constants.EDG_RIGHT_FACE); } /** * Get the TilingAdapter for the left_face column */ public final TilingAdapter getLeftFaceTilingAdapter() { return getTilingAdapter(Constants.EDG_LEFT_FACE); } /** * Get the TilingAdapter for the right_edge column */ public final TilingAdapter getRightEdgeTilingAdapter() { return getTilingAdapter(Constants.EDG_RIGHT_EDGE); } /** * Get the TilingAdapter for the left_edge column */ public final TilingAdapter getLeftEdgeTilingAdapter() { return getTilingAdapter(Constants.EDG_LEFT_EDGE); } /** * Get the value of the coordinates column * * @param l the list to retrieve the value from */ public final CoordFloatString getCoordinates(List<Object> l) { return (CoordFloatString) l.get(covtable.cachedLineSchema[7]); } /** * get the topology level of the edge table * * @return the vpf topology level */ public int topologyLevel() { if (covtable.cachedLineSchema[1] == -1) {// no start_node, // topology level 0 return 0; } if (covtable.cachedLineSchema[3] == -1) {// no right_face, // level 1 or 2 return 2; } return 3; } /** * get the coverage table that this edge is in */ public CoverageTable getCoverageTable() { return covtable; } /** * Parse the edge records for this tile, calling warehouse.createEdge once * for each record. * * @param warehouse the warehouse used for createEdge calls (must not be * null) * @param dpplat threshold for latitude thinning (passed to warehouse) * @param dpplon threshold for longitude thinngin (passed to warehouse) * @param ll1 upperleft of selection region (passed to warehouse) * @param ll2 lowerright of selection region (passed to warehouse) * @see VPFGraphicWarehouse#createEdge */ public void drawTile(VPFGraphicWarehouse warehouse, double dpplat, double dpplon, LatLonPoint ll1, LatLonPoint ll2) { if (warehouse == null) { return; } try { seekToRow(1); for (List<Object> edge = new ArrayList<Object>(); parseRow(edge);) { warehouse.createEdge(covtable, this, edge, ll1, ll2, dpplat, dpplon, getCoordinates(edge)); } } catch (FormatException f) { System.out.println("Exception: " + f.getClass() + " " + f.getMessage()); } } /** * Use the warehouse to create a graphic from the edge feature, if you * already have the line from the edgetable. * * @param warehouse the warehouse used for createEdge calls (must not be * null) * @param dpplat threshold for latitude thinning (passed to warehouse) * @param dpplon threshold for longitude thinngin (passed to warehouse) * @param ll1 upperleft of selection region (passed to warehouse) * @param ll2 lowerright of selection region (passed to warehouse) * @param edge list containing the EdgeTable row contents. * @param featureType the name of the feature. The warehouse may want to do * some intelligent rendering. * @param primID the primitive ID of the feature, in order to gather attributes if * necessary. * @see VPFGraphicWarehouse#createEdge */ public OMGraphic drawFeature(VPFFeatureWarehouse warehouse, double dpplat, double dpplon, LatLonPoint ll1, LatLonPoint ll2, List<Object> edge, String featureType, int primID) { if (warehouse != null) { return warehouse.createEdge(covtable, this, edge, ll1, ll2, dpplat, dpplon, getCoordinates(edge), featureType, primID); } return null; } }