Example #1
0
        /**
         * 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()));
        }
Example #2
0
        //**************************************************************//
        //********************  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()
            {
Example #3
0
        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 }));
        }
Example #4
0
        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);
        }
Example #5
0
        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);
                }
            }
        }
Example #6
0
        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);
        }