📄 areahandler.java
字号:
} } return key; } /** * Given the shapefile record number, find the drawing parameters * that should be used for the shape. Returns the default coloring * if the key for the drawing parameters isn't found. */ public DrawingAttributes getDrawParams(int recordNumber) { if (dbfModel != null) return getDrawParamsFromDBF(recordNumber); else return getDrawParamsFromCSV(recordNumber); } /** * This function takes an OMGraphicList and loads each one with * the array representing the records in the dbf file. Each * graphics stores the graphic in its object slot. */ public void loadDbfModelIntoGraphics(OMGraphicList list) { if (list != null && dbfModel.getRowCount() > 0) { int numgraphics = list.size(); for (int i = 0; i < numgraphics; i++) { try { OMGraphic omg = list.getOMGraphicAt(i); Integer recnum = (Integer) (omg.getAppObject()); // OFF BY ONE!!! The shape record numbers // assigned to the records start with 1, while // everything else we do starts with 0... Object inforec = dbfModel.getRecord(recnum.intValue() - 1); omg.setAppObject(inforec); } catch (ClassCastException cce) { if (Debug.debugging("shape")) { cce.printStackTrace(); } } catch (NullPointerException npe) { npe.printStackTrace(); } } } } /** * Gets the record graphics for a record with multiple graphics. * * @return OMGraphicList */ protected OMGraphicList recordList(ESRIRecord rec, DrawingAttributes drawParams) { int recNumber = rec.getRecordNumber(); OMGraphicList recList = new OMGraphicList(10); if (drawParams != null) { rec.addOMGraphics(recList, drawParams); } else { rec.addOMGraphics(recList, DrawingAttributes.getDefaultClone()); } // Remember recordNumber to work with .dbf file recList.setAppObject(new Integer(recNumber)); return recList; } /** * Find a PoliticalArea named by the search key. If the shapefile * is large, the first query will take a little extra time on the * first query to read in the files. * * @param area_key the lookup key, of which the index for the * column was designated in the properties file. */ public PoliticalArea findPoliticalArea(String area_key) { // Right now, this method gathers all the graphics in the // shape file, groups them, and then returns the PoliticalArea // for the key. In the future, it would be nice to have the // option to actually search through the data file, find the // indexes of the graphics that go to the area, and assemble a // temporary list to pass back. if (politicalAreas == null) { Debug.message("areas", "AreaHandler: initializing graphic attributes"); initialize(originalPrefix, originalProperties); if (omgraphics == null) { omgraphics = getGraphics(); if (dbfModel != null) loadDbfModelIntoGraphics(omgraphics); else infoFile.loadIntoGraphics(omgraphics); } politicalAreas = determinePoliticalAreas(omgraphics); Debug.message("areas", "AreaHandler: completed initialization"); } if (politicalAreas != null) { String key = area_key.toUpperCase().intern(); // Just to // be sure. return (PoliticalArea) politicalAreas.get(key); } else { Debug.error("AreaHandler: initialization failed for " + originalPrefix + "\n\tNo data will be displayed"); return null; } } /** * Find the graphics that are represented by an search key. If the * shapefile is large, the first query will take a little extra * time on the first query to read in the files. * * @param area_key the lookup key, of which the index for the * column was designated in the properties file. */ public OMGeometryList findGraphics(String area_key) { PoliticalArea area = findPoliticalArea(area_key); if (area == null) { return null; } else { return area.getGeometry(); } } /** * DeterminePoliticalAreas goes over a list of omgraphics, and * spits out a hashtable that holds PoliticalArea objects for * every area key. * * @param graphicList the list of graphics. The top level graphic * entries on the list represent areas. */ public Hashtable determinePoliticalAreas(OMGraphicList graphicList) { if (Debug.debugging("areas")) { Debug.output("AreaHandler: Determining political areas from OMGraphicList"); } Hashtable poli_areas = new Hashtable(); return determinePoliticalAreas(graphicList, poli_areas); } /** * DeterminePoliticalAreas goes over a list of omgraphics, and * spits out a hashtable that holds PoliticalArea objects for * every area key. When an ID is found in the graphics, it is * checked in the hashtable for like graphics, and added to that * PoliticalArea if found. If not found, a new PoliticalArea is * created and placed in the Hashtable. This will duplicate * graphics if you call it more than once for the same graphic * list. * * @param graphicList the list of graphics. The top level graphic * entries on the list represent areas. */ public Hashtable determinePoliticalAreas(OMGraphicList graphicList, Hashtable poli_areas) { // Simple case. No graphics means an empty list of regions. String name = null; String key = null; if (graphicList != null) { int size = graphicList.size(); for (int i = 0; i < size; i++) { OMGraphic graphic = graphicList.getOMGraphicAt(i); // below should be a vector like [ "Massachusetts", // "MA" ]; Object obj = graphic.getAppObject(); if (obj == null) { if (Debug.debugging("verbose")) { Debug.error("AreaHandler: Caught a null app object for graphic #" + i); } continue; } if (obj instanceof Vector) { Vector pair = (Vector) obj; name = (String) pair.elementAt(nameIndex); key = ((String) pair.elementAt(keyIndex)).toUpperCase() .intern(); if (Debug.debugging("areas")) { Debug.output("AreaHandler: looking at " + name + ", " + key); } } else if (obj instanceof String) { // Assume that the key is stored here, I guess. key = (String) obj; if (Debug.debugging("areas")) { Debug.output("AreaHandler: String app object, looking at " + key); } } else { if (Debug.debugging("verbose")) { Debug.output("AreaHandler: Unidentified app object type " + obj); } } // Get the political area object for this keyiation. PoliticalArea area = (PoliticalArea) poli_areas.get(key); if (area == null) { // key is not in table area = new PoliticalArea(name, key); poli_areas.put(key, area); // add it to the table // AreaDrawParams adp = // (AreaDrawParams)drawingParams.get(key); // if (adp != null) { // area.setDrawingAttributes(adp.drawingAttributes); // } } // Add the graphic to the list for this political // area. area.addGraphic(graphic); } if (Debug.debugging("areas")) { Debug.output("AreaHandler: Finished determinePoliticalAreas: " + poli_areas.size() + " areas defined."); } } return poli_areas; } protected Color getColor(String colorString) { Color result = Color.black; try { result = PropUtils.parseColor(colorString); } catch (NumberFormatException nfe) { result = GetColorFromString(colorString); } return result; } /** * This function would return a Color object for string such as * red, green,.. (all that are available from java.awt.color * class). It can also return a specific color represented by HEX * or Octal number like 0xffeeffee */ protected Color GetColorFromString(String token) { String tokstring = (String) token; Color result = Color.black; if (Debug.debugging("areas")) { Debug.output("AreaHandler: GetColorFromString(" + tokstring + ")"); } // Thank the heavens for Emacs macros! if (tokstring.equals("black")) result = Color.black; else if (tokstring.equals("blue")) result = Color.blue; else if (tokstring.equals("cyan")) result = Color.cyan; else if (tokstring.equals("darkGray")) result = Color.darkGray; else if (tokstring.equals("gray")) result = Color.gray; else if (tokstring.equals("green")) result = Color.green; else if (tokstring.equals("lightGray")) result = Color.lightGray; else if (tokstring.equals("magenta")) result = Color.magenta; else if (tokstring.equals("orange")) result = Color.orange; else if (tokstring.equals("pink")) result = Color.pink; else if (tokstring.equals("red")) result = Color.red; else if (tokstring.equals("white")) result = Color.white; else if (tokstring.equals("yellow")) result = Color.yellow; else // decode a hex color string. result = Color.decode(tokstring); if (Debug.debugging("areas")) { Debug.output("AreaHandler.GetColorFromToken returns (" + result + ")"); } return result; } /** * This main function basically reads in the data sources (the * shape file and the csv information file, and creates a * serialized graphics file that will act like a cache later. */ public static void main(String[] argv) { String propertiesFile = null; String prefix = null; String outputFile = null; Debug.init(); if (argv.length < 6) printUsage(); for (int i = 0; i < argv.length; i++) { if (argv[i].equalsIgnoreCase("-props")) { propertiesFile = argv[++i]; } else if (argv[i].equalsIgnoreCase("-prefix")) { prefix = argv[++i]; } else if (argv[i].equalsIgnoreCase("-file")) { outputFile = argv[++i]; } } if (propertiesFile == null || prefix == null || outputFile == null) { printUsage(); } try { Properties properties = new Properties(); // Read in the properties. URL propertiesURL = new URL(propertiesFile); InputStream is = propertiesURL.openStream(); properties.load(is); // Let's make a file ShapeLayer sl = new ShapeLayer(); sl.setProperties(prefix, properties); AreaHandler ah = new AreaHandler(sl.getSpatialIndex(), sl.getDrawingAttributes()); // Set the properties in the handler. ah.setProperties(prefix, properties); // Write the saved graphics. ah.getGraphics().writeGraphics(outputFile); } catch (java.net.MalformedURLException murle) { Debug.error("Bad URL for properties file : " + propertiesFile); printUsage(); } catch (java.io.IOException ioe) { Debug.error("IOException creating cached graphics file: " + outputFile); printUsage(); } } public static void printUsage() { Debug.output("Usage: java com.bbn.openmap.layer.shape.areas.AreaHandler -props <URL to properties file> -prefix <handler property prefix> -file <path to output file>"); System.exit(-1); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -