/* **********************************************************************
* :vim ts=4 sts=4 sw=4 et ai:
* Copyright 2000 Intevation GmbH
* This class is free software under the GNU LGPL
*
* useful with OpenMap by BBN Technologies, tested with version 3.6.2.
* Add this file to openmap-3.6.2/com/bbn/openmap/layer/vpf/
* and add a line to the Makefile
*
* 20.12.2000 Bernhard Reiter <bernhard@intevation.de>
* version=1.0
* 24.02.2002 Don Dietrick <dietrick@bbn.com>
* version 1.1 updated to work with OpenMap 4.5, added to OpenMap package.
*
* $Id: GenerateVPFProperties.java,v 1.6 2005/08/09 19:29:39 dietrick Exp $
* **********************************************************************
*/
package com.bbn.openmap.layer.vpf;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import com.bbn.openmap.io.FormatException;
import com.bbn.openmap.util.Debug;
/**
* This class will print out some basic information about a VPF database,
* suitable for inclusion into the openmap.properties file.
*
* <pre>
*
* Usage:
* java com.bbn.openmap.layer.vpf.GenerateVPFproperties /path/to/vpf/database
*
* </pre>
*
* It will then print out VPFlayer descriptions which you can use to view the
* VPF layers with the openmap application, to the standard output. There is no
* GUI.
*
* If you add the output to the openmap.properties files, pay attention to the
* Summary: lines. They make it easy to add all the layernames to the recognised
* ones.
*
*/
public class GenerateVPFProperties
extends DescribeDB {
static String rootpath;
/**
* The main program. Takes path arguments, and prints the DB it finds
*
* @param args the paths to print
*/
public static void main(String[] args)
throws FormatException {
Debug.init();
if (args.length == 0) {
Debug.output("Usage: java com.bbn.openmap.layer.vpf.GenerateVPFProperties <path to vpf database directory> <path to vpf database directory> ...");
System.exit(0);
}
for (int argsi = 0; argsi < args.length; argsi++) {
rootpath = args[argsi];
LibrarySelectionTable lst = new LibrarySelectionTable(rootpath);
if (Debug.debugging("vpf")) {
Debug.output("Path to database: " + rootpath);
Debug.output("Database Name: " + lst.getDatabaseName());
}
println("### Generated openmap.properties for");
println("# VPF Data at: " + rootpath);
println("# Description: " + lst.getDatabaseDescription());
List<String> libraries = lst.getLibraryNames();
if (Debug.debugging("vpf")) {
print("Database Libraries: ");
for (String libraryName : libraries) {
print(libraryName, " ");
}
println();
println();
}
for (String libraryName : libraries) {
String prefix = lst.getDatabaseName() + "_" + libraryName;
println("# Library: " + prefix);
printLibrary(prefix, lst.getCAT(libraryName));
println();
}
}
}
/**
* Prints a VPF Library
*
* @param prefix lines get printed with this prefix
* @param cat the CoverageAttributeTable (Library) to print
*/
public static void printLibrary(String prefix, CoverageAttributeTable cat) {
StringBuffer printedlayers = new StringBuffer();
String printedlayername = null;
if (cat == null) {
System.err.println(prefix + "Library doesn't exist");
return;
}
String[] coverages = cat.getCoverageNames();
if (Debug.debugging("vpf")) {
Debug.output(prefix + "uses " + (cat.isTiledData() ? "tiled" : "untiled") + " data");
}
for (int i = 0; i < coverages.length; i++) {
printedlayername = printCoverageProperties(prefix, cat, coverages[i]);
if (printedlayername != null) {
printedlayers.append(" ").append(printedlayername);
}
}
println("# Summary:" + printedlayers);
}
/**
* Prints a VPF Coverage
*
* @param prefix this will be the prefix of the generated layer name
* @param covname the name of the coverage to print
* @param cat the CoverageAttributeTable to get the Coverage from
*/
public static String printCoverageProperties(String prefix, CoverageAttributeTable cat, String covname) {
String layername = prefix + "_" + covname;
List<Object> text_features = new ArrayList<Object>();
List<Object> edge_features = new ArrayList<Object>();
List<Object> area_features = new ArrayList<Object>();
List<Object> point_features = new ArrayList<Object>();
// add topology level
CoverageTable ct = cat.getCoverageTable(covname);
String path = ct.getDataPath();
String fcaPath = path + "/fca";
File fca = new File(fcaPath);
if (!fca.exists()) {
fcaPath = path + "/fca.";
fca = new File(fcaPath);
}
if (!fca.canRead()) {
println();
return null;
}
try {
DcwRecordFile fcadesc = new DcwRecordFile(fcaPath);
int fclass = fcadesc.whatColumn("fclass");
int type = fcadesc.whatColumn("type");
// int descr = fcadesc.whatColumn("descr");
List<Object> v = new ArrayList<Object>();
while (fcadesc.parseRow(v)) {
String name = (String) v.get(fclass);
String t = (String) v.get(type);
// String desc = (String) v.get(descr);
// String tstring = "[unknown] ";
if (t.equals("T")) {
text_features.add(name);
} else if (t.equals("L")) {
edge_features.add(name);
} else if (t.equals("A")) {
area_features.add(name);
} else if (t.equals("P")) {
point_features.add(name);
}
}
} catch (FormatException fe) {
// nevermind, skip it
}
// only print something, if we really found features
if (!(text_features.isEmpty() && edge_features.isEmpty() && area_features.isEmpty() && point_features.isEmpty())) {
println("### VPF " + cat.getCoverageDescription(covname) + " Layer");
println(layername + ".class=com.bbn.openmap.layer.vpf.VPFLayer");
println(layername + ".prettyName=" + "VPF " + cat.getCoverageDescription(covname) + " " + prefix);
println(layername + ".vpfPath=" + rootpath);
println(layername + ".coverageType=" + covname);
println(layername + ".featureTypes=" + "area edge text point");
printFeatures("text", text_features, layername);
printFeatures("edge", edge_features, layername);
printFeatures("area", area_features, layername);
printFeatures("point", point_features, layername);
println();
} else {
return null;
}
return layername;
}
/**
* Print some featureclass names
*/
public static void printFeatures(String fname, List<Object> features, String layername) {
if (!features.isEmpty()) {
print(layername + "." + fname + "=");
for (Object obj : features) {
print(obj.toString());
}
println();
}
}
}