/*
* Copyright 2011 by Mark Coletti, Keith Sullivan, Sean Luke, and
* George Mason University Mason University Licensed under the Academic
* Free License version 3.0
*
* See the file "LICENSE" for more information
*
* $Id$
*
*/
package sim.io.geo;
import com.vividsolutions.jts.geom.GeometryCollection;
import com.vividsolutions.jts.io.WKTReader;
import java.io.FileNotFoundException;
import java.net.URL;
import java.util.Map;
import java.util.TreeMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.gdal.ogr.*;
import sim.field.geo.GeomVectorField;
import sim.util.Bag;
import sim.util.geo.AttributeValue;
import sim.util.geo.MasonGeometry;
/**
* OGRImportor uses the OGR JNI interface to read geospatial data into the GeomVectorField.
*
*/
public class OGRImporter
{
/**
* @param inputResource for the data
* @param field into which to place read in data
* @param masked specifies attributes we want
* @throws FileNotFoundException
*/
public static void read(final URL inputResource, GeomVectorField field, Bag masked) throws FileNotFoundException
{
// register all the data format drivers
ogr.RegisterAll();
DataSource dataSource = ogr.Open(inputResource.toString(), false);
if (dataSource == null)
{
throw new FileNotFoundException(inputResource + " not found");
}
Driver driver = dataSource.GetDriver();
if (driver == null)
{
throw new FileNotFoundException(inputResource + " not found");
}
// System.out.println("INFO: Open of `" + input + "'\n"
// + " using driver `" + driver.GetName() + "' successful.");
for (int i = 0; i < dataSource.GetLayerCount(); i++)
{
Layer layer = dataSource.GetLayer(i);
if (layer == null)
{
System.out.println("FAILURE: Couldn't fetch advertised layer " + i + "!");
return;
} else
{
readLayer(layer, field, masked);
}
}
}
private static void readLayer(Layer layer, GeomVectorField field, Bag masked)
{
FeatureDefn poDefn = layer.GetLayerDefn();
if (poDefn.GetGeomType() != ogr.wkbLineString
&& poDefn.GetGeomType() != ogr.wkbPolygon
&& poDefn.GetGeomType() != ogr.wkbPoint)
{
System.out.println("Unsupported type: " + poDefn.GetGeomType());
return;
}
WKTReader rdr = new WKTReader();
String wktString = null;
Feature feature = null;
com.vividsolutions.jts.geom.Geometry geometry = null;
feature = layer.GetNextFeature();
while (feature != null)
{
Geometry ogrGeometry = feature.GetGeometryRef();
if (ogrGeometry == null)
{
feature = layer.GetNextFeature();
continue;
}
wktString = ogrGeometry.ExportToWkt();
try
{
Map<String, AttributeValue> myAttributeInfo = readAttributes(feature, masked);
geometry = rdr.read(wktString);
if (geometry instanceof GeometryCollection)
{
GeometryCollection gc = (GeometryCollection) geometry;
for (int i = 0; i < gc.getNumGeometries(); i++)
{
com.vividsolutions.jts.geom.Geometry geom = gc.getGeometryN(i);
MasonGeometry mg = new MasonGeometry(geom);
mg.addAttributes(myAttributeInfo);
field.addGeometry(mg);
}
} else
{
MasonGeometry mg = new MasonGeometry(geometry);
mg.addAttributes(myAttributeInfo);
field.addGeometry(mg);
}
} catch (Exception ex)
{
Logger.getLogger(OGRImporter.class.getName()).log(Level.SEVERE, null, ex);
}
feature.delete(); // free up resources
feature = layer.GetNextFeature();
}
}
public static Map<String, AttributeValue> readAttributes(Feature feature, Bag masked)
{
String key = "";
Object val;
TreeMap<String, AttributeValue> fields = new TreeMap<String, AttributeValue>();
for (int i = 0; i < feature.GetFieldCount(); i++)
{
FieldDefn fieldDef = feature.GetFieldDefnRef(i);
key = fieldDef.GetNameRef();
if (masked == null || masked.contains(key))
{
int fieldType = fieldDef.GetFieldType();
if (fieldType == ogrConstants.OFTString)
{
val = feature.GetFieldAsString(i);
} else if (fieldType == ogrConstants.OFTInteger)
{
val = new Integer(feature.GetFieldAsInteger(i));
} else if (fieldType == ogrConstants.OFTReal)
{
val = new Double(feature.GetFieldAsDouble(i));
}
else // If it's not a number or a string, just convert to string
{
val = feature.GetFieldAsString(i);
}
AttributeValue attr = new AttributeValue(val);
// attr.setValue(val);
fields.put(key, attr);
}
}
return fields;
}
}