/** * Returns the extent ("xmin", "ymin", "xmax", "ymax") for the specified row as a {@link VPFBoundingBox}. * * @param record the record to extract the bound attributes from. * * @return extent of the specified row. */ public static VPFBoundingBox getExtent(VPFRecord record) { if (record == null) { String message = Logging.getMessage("nullValue.RecordIsNull"); Logging.logger().severe(message); throw new ArgumentException(message); } return(new VPFBoundingBox( ((Number)record.getValue("xmin")).doubleValue(), ((Number)record.getValue("ymin")).doubleValue(), ((Number)record.getValue("xmax")).doubleValue(), ((Number)record.getValue("ymax")).doubleValue())); }
//**************************************************************// //******************** Winged-Edge Face Construction *********// //**************************************************************// /** * Given a row from the ring primitive table, navigate the ring and edge primitive tables to construct a new {@link * VPFPrimitiveData.Ring}. * * @param row the ring primitive row. * @param edgeInfoArray the edge primitive data. * * @return a new Ring. */ protected VPFPrimitiveData.Ring buildRing(VPFRecord row, VPFPrimitiveData.PrimitiveInfo[] edgeInfoArray) { int faceId = ((Number)row.getValue("face_id")).intValue(); int startEdgeId = ((Number)row.getValue("start_edge")).intValue(); VPFWingedEdgeTraverser traverser = new VPFWingedEdgeTraverser(); // Traverse the ring to collect the number of edges which define the ring. final int numEdges = traverser.traverseRing(faceId, startEdgeId, edgeInfoArray, null); final int[] idArray = new int[numEdges]; final int[] orientationArray = new int[numEdges]; // Traverse the ring again, but this time populate an entry for the primitiveID and orientation data stuctures // for each edge. traverser.traverseRing(faceId, startEdgeId, edgeInfoArray, new VPFWingedEdgeTraverser.EdgeTraversalListener() {
protected VPFFeature createSimpleFeature(VPFFeatureClass featureClass, VPFRecord featureRow, Iterable <String> attributeKeys) { // Feature has a direct 1:1 relation to the primitive table. if (this.tile != null && !matchesTile(featureRow, this.tile)) { return(null); } VPFRelation featureToPrimitive = this.getFeatureToPrimitiveRelation(featureClass); if (featureToPrimitive == null) { return(null); } int primitiveId = asInt(featureRow.getValue(featureToPrimitive.getTable1Key())); VPFPrimitiveData.PrimitiveInfo primitiveInfo = this.primitiveData.getPrimitiveInfo( featureToPrimitive.getTable2(), primitiveId); return(this.createFeature(featureClass, featureRow, attributeKeys, primitiveInfo.getBounds(), new int[] { primitiveId })); }
public VPFFeatureClassSchema[] getFeatureClasses(FileFilter featureTableFilter) { if (featureTableFilter == null) { String message = Logging.getMessage("nullValue.FilterIsNull"); Logging.logger().severe(message); throw new ArgumentException(message); } // List the file names in the coverage directory matching the specified feature table file filter. String[] names = WWIO.listChildFilenames(new File(this.getFilePath()), featureTableFilter); if (names == null) { return(null); } int numFeatures = names.length; VPFFeatureClassSchema[] desc = new VPFFeatureClassSchema[numFeatures]; for (int i = 0; i < numFeatures; i++) { String featureTableName = names[i]; String className = WWIO.replaceSuffix(featureTableName, ""); String type = null; // If the Feature Class Attriute Table is available, then use it to determine the feature type for the // specified class. if (this.featureClassAttributeTable != null) { VPFRecord record = this.featureClassAttributeTable.getRecord("fclass", className); if (record != null) { type = (String)record.getValue("type"); } } // Otherwise, determine the feature type is based on the feature table extension. if (type == null) { type = VPFUtils.getFeatureTypeName(featureTableName); } desc[i] = new VPFFeatureClassSchema(className, VPFFeatureType.fromTypeName(type), featureTableName); } return(desc); }
public static void checkAndSetValue(VPFRecord record, String paramName, String paramKey, AVList parameters) { if (record == null) { String message = Logging.getMessage("nullValue.RecordIsNull"); Logging.logger().severe(message); throw new ArgumentException(message); } if (paramName == null) { String message = Logging.getMessage("nullValue.ParameterNameIsNull"); Logging.logger().severe(message); throw new ArgumentException(message); } if (paramKey == null) { String message = Logging.getMessage("nullValue.ParameterKeyIsNull"); Logging.logger().severe(message); throw new ArgumentException(message); } if (params == null) { String message = Logging.getMessage("nullValue.ParamsIsNull"); Logging.logger().severe(message); throw new ArgumentException(message); } if (record.hasValue(paramName)) { Object o = record.getValue(paramName); if (o != null) { parameters.setValue(paramKey, o); } } }
protected void buildFacePrimitives(VPFCoverage coverage, VPFTile tile, VPFPrimitiveData primitiveData) { VPFBufferedRecordData faceTable = this.createPrimitiveTable(coverage, tile, VPFConstants.FACE_PRIMITIVE_TABLE); if (faceTable == null) { return; } VPFBufferedRecordData mbrTable = this.createPrimitiveTable(coverage, tile, VPFConstants.FACE_BOUNDING_RECTANGLE_TABLE); if (mbrTable == null) { return; } VPFBufferedRecordData ringTable = this.createPrimitiveTable(coverage, tile, VPFConstants.RING_TABLE); if (ringTable == null) { return; } VPFPrimitiveData.PrimitiveInfo[] edgeInfo = primitiveData.getPrimitiveInfo(VPFConstants.EDGE_PRIMITIVE_TABLE); int numFaces = faceTable.getNumRecords(); VPFPrimitiveData.FaceInfo[] faceInfo = new VPFPrimitiveData.FaceInfo[numFaces]; foreach (VPFRecord faceRow in faceTable) { int faceId = faceRow.getId(); VPFRecord mbrRow = mbrTable.getRecord(faceId); // Face ID 1 is reserved for the "universe face", which does not have any associated geometry. if (faceId == 1) { continue; } // The first ring primitive associated with the face primitive defines the outer ring. The face primitive must // at least contain coordinates for an outer ring. int ringId = ((Number)faceRow.getValue("ring_ptr")).intValue(); VPFRecord ringRow = ringTable.getRecord(ringId); VPFPrimitiveData.Ring outerRing = this.buildRing(ringRow, edgeInfo); // The ring table maintains an order relationship for its rows. The first record of a new face id will always // be defined as the outer ring. Any repeating records with an identical face value will define inner rings. ArrayList <VPFPrimitiveData.Ring> innerRingList = new ArrayList <VPFPrimitiveData.Ring>(); for (ringId = ringId + 1; ringId <= ringTable.getNumRecords(); ringId++) { ringRow = ringTable.getRecord(ringId); // Break on the first ring primitive row which isn't associated with the face. Because the ring rows // maintain an ordering with respect to face id, there will be no other ring rows corresponding to this // face. if (faceId != getId(ringRow.getValue("face_id"))) { break; } VPFPrimitiveData.Ring innerRing = this.buildRing(ringRow, edgeInfo); if (innerRing != null) { innerRingList.add(innerRing); } } VPFPrimitiveData.Ring[] innerRings = new VPFPrimitiveData.Ring[innerRingList.size()]; innerRingList.toArray(innerRings); faceInfo[VPFBufferedRecordData.indexFromId(faceId)] = new VPFPrimitiveData.FaceInfo( outerRing, innerRings, VPFUtils.getExtent(mbrRow)); } primitiveData.setPrimitiveInfo(VPFConstants.FACE_PRIMITIVE_TABLE, faceInfo); }