package org.jgrasstools.gears.modules;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.List;
import org.jgrasstools.gears.io.disktree.IDiskTree;
import org.jgrasstools.gears.utils.HMTestCase;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.index.quadtree.Quadtree;
import com.vividsolutions.jts.io.WKTReader;
/**
* Test {@link IDiskTree} reader and writer.
*
* @author Andrea Antonello (www.hydrologis.com)
*/
public class TestDiskTreeIO extends HMTestCase {
// public void testDiskTreeRead() throws Exception {
// DiskTreeReader r = new DiskTreeReader("D:/TMP/milano/geometries.qjts");
// long t1 = System.currentTimeMillis();
// Quadtree readIndex = r.readIndex();
// long t2 = System.currentTimeMillis();
// System.out.println((t2 - t1));
//
// List queryAll = readIndex.queryAll();
// long t3 = System.currentTimeMillis();
// System.out.println((t3 - t2));
//
// long[] o = (long[]) queryAll.get(300);
// long t4 = System.currentTimeMillis();
// System.out.println((t4 - t3));
//
// Geometry pickGeometry = r.pickGeometry(o[0], o[1]);
// Object userData = pickGeometry.getUserData();
// long t5 = System.currentTimeMillis();
// System.out.println((t5 - t4));
// System.out.println(pickGeometry);
// System.out.println(userData);
//
// }
// public void testDiskTreeWrite() throws Exception {
// SimpleFeatureCollection readVector = OmsVectorReader.readVector("D:/TMP/milano/localita.shp");
// List<FeatureMate> mates = FeatureUtilities.featureCollectionToMatesList(readVector);
//
// DiskTreeWriter w = new DiskTreeWriter("D:/TMP/milano/geometries_buffer0_simpl000002.qjts");
//
// List<Geometry> geoms = new ArrayList<Geometry>();
// for( FeatureMate featureMate : mates ) {
// String id = featureMate.getAttribute("DI_ID", String.class);
// String name = featureMate.getAttribute("DI_NAME", String.class);
// String idStr = id + "@" + name;
//
// Geometry geometry = featureMate.getGeometry();
//
// int n = geometry.getNumGeometries();
// for( int i = 0; i < n; i++ ) {
// Geometry geometryN = geometry.getGeometryN(i);
// DouglasPeuckerSimplifier dpSimplifier = new DouglasPeuckerSimplifier(geometryN);
// dpSimplifier.setDistanceTolerance(0.000002);
// geometryN = dpSimplifier.getResultGeometry();
//
// geometryN.setUserData(idStr);
// geoms.add(geometryN);
// }
//
// // geometry = geometry.buffer(0);
// // DouglasPeuckerSimplifier dpSimplifier = new DouglasPeuckerSimplifier(geometry);
// // dpSimplifier.setDistanceTolerance(0.00002);
// // geometry = dpSimplifier.getResultGeometry();
//
// // geometry.setUserData(idStr);
// // geoms.add(geometry);
// }
//
// Geometry[] array = geoms.toArray(new Geometry[0]);
//
// w.writeGeometries(array);
//
// SimpleFeatureCollection newCollection = new DefaultFeatureCollection();
// SimpleFeatureTypeBuilder b = new SimpleFeatureTypeBuilder();
// b.setName("typename");
// b.setCRS(DefaultGeographicCRS.WGS84);
// b.add("the_geom", MultiPolygon.class);
// SimpleFeatureType type = b.buildFeatureType();
// SimpleFeatureBuilder builder = new SimpleFeatureBuilder(type);
//
// for( Geometry g : array ) {
// Object[] values = new Object[]{g};
// builder.addAll(values);
// SimpleFeature feature = builder.buildFeature(null);
// newCollection.add(feature);
// }
//
// OmsVectorWriter.writeVector("D:/TMP/milano/geometries_buffer0_simpl000002.shp", newCollection);
//
// }
public void testSerialization() throws Exception {
WKTReader r = new WKTReader();
Geometry pol = r.read("POLYGON ((210 350, 230 310, 290 350, 290 350, 210 350))");
pol.setUserData(new Integer(1));
Envelope polEnvelope = pol.getEnvelopeInternal();
Geometry line = r.read("LINESTRING (50 380, 90 210, 180 160, 240 40, 240 40)");
line.setUserData(new Integer(2));
Envelope lineEnvelope = line.getEnvelopeInternal();
Geometry point = r.read("POINT (130 120)");
point.setUserData(new Integer(3));
Envelope pointEnvelope = point.getEnvelopeInternal();
pointEnvelope.expandBy(0.000001);
Geometry[] geoms = {point, line, pol};
// put geometries serialized in quadtree
Quadtree tree = new Quadtree();
for( int i = 0; i < geoms.length; i++ ) {
Geometry geometry = geoms[i];
byte[] geomBytes = serialize(geometry);
Envelope envelope = geometry.getEnvelopeInternal();
tree.insert(envelope, geomBytes);
}
// serialize tree
byte[] serializedTree = serialize(tree);
// deserialize tree
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(serializedTree));
Quadtree deserializedTree = (Quadtree) in.readObject();
// query the polygon envelope and extract the geometries
List geomList = deserializedTree.query(polEnvelope);
assertTrue(geomList.size() == 2);
byte[] polygonGeomObj = (byte[]) geomList.get(0);
in = new ObjectInputStream(new ByteArrayInputStream(polygonGeomObj));
Geometry geometry = (Geometry) in.readObject();
Integer userData = (Integer) geometry.getUserData();
if (userData == 2) {
assertEquals("LineString", geometry.getGeometryType());
}
if (userData == 1) {
assertEquals("Polygon", geometry.getGeometryType());
}
}
private static byte[] serialize( Object obj ) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(obj);
out.close();
byte[] treeBytes = bos.toByteArray();
return treeBytes;
}
}