/******************************************
* Shape2XML.java
* Uses the NVS shapefile library
* to the read the specified shapefile
* and translate into an XML description
*
*****************************************/
import java.io.*;
import com.nvs.shapefile.*;
import java.util.zip.*;
import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;
import org.apache.xerces.parsers.*;
public class Shape2XML
{
private static String strXMLFile;
private static String strShapefile;
public static void main(String args[])
{
if(args.length < 2)
{
System.out.println("Usage: XML2Shape <shape_file> <xml_file>");
return;
}
strShapefile = args[0];
strXMLFile = args[1];
new Shape2XML();
}
public Shape2XML()
{
Shapefile shp = null;
try
{
shp = new Shapefile(strShapefile);
FileOutputStream fos = new FileOutputStream(strXMLFile);
Element elRoot = new Element("shapefile");
// Set the shape type
switch(shp.getType())
{
case Shapefile.SHAPETYPE_POINT :
elRoot.setAttribute("type", "points");
break;
case Shapefile.SHAPETYPE_POLYLINE :
elRoot.setAttribute("type", "lines");
break;
case Shapefile.SHAPETYPE_POLYGON :
elRoot.setAttribute("type", "polygons");
break;
}
// Write the table
TableDescription tableDesc = shp.getTableDescription();
if(tableDesc != null)
{
elRoot.addContent(translateTable(tableDesc));
}
// Write bounding box
BoundingBox box = shp.getBoundingBox();
if(box != null)
{
elRoot.addContent(translateBox(box));
}
// Write shape objects
Iterator itrShapeObjects = shp.getShapeObjects().iterator();
while(itrShapeObjects.hasNext())
{
ShapeObject obj = (ShapeObject)itrShapeObjects.next();
if(obj.getType() == ShapeObject.POINT)
{
if(obj.getType() != shp.getType())
{
// throw some sort of exception
}
elRoot.addContent(translatePointObject(obj));
}
else if(obj.getType() == ShapeObject.POLYLINE)
{
if(obj.getType() != shp.getType())
{
// throw some sort of exception
}
elRoot.addContent(translateLineObject(obj));
}
else if(obj.getType() == ShapeObject.POLYGON)
{
if(obj.getType() != shp.getType())
{
// throw some sort of exception
}
elRoot.addContent(translatePolygonObject(obj));
}
}
XMLOutputter fmt = new XMLOutputter();
fmt.setIndent(" ");
fmt.setNewlines(true);
DocType xhtml = new DocType("shapefile", "file:shapefile.dtd");
Document doc = new Document(elRoot);
doc.setDocType(xhtml);
fmt.output(doc, fos);
}
catch(Exception e)
{
e.printStackTrace();
}
}
private Element translatePointObject(ShapeObject obj)
{
Element elShape = new Element("shape");
elShape.setAttribute("type", "point");
Point pt = obj.getPoint(0);
Element elPoint = new Element("point");
elPoint.setAttribute("x", String.valueOf(pt.getX()));
elPoint.setAttribute("y", String.valueOf(pt.getY()));
elShape.addContent(elPoint);
Record rec = obj.getRecord();
Iterator itrFields = rec.getFields().iterator();
while(itrFields.hasNext())
{
RecordField recField = (RecordField)itrFields.next();
Element elField = new Element("field");
elField.setAttribute("name", recField.getName().trim());
elField.setAttribute("value", recField.getValue().trim());
elShape.addContent(elField);
}
return elShape;
}
private Element translateLineObject(ShapeObject obj)
{
Element elShape = new Element("shape");
elShape.setAttribute("type", "line");
Iterator itrPoints = obj.getPoints().iterator();
while(itrPoints.hasNext())
{
Point pt = (Point)itrPoints.next();
Element elPoint = new Element("point");
elPoint.setAttribute("x", String.valueOf(pt.getX()));
elPoint.setAttribute("y", String.valueOf(pt.getY()));
elShape.addContent(elPoint);
}
Record rec = obj.getRecord();
Iterator itrFields = rec.getFields().iterator();
while(itrFields.hasNext())
{
RecordField recField = (RecordField)itrFields.next();
Element elField = new Element("field");
elField.setAttribute("name", recField.getName().trim());
elField.setAttribute("value", recField.getValue().trim());
elShape.addContent(elField);
}
return elShape;
}
private Element translatePolygonObject(ShapeObject obj)
{
Element elShape = new Element("shape");
elShape.setAttribute("type", "polygon");
Iterator itrPoints = obj.getPoints().iterator();
while(itrPoints.hasNext())
{
Point pt = (Point)itrPoints.next();
Element elPoint = new Element("point");
elPoint.setAttribute("x", String.valueOf(pt.getX()));
elPoint.setAttribute("y", String.valueOf(pt.getY()));
elShape.addContent(elPoint);
}
Record rec = obj.getRecord();
Iterator itrFields = rec.getFields().iterator();
while(itrFields.hasNext())
{
RecordField recField = (RecordField)itrFields.next();
Element elField = new Element("field");
elField.setAttribute("name", recField.getName().trim());
elField.setAttribute("value", recField.getValue().trim());
elShape.addContent(elField);
}
return elShape;
}
private Element translateBox(BoundingBox box)
{
Element elBox = new Element("bounding-box");
elBox.setAttribute("xmin", String.valueOf(box.getXMin()));
elBox.setAttribute("xmax", String.valueOf(box.getXMax()));
elBox.setAttribute("ymin", String.valueOf(box.getYMin()));
elBox.setAttribute("ymax", String.valueOf(box.getYMax()));
return elBox;
}
private Element translateTable(TableDescription tableDesc)
{
Element elTable = new Element("table");
Iterator itrDescriptors = tableDesc.getTableDescriptors().iterator();
while(itrDescriptors.hasNext())
{
TableDescriptor td = (TableDescriptor)itrDescriptors.next();
Element elTD = new Element("entry");
elTD.setAttribute("name", td.getName().trim());
switch(td.getType())
{
case Shapefile.FIELDTYPE_CHARACTER :
elTD.setAttribute("datatype", "string");
break;
default :
elTD.setAttribute("datatype", "string");
break;
}
elTable.addContent(elTD);
}
return elTable;
}
}